4) g.setColor(1, 1, 1);
- else g.setColor(0, 0, 0);
- g.setFont("Vector", bh*(b>8 ? (b>64 ? (b>512 ? 0.32 : 0.4) : 0.6) : 0.7));
- if (b>0) g.drawString(b.toString(), xo+(x+0.5)*bw+1, yo+(y+0.5)*bh);
- }
- }
- shift(d) { // +/-1: shift x, +/- 2: shift y
- var crc = E.CRC32(this.b.toString());
- if (d==-1) { // shift x left
- for (y=0; y<4; ++y) {
- for (x=2; x>=0; x--)
- if (this.b[y][x]==0) {
- for (i=x; i<3; i++) this.b[y][i] = this.b[y][i+1];
- this.b[y][3] = 0;
- }
- for (x=0; x<3; ++x)
- if (this.b[y][x]==this.b[y][x+1]) {
- this.score += 2*this.b[y][x];
- this.b[y][x] += this.b[y][x+1];
- for (j=x+1; j<3; ++j) this.b[y][j] = this.b[y][j+1];
+{ // wrap app in scope to prevent minifier from removing the class definition completely
+ class TwoK {
+ constructor() {
+ this.b = Array(4).fill().map(() => Array(4).fill(0));
+ this.score = 0;
+ this.cmap = {0: "#caa", 2:"#ccc", 4: "#bcc", 8: "#ba6", 16: "#e61", 32: "#d20", 64: "#d00", 128: "#da0", 256: "#ec0", 512: "#dd0"};
+ }
+ drawBRect(x1, y1, x2, y2, th, c, cf, fill) {
+ g.setColor(c);
+ for (i=0; i
4) g.setColor(1, 1, 1);
+ else g.setColor(0, 0, 0);
+ g.setFont("Vector", bh*(b>8 ? (b>64 ? (b>512 ? 0.32 : 0.4) : 0.6) : 0.7));
+ if (b>0) g.drawString(b.toString(), xo+(x+0.5)*bw+1, yo+(y+0.5)*bh);
+ }
+ }
+ shift(d) { // +/-1: shift x, +/- 2: shift y
+ var crc = E.CRC32(this.b.toString());
+ if (d==-1) { // shift x left
+ for (y=0; y<4; ++y) {
+ for (x=2; x>=0; x--)
+ if (this.b[y][x]==0) {
+ for (i=x; i<3; i++) this.b[y][i] = this.b[y][i+1];
this.b[y][3] = 0;
- }
+ }
+ for (x=0; x<3; ++x)
+ if (this.b[y][x]==this.b[y][x+1]) {
+ this.score += 2*this.b[y][x];
+ this.b[y][x] += this.b[y][x+1];
+ for (j=x+1; j<3; ++j) this.b[y][j] = this.b[y][j+1];
+ this.b[y][3] = 0;
+ }
+ }
}
- }
- else if (d==1) { // shift x right
- for (y=0; y<4; ++y) {
- for (x=1; x<4; x++)
- if (this.b[y][x]==0) {
- for (i=x; i>0; i--) this.b[y][i] = this.b[y][i-1];
- this.b[y][0] = 0;
- }
- for (x=3; x>0; --x)
- if (this.b[y][x]==this.b[y][x-1]) {
- this.score += 2*this.b[y][x];
- this.b[y][x] += this.b[y][x-1] ;
- for (j=x-1; j>0; j--) this.b[y][j] = this.b[y][j-1];
- this.b[y][0] = 0;
- }
+ else if (d==1) { // shift x right
+ for (y=0; y<4; ++y) {
+ for (x=1; x<4; x++)
+ if (this.b[y][x]==0) {
+ for (i=x; i>0; i--) this.b[y][i] = this.b[y][i-1];
+ this.b[y][0] = 0;
+ }
+ for (x=3; x>0; --x)
+ if (this.b[y][x]==this.b[y][x-1]) {
+ this.score += 2*this.b[y][x];
+ this.b[y][x] += this.b[y][x-1] ;
+ for (j=x-1; j>0; j--) this.b[y][j] = this.b[y][j-1];
+ this.b[y][0] = 0;
+ }
+ }
}
- }
- else if (d==-2) { // shift y down
- for (x=0; x<4; ++x) {
- for (y=1; y<4; y++)
- if (this.b[y][x]==0) {
- for (i=y; i>0; i--) this.b[i][x] = this.b[i-1][x];
- this.b[0][x] = 0;
- }
- for (y=3; y>0; y--)
- if (this.b[y][x]==this.b[y-1][x] || this.b[y][x]==0) {
- this.score += 2*this.b[y][x];
- this.b[y][x] += this.b[y-1][x];
- for (j=y-1; j>0; j--) this.b[j][x] = this.b[j-1][x];
- this.b[0][x] = 0;
- }
+ else if (d==-2) { // shift y down
+ for (x=0; x<4; ++x) {
+ for (y=1; y<4; y++)
+ if (this.b[y][x]==0) {
+ for (i=y; i>0; i--) this.b[i][x] = this.b[i-1][x];
+ this.b[0][x] = 0;
+ }
+ for (y=3; y>0; y--)
+ if (this.b[y][x]==this.b[y-1][x] || this.b[y][x]==0) {
+ this.score += 2*this.b[y][x];
+ this.b[y][x] += this.b[y-1][x];
+ for (j=y-1; j>0; j--) this.b[j][x] = this.b[j-1][x];
+ this.b[0][x] = 0;
+ }
+ }
}
- }
- else if (d==2) { // shift y up
- for (x=0; x<4; ++x) {
- for (y=2; y>=0; y--)
- if (this.b[y][x]==0) {
- for (i=y; i<3; i++) this.b[i][x] = this.b[i+1][x];
- this.b[3][x] = 0;
- }
- for (y=0; y<3; ++y)
- if (this.b[y][x]==this.b[y+1][x] || this.b[y][x]==0) {
- this.score += 2*this.b[y][x];
- this.b[y][x] += this.b[y+1][x];
- for (j=y+1; j<3; ++j) this.b[j][x] = this.b[j+1][x];
- this.b[3][x] = 0;
- }
+ else if (d==2) { // shift y up
+ for (x=0; x<4; ++x) {
+ for (y=2; y>=0; y--)
+ if (this.b[y][x]==0) {
+ for (i=y; i<3; i++) this.b[i][x] = this.b[i+1][x];
+ this.b[3][x] = 0;
+ }
+ for (y=0; y<3; ++y)
+ if (this.b[y][x]==this.b[y+1][x] || this.b[y][x]==0) {
+ this.score += 2*this.b[y][x];
+ this.b[y][x] += this.b[y+1][x];
+ for (j=y+1; j<3; ++j) this.b[j][x] = this.b[j+1][x];
+ this.b[3][x] = 0;
+ }
+ }
}
+ return (E.CRC32(this.b.toString())!=crc);
+ }
+ addDigit() {
+ var d = Math.random()>0.9 ? 4 : 2;
+ var id = Math.floor(Math.random()*16);
+ while (this.b[Math.floor(id/4)][id%4] > 0) id = Math.floor(Math.random()*16);
+ this.b[Math.floor(id/4)][id%4] = d;
}
- return (E.CRC32(this.b.toString())!=crc);
}
- addDigit() {
- var d = Math.random()>0.9 ? 4 : 2;
- var id = Math.floor(Math.random()*16);
- while (this.b[Math.floor(id/4)][id%4] > 0) id = Math.floor(Math.random()*16);
- this.b[Math.floor(id/4)][id%4] = d;
- }
-}
-function dragHandler(e) {
- if (e.b && (Math.abs(e.dx)>7 || Math.abs(e.dy)>7)) {
- var res = false;
- if (Math.abs(e.dx)>Math.abs(e.dy)) {
- if (e.dx>0) res = twok.shift(1);
- if (e.dx<0) res = twok.shift(-1);
+ function dragHandler(e) {
+ if (e.b && (Math.abs(e.dx)>7 || Math.abs(e.dy)>7)) {
+ var res = false;
+ if (Math.abs(e.dx)>Math.abs(e.dy)) {
+ if (e.dx>0) res = twok.shift(1);
+ if (e.dx<0) res = twok.shift(-1);
+ }
+ else {
+ if (e.dy>0) res = twok.shift(-2);
+ if (e.dy<0) res = twok.shift(2);
+ }
+ if (res) twok.addDigit();
+ twok.render();
}
- else {
- if (e.dy>0) res = twok.shift(-2);
- if (e.dy<0) res = twok.shift(2);
- }
- if (res) twok.addDigit();
- twok.render();
}
-}
-function swipeHandler() {
-
-}
+ function swipeHandler() {
+
+ }
-function buttonHandler() {
-
-}
+ function buttonHandler() {
+
+ }
-var twok = new TwoK();
-twok.addDigit(); twok.addDigit();
-twok.render();
-if (process.env.HWVERSION==2) Bangle.on("drag", dragHandler);
-if (process.env.HWVERSION==1) {
- Bangle.on("swipe", (e) => { res = twok.shift(e); if (res) twok.addDigit(); twok.render(); });
- setWatch(() => { res = twok.shift(2); if (res) twok.addDigit(); twok.render(); }, BTN1, {repeat: true});
- setWatch(() => { res = twok.shift(-2); if (res) twok.addDigit(); twok.render(); }, BTN3, {repeat: true});
-}
+ var twok = new TwoK();
+ twok.addDigit(); twok.addDigit();
+ twok.render();
+ if (process.env.HWVERSION==2) Bangle.on("drag", dragHandler);
+ if (process.env.HWVERSION==1) {
+ Bangle.on("swipe", (e) => { res = twok.shift(e); if (res) twok.addDigit(); twok.render(); });
+ setWatch(() => { res = twok.shift(2); if (res) twok.addDigit(); twok.render(); }, BTN1, {repeat: true});
+ setWatch(() => { res = twok.shift(-2); if (res) twok.addDigit(); twok.render(); }, BTN3, {repeat: true});
+ }
+}
\ No newline at end of file
diff --git a/apps/2047pp/ChangeLog b/apps/2047pp/ChangeLog
index a1f88e5ec..9436289ae 100644
--- a/apps/2047pp/ChangeLog
+++ b/apps/2047pp/ChangeLog
@@ -1,2 +1,3 @@
0.01: New app!
0.02: Better support for watch themes
+0.03: Workaround minifier bug
\ No newline at end of file
diff --git a/apps/2047pp/metadata.json b/apps/2047pp/metadata.json
index 033354ac6..ac4dc70bd 100644
--- a/apps/2047pp/metadata.json
+++ b/apps/2047pp/metadata.json
@@ -2,7 +2,7 @@
"name": "2047pp",
"shortName":"2047pp",
"icon": "app.png",
- "version":"0.02",
+ "version":"0.03",
"description": "Bangle version of a tile shifting game",
"supports" : ["BANGLEJS","BANGLEJS2"],
"allow_emulator": true,
diff --git a/apps/90sclk/ChangeLog b/apps/90sclk/ChangeLog
index 057d6ff73..9718a652d 100644
--- a/apps/90sclk/ChangeLog
+++ b/apps/90sclk/ChangeLog
@@ -1,3 +1,4 @@
0.01: New App!
0.02: Fullscreen settings.
0.03: Tell clock widgets to hide.
+0.04: Use widget_utils.
diff --git a/apps/90sclk/app.js b/apps/90sclk/app.js
index 351c235e0..63a48b27a 100644
--- a/apps/90sclk/app.js
+++ b/apps/90sclk/app.js
@@ -1,6 +1,7 @@
const SETTINGS_FILE = "90sclk.setting.json";
const locale = require('locale');
const storage = require('Storage');
+const widget_utils = require('widget_utils');
/*
@@ -109,7 +110,7 @@ function draw() {
// Draw widgets if not fullscreen
if(settings.fullscreen){
- for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
+ widget_utils.hide();
} else {
Bangle.drawWidgets();
}
diff --git a/apps/90sclk/metadata.json b/apps/90sclk/metadata.json
index 59b627427..bfbb6b080 100644
--- a/apps/90sclk/metadata.json
+++ b/apps/90sclk/metadata.json
@@ -1,7 +1,7 @@
{
"id": "90sclk",
"name": "90s Clock",
- "version": "0.03",
+ "version": "0.04",
"description": "A 90s style watch-face",
"readme": "README.md",
"icon": "app.png",
diff --git a/apps/agpsdata/ChangeLog b/apps/agpsdata/ChangeLog
index d900841d7..303fc7583 100644
--- a/apps/agpsdata/ChangeLog
+++ b/apps/agpsdata/ChangeLog
@@ -5,3 +5,4 @@
0.04: Write AGPS data chunks with delay to improve reliability
0.05: Show last success date
Do not start A-GPS update automatically
+0.06: Switch off gps after updating
\ No newline at end of file
diff --git a/apps/agpsdata/lib.js b/apps/agpsdata/lib.js
index 34608a5c6..4610331f6 100644
--- a/apps/agpsdata/lib.js
+++ b/apps/agpsdata/lib.js
@@ -10,20 +10,24 @@ readSettings();
function setAGPS(b64) {
return new Promise(function(resolve, reject) {
- var initCommands = "Bangle.setGPSPower(1);\n"; // turn GPS on
const gnsstype = settings.gnsstype || 1; // default GPS
- initCommands += `Serial1.println("${CASIC_CHECKSUM("$PCAS04," + gnsstype)}")\n`; // set GNSS mode
// What about:
// NAV-TIMEUTC (0x01 0x10)
// NAV-PV (0x01 0x03)
// or AGPS.zip uses AID-INI (0x0B 0x01)
-
- eval(initCommands);
+ Bangle.setGPSPower(1,"agpsdata"); // turn GPS on
+ Serial1.println(CASIC_CHECKSUM("$PCAS04," + gnsstype)); // set GNSS mode
try {
- writeChunks(atob(b64), resolve);
+ writeChunks(atob(b64), ()=>{
+ setTimeout(()=>{
+ Bangle.setGPSPower(0,"agpsdata");
+ resolve();
+ }, 1000);
+ });
} catch (e) {
console.log("error:", e);
+ Bangle.setGPSPower(0,"agpsdata");
reject();
}
});
@@ -36,9 +40,8 @@ function writeChunks(bin, resolve) {
setTimeout(function() {
if (chunkI < bin.length) {
var chunk = bin.substr(chunkI, chunkSize);
- js = `Serial1.write(atob("${btoa(chunk)}"))\n`;
- eval(js);
-
+ Serial1.write(atob(btoa(chunk)));
+
chunkI += chunkSize;
writeChunks(bin, resolve);
} else {
diff --git a/apps/agpsdata/metadata.json b/apps/agpsdata/metadata.json
index 7f0b53217..446661045 100644
--- a/apps/agpsdata/metadata.json
+++ b/apps/agpsdata/metadata.json
@@ -2,7 +2,7 @@
"name": "A-GPS Data Downloader App",
"shortName":"A-GPS Data",
"icon": "agpsdata.png",
- "version":"0.05",
+ "version":"0.06",
"description": "Once installed, this app allows you to download assisted GPS (A-GPS) data directly to your Bangle.js **via Gadgetbridge on an Android phone** when you run the app. If you just want to upload the latest AGPS data from this app loader, please use the `Assisted GPS Update (AGPS)` app.",
"tags": "boot,tool,assisted,gps,agps,http",
"allow_emulator":true,
diff --git a/apps/android/ChangeLog b/apps/android/ChangeLog
index 1e0c14a5e..db5c0b057 100644
--- a/apps/android/ChangeLog
+++ b/apps/android/ChangeLog
@@ -19,3 +19,4 @@
If connected to Gadgetbridge, allow GPS forwarding from phone (Gadgetbridge code still not merged)
0.19: Add automatic translation for a couple of strings.
0.20: Fix wrong event used for forwarded GPS data from Gadgetbridge and add mapper to map longitude value correctly.
+0.21: Fix broken 'Messages' button in menu
diff --git a/apps/android/metadata.json b/apps/android/metadata.json
index 883a821a4..63fd7759a 100644
--- a/apps/android/metadata.json
+++ b/apps/android/metadata.json
@@ -2,7 +2,7 @@
"id": "android",
"name": "Android Integration",
"shortName": "Android",
- "version": "0.20",
+ "version": "0.21",
"description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.",
"icon": "app.png",
"tags": "tool,system,messages,notifications,gadgetbridge",
diff --git a/apps/android/settings.js b/apps/android/settings.js
index 3e04e0f9d..0abb32249 100644
--- a/apps/android/settings.js
+++ b/apps/android/settings.js
@@ -1,6 +1,6 @@
(function(back) {
-
+
function gb(j) {
Bluetooth.println(JSON.stringify(j));
@@ -36,7 +36,7 @@
updateSettings();
}
},
- /*LANG*/"Messages" : ()=>require("message").openGUI(),
+ /*LANG*/"Messages" : ()=>require("messages").openGUI(),
};
E.showMenu(mainmenu);
})
diff --git a/apps/assistedgps/ChangeLog b/apps/assistedgps/ChangeLog
index 739ccf915..ff2de6f67 100644
--- a/apps/assistedgps/ChangeLog
+++ b/apps/assistedgps/ChangeLog
@@ -1,3 +1,4 @@
0.01: New App!
0.02: Update to work with Bangle.js 2
0.03: Select GNSS systems to use for Bangle.js 2
+0.04: Now turns GPS off after upload
diff --git a/apps/assistedgps/custom.html b/apps/assistedgps/custom.html
index 80d68a71f..75a4ecf32 100644
--- a/apps/assistedgps/custom.html
+++ b/apps/assistedgps/custom.html
@@ -133,7 +133,7 @@
function jsFromBase64(b64) {
var bin = atob(b64);
var chunkSize = 128;
- var js = "\x10Bangle.setGPSPower(1);\n"; // turn GPS on
+ var js = "\x10Bangle.setGPSPower(1,'agps');\n"; // turn GPS on
if (isB1) { // UBLOX
//js += `\x10Bangle.on('GPS-raw',function (d) { if (d.startsWith("\\xB5\\x62\\x05\\x01")) Terminal.println("GPS ACK"); else if (d.startsWith("\\xB5\\x62\\x05\\x00")) Terminal.println("GPS NACK"); })\n`;
//js += "\x10var t=getTime()+1;while(t>getTime());\n"; // wait 1 sec
@@ -158,6 +158,7 @@
var chunk = bin.substr(i,chunkSize);
js += `\x10Serial1.write(atob("${btoa(chunk)}"))\n`;
}
+ js = "\x10setTimeout(() => Bangle.setGPSPower(0,'agps'), 1000);\n"; // turn GPS off after a delay
return js;
}
diff --git a/apps/assistedgps/metadata.json b/apps/assistedgps/metadata.json
index 4c91dcd35..ac9fe5725 100644
--- a/apps/assistedgps/metadata.json
+++ b/apps/assistedgps/metadata.json
@@ -1,7 +1,7 @@
{
"id": "assistedgps",
"name": "Assisted GPS Updater (AGPS)",
- "version": "0.03",
+ "version": "0.04",
"description": "Downloads assisted GPS (AGPS) data to Bangle.js for faster GPS startup and more accurate fixes. **No app will be installed**, this just uploads new data to the GPS chip.",
"sortorder": -1,
"icon": "app.png",
diff --git a/apps/berlinc/ChangeLog b/apps/berlinc/ChangeLog
index 9e9c1a6aa..1a0a9c9cf 100644
--- a/apps/berlinc/ChangeLog
+++ b/apps/berlinc/ChangeLog
@@ -4,3 +4,5 @@
0.05: Update *on* the minute rather than every 15 secs
Now show widgets
Make compatible with themes, and Bangle.js 2
+0.06: Enable fastloading
+0.07: Adds fullscreen mode setting
\ No newline at end of file
diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js
index 0dd8ff8ee..9391d2cc1 100644
--- a/apps/berlinc/berlin-clock.js
+++ b/apps/berlinc/berlin-clock.js
@@ -1,32 +1,41 @@
+{
// Berlin Clock see https://en.wikipedia.org/wiki/Mengenlehreuhr
// https://github.com/eska-muc/BangleApps
+
+var settings = require('Storage').readJSON("berlinc.json", true) || {};
const fields = [4, 4, 11, 4];
-const offset = 24;
-const width = g.getWidth() - 2 * offset;
-const height = g.getHeight() - 2 * offset;
-const rowHeight = height / 4;
-var show_date = false;
-var show_time = false;
-var yy = 0;
+let fullscreen = !!settings.fullscreen;
-var rowlights = [];
-var time_digit = [];
+let show_date = false;
+let show_time = false;
+let yy = 0;
+
+let rowlights = [];
+let time_digit = [];
// timeout used to update every minute
-var drawTimeout;
+let drawTimeout;
// schedule a draw for the next minute
-function queueDraw() {
+let queueDraw = () => {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
drawTimeout = undefined;
draw();
}, 60000 - (Date.now() % 60000));
-}
+};
-function draw() {
- g.reset().clearRect(0,24,g.getWidth(),g.getHeight());
+let draw = () => {
+ let width = Math.min(Bangle.appRect.w,Bangle.appRect.h);
+ let height = width;
+ let offset = g.getHeight() - height;
+ let x = Math.floor((g.getWidth() - width)/2);
+
+ if (show_date) height -= 8;
+ let rowHeight = (height - 1) / 4;
+ g.setBgColor(g.theme.bg);
+ g.reset().clearRect(Bangle.appRect);
var now = new Date();
// show date below the clock
@@ -37,7 +46,7 @@ function draw() {
var dateString = `${yr}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`;
var strWidth = g.stringWidth(dateString);
g.setColor(g.theme.fg).setFontAlign(-1,-1);
- g.drawString(dateString, ( g.getWidth() - strWidth ) / 2, height + offset + 4);
+ g.drawString(dateString, ( Bangle.appRect.x + Bangle.appRect.w - strWidth ) / 2, Bangle.appRect.y2 - 5);
}
rowlights[0] = Math.floor(now.getHours() / 5);
@@ -50,15 +59,16 @@ function draw() {
time_digit[2] = Math.floor(now.getMinutes() / 10);
time_digit[3] = now.getMinutes() % 10;
- g.drawRect(offset, offset, width + offset, height + offset);
+ g.setColor(g.theme.fg);
+ g.drawRect(x, offset, x + width - 1, height + offset - 1);
for (row = 0; row < 4; row++) {
nfields = fields[row];
- boxWidth = width / nfields;
+ boxWidth = (width - 1) / nfields;
for (col = 0; col < nfields; col++) {
- x1 = col * boxWidth + offset;
+ x1 = col * boxWidth + x;
y1 = row * rowHeight + offset;
- x2 = (col + 1) * boxWidth + offset;
+ x2 = (col + 1) * boxWidth + x;
y2 = (row + 1) * rowHeight + offset;
g.setColor(g.theme.fg).drawRect(x1, y1, x2, y2);
@@ -84,33 +94,53 @@ function draw() {
queueDraw();
}
-function toggleDate() {
+let toggleDate = () => {
show_date = ! show_date;
draw();
}
-function toggleTime() {
+let toggleTime = () => {
show_time = ! show_time;
draw();
}
-// Stop updates when LCD is off, restart when on
-Bangle.on('lcdPower',on=>{
+let clear = () => {
+ if (drawTimeout) clearTimeout(drawTimeout);
+ drawTimeout = undefined;
+}
+
+let onLcdPower = on => {
if (on) {
draw(); // draw immediately, queue redraw
} else { // stop draw timer
- if (drawTimeout) clearTimeout(drawTimeout);
- drawTimeout = undefined;
+ clear();
}
-});
+}
+
+let cleanup = () => {
+ clear();
+ Bangle.removeListener("lcdPower", onLcdPower);
+ require("widget_utils").show();
+}
+
+// Stop updates when LCD is off, restart when on
+Bangle.on('lcdPower',onLcdPower);
// Show launcher when button pressed, handle up/down
-Bangle.setUI("clockupdown", dir=> {
+Bangle.setUI({mode: "clockupdown", remove: cleanup}, dir=> {
if (dir<0) toggleTime();
if (dir>0) toggleDate();
});
g.clear();
Bangle.loadWidgets();
+
+if (fullscreen){
+ if (process.env.HWVERSION == 2) require("widget_utils").swipeOn();
+ else require("widget_utils").hide();
+}
+
Bangle.drawWidgets();
+
draw();
+}
\ No newline at end of file
diff --git a/apps/berlinc/metadata.json b/apps/berlinc/metadata.json
index 85c42fc47..85567868b 100644
--- a/apps/berlinc/metadata.json
+++ b/apps/berlinc/metadata.json
@@ -1,7 +1,7 @@
{
"id": "berlinc",
"name": "Berlin Clock",
- "version": "0.05",
+ "version": "0.07",
"description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)",
"icon": "berlin-clock.png",
"type": "clock",
@@ -12,6 +12,8 @@
"screenshots": [{"url":"berlin-clock-screenshot.png"}],
"storage": [
{"name":"berlinc.app.js","url":"berlin-clock.js"},
+ {"name":"berlinc.settings.js","url":"settings.js"},
{"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true}
- ]
+ ],
+ "data": [{"name":"berlinc.json"}]
}
diff --git a/apps/berlinc/settings.js b/apps/berlinc/settings.js
new file mode 100644
index 000000000..a1b655a62
--- /dev/null
+++ b/apps/berlinc/settings.js
@@ -0,0 +1,26 @@
+(function(back) {
+ var FILE = "berlinc.json";
+ var settings = Object.assign({
+ fullscreem: false,
+ }, require('Storage').readJSON(FILE, true) || {});
+
+ function writeSettings() {
+ require('Storage').writeJSON(FILE, settings);
+ }
+
+ var mainmenu = {
+ "": {
+ "title": "Berlin clock"
+ },
+ "< Back": () => back(),
+ "Fullscreen": {
+ value: !!settings.fullscreen,
+ onchange: v => {
+ settings.fullscreen = v;
+ writeSettings();
+ }
+ }
+ };
+ E.showMenu(mainmenu);
+
+});
diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog
index 33cd7ef63..8b82f6843 100644
--- a/apps/bwclk/ChangeLog
+++ b/apps/bwclk/ChangeLog
@@ -28,4 +28,5 @@
0.27: Clean out some leftovers in the remove function after switching to
clkinfo.addInteractive that would cause ReferenceError.
0.28: Option to show (1) time only and (2) week of year.
-0.29: use setItem of clockInfoMenu to change the active item
\ No newline at end of file
+0.29: use setItem of clockInfoMenu to change the active item
+0.30: Use widget_utils.
diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js
index c2518361b..de7c7d510 100644
--- a/apps/bwclk/app.js
+++ b/apps/bwclk/app.js
@@ -6,7 +6,7 @@
const locale = require('locale');
const storage = require('Storage');
const clock_info = require("clock_info");
-
+const widget_utils = require("widget_utils");
/************************************************
* Globals
@@ -277,7 +277,7 @@ let drawLock = function() {
let drawWidgets = function() {
if(isFullscreen()){
- for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
+ widget_utils.hide();
} else {
Bangle.drawWidgets();
}
@@ -318,7 +318,7 @@ let lockListenerBw = function(isLocked) {
if(!isLocked && settings.screen.toLowerCase() == "dynamic"){
// If we have to show the widgets again, we load it from our
// cache and not through Bangle.loadWidgets as its much faster!
- for (let wd of WIDGETS) {wd.draw=wd._draw;wd.area=wd._area;}
+ widget_utils.show();
}
draw();
@@ -362,16 +362,13 @@ Bangle.setUI({
kill();
E.removeListener("kill", kill);
g.setTheme(themeBackup);
+ widget_utils.show();
}
});
// Load widgets and draw clock the first time
Bangle.loadWidgets();
-// Cache draw function for dynamic screen to hide / show widgets
-// Bangle.loadWidgets() could also be called later on but its much slower!
-for (let wd of WIDGETS) {wd._draw=wd.draw; wd._area=wd.area;}
-
// Draw first time
draw();
diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json
index a29102bdf..39106c827 100644
--- a/apps/bwclk/metadata.json
+++ b/apps/bwclk/metadata.json
@@ -1,7 +1,7 @@
{
"id": "bwclk",
"name": "BW Clock",
- "version": "0.29",
+ "version": "0.30",
"description": "A very minimalistic clock.",
"readme": "README.md",
"icon": "app.png",
diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog
index 830bc28e8..01a51e094 100644
--- a/apps/circlesclock/ChangeLog
+++ b/apps/circlesclock/ChangeLog
@@ -40,3 +40,4 @@
Now re-adds widgets if they were hidden when fast-loading
0.22: Fixed crash if item has no image and cutting long overflowing text
0.23: Setting circles colours per clkinfo and not position
+0.24: Using suggested color from clock_info if set as default and available
diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js
index e1fc8d846..583763af1 100644
--- a/apps/circlesclock/app.js
+++ b/apps/circlesclock/app.js
@@ -116,11 +116,13 @@ let draw = function() {
queueDraw();
}
-let getCircleColor = function(item, clkmenu) {
+let getCircleColor = function(item, data, clkmenu) {
let colorKey = clkmenu.name;
if(!clkmenu.dynamic) colorKey += "/"+item.name;
colorKey += "_color";
let color = settings[colorKey];
+ //use default color only if no other color is set
+ if(data.color && !color) return data.color;
if (color && color != "") return color;
return g.theme.fg;
}
@@ -137,10 +139,12 @@ let getGradientColor = function(color, percent) {
if (color == "green-red") {
let colorIndex = Math.round(colorList.length * percent);
return colorList[Math.min(colorIndex, colorList.length) - 1] || "#00ff00";
+ //return g.blendColor('#00ff00', '#ff0000', percent); //mostly dithering
}
if (color == "red-green") {
let colorIndex = colorList.length - Math.round(colorList.length * percent);
return colorList[Math.min(colorIndex, colorList.length)] || "#ff0000";
+ //return g.blendColor('#ff0000', '#00ff00', percent);
}
colorList = [
'#0000ff', '#8800ff', '#ff00ff', '#ff0088', '#ff0000'
@@ -148,10 +152,12 @@ let getGradientColor = function(color, percent) {
if (color == "blue-red") {
let colorIndex = Math.round(colorList.length * percent);
return colorList[Math.min(colorIndex, colorList.length) - 1] || "#0000ff";
+ //return g.blendColor('#0000ff', '#ff0000', percent);
}
if (color == "red-blue") {
let colorIndex = colorList.length - Math.round(colorList.length * percent);
return colorList[Math.min(colorIndex, colorList.length)] || "#ff0000";
+ //return g.blendColor('#ff0000', '#0000ff', percent);
}
return color;
}
@@ -177,7 +183,7 @@ let drawEmpty = function(img, w, color) {
let drawCircle = function(index, item, data, clkmenu) {
var w = circlePosX[index-1];
drawCircleBackground(w);
- const color = getCircleColor(item, clkmenu);
+ const color = getCircleColor(item, data, clkmenu);
//drawEmpty(info? info.img : null, w, color);
var img = data.img;
var percent = 1; //fill up if no range
diff --git a/apps/circlesclock/default.json b/apps/circlesclock/default.json
index 9d5b3e242..c343a8131 100644
--- a/apps/circlesclock/default.json
+++ b/apps/circlesclock/default.json
@@ -7,13 +7,10 @@
"Bangle/Steps_color":"#0000ff",
"Bangle/HRM_color":"green-red",
"Bangle/Altitude_color":"#00ff00",
- "Weather/conditionWithTemperature_color":"#ffff00",
- "Weather/condition_color":"#00ffff",
"Weather/humidity_color":"#00ffff",
"Weather/wind_color":"fg",
"Weather/temperature_color":"blue-red",
"Alarms_color":"#00ff00",
- "Agenda_color":"#ff0000",
"circle1colorizeIcon": true,
"circle2colorizeIcon": true,
"circle3colorizeIcon": true,
diff --git a/apps/circlesclock/metadata.json b/apps/circlesclock/metadata.json
index 45b869521..7fc18af1b 100644
--- a/apps/circlesclock/metadata.json
+++ b/apps/circlesclock/metadata.json
@@ -1,7 +1,7 @@
{ "id": "circlesclock",
"name": "Circles clock",
"shortName":"Circles clock",
- "version":"0.23",
+ "version":"0.24",
"description": "A clock with three or four circles for different data at the bottom in a probably familiar style",
"icon": "app.png",
"screenshots": [{"url":"screenshot-dark.png"}, {"url":"screenshot-light.png"}, {"url":"screenshot-dark-4.png"}, {"url":"screenshot-light-4.png"}],
diff --git a/apps/contourclock/ChangeLog b/apps/contourclock/ChangeLog
index 387340d5b..91124f1a6 100644
--- a/apps/contourclock/ChangeLog
+++ b/apps/contourclock/ChangeLog
@@ -8,3 +8,4 @@
0.26: Time formatted to locale
0.27: Fixed the timing code, which sometimes did not update for one minute
0.28: More config options for cleaner look, enabled fast loading
+0.29: Fixed a bug that would leave old font files in storage.
diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js
index 8efa406c6..b88c5817d 100644
--- a/apps/contourclock/app.js
+++ b/apps/contourclock/app.js
@@ -9,9 +9,17 @@
settings.hide=false;
settings.weekday=true;
settings.hideWhenLocked=false;
- settings.date=true; require('Storage').writeJSON("myapp.json", settings);
+ settings.date=true;
+ require('Storage').writeJSON("contourclock.json", settings);
+ }
+ let installedFonts = require('Storage').readJSON("contourclock-install.json") || {};
+ if (installedFonts.n>0) { //New install - check for unused font files
+ for (let n=installedFonts.n; ;n++) {
+ if (require("Storage").read("contourclock-"+n+".json")==undefined) break;
+ require("Storage").erase("contourclock-"+n+".json");
+ }
+ require("Storage").erase("contourclock-install.json");
}
-
let queueDraw = function() {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
@@ -20,7 +28,6 @@
queueDraw();
}, 60000 - (Date.now() % 60000));
};
-
let draw = function() {
var date = new Date();
// Draw day of the week
@@ -32,13 +39,13 @@
if (settings.weekday) g.setFontAlign(0,1).drawString(require("locale").dow(date).toUpperCase(),g.getWidth()/2,g.getHeight()-18);
// Draw Date
if (settings.date) g.setFontAlign(0,1).drawString(require('locale').date(new Date(),1),g.getWidth()/2,g.getHeight());
+ } else {
+ require("widget_utils").hide();
}
require('contourclock').drawClock(settings.fontIndex);
};
-
require("FontTeletext10x18Ascii").add(Graphics);
g.clear();
-
draw();
if (settings.hideWhenLocked) Bangle.on('lock', function (locked) {
if (!locked) require("widget_utils").show();
diff --git a/apps/contourclock/contourclock.settings.js b/apps/contourclock/contourclock.settings.js
index f2a75d9b5..315456cfe 100644
--- a/apps/contourclock/contourclock.settings.js
+++ b/apps/contourclock/contourclock.settings.js
@@ -8,7 +8,7 @@
settings.weekday=true;
settings.date=true;
settings.hideWhenLocked=false;
- require('Storage').writeJSON("myapp.json", settings);
+ require('Storage').writeJSON("contourclock.json", settings);
}
function mainMenu() {
E.showMenu({
diff --git a/apps/contourclock/custom.html b/apps/contourclock/custom.html
index 602182573..6e5f6342c 100644
--- a/apps/contourclock/custom.html
+++ b/apps/contourclock/custom.html
@@ -14,60 +14,54 @@
-
Select Fonts to upload:
+
Select Fonts to upload:
diff --git a/apps/contourclock/font-Dosis.json b/apps/contourclock/font-Dosis.json
deleted file mode 100644
index c206bab7e..000000000
--- a/apps/contourclock/font-Dosis.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name":"Dosis",
- "size":"100",
- "characters":[
- {"width" : "67", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf//////VVVVVVVVVVVVVVf////////1VVVVVVVVVVVX//AAAAAAD//VVVVVVVVVVf/AAAAAAAAA//VVVVVVVVV/wAAAAAAAAAAD/VVVVVVVX/AAAAAAAAAAAAD9VVVVVVX8AAAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAAAAP1VVVVXwAAAAAAAAAAAAAAA/VVVVXwAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAAAD1V8AAAAAAAAP/AAAAAAAAA9V8AAAAAAAD///wAAAAAAAPVfAAAAAAAD/VX/wAAAAAAA9XwAAAAAAP1VVV/AAAAAAAPXwAAAAAAP1VVVV8AAAAAAD18AAAAAAPVVVVVXwAAAAAA9fAAAAAAD1VVVVVfAAAAAAD3wAAAAAD1VVVVVXwAAAAAA98AAAAAA9VVVVVVfAAAAAAPfAAAAAA9VVVVVVXwAAAAAD3wAAAAAPVVVVVVV8AAAAAA98AAAAAD1VVVVVVXwAAAAAP8AAAAAA9VVVVVVV8AAAAAD/AAAAAAPVVVVVVVfAAAAAA/wAAAAAD1VVVVVVXwAAAAAP8AAAAAA9VVVVVVV8AAAAAD/AAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAA9VVX/9VVfAAAAAA/wAAAAAPVVf//9VXwAAAAAP8AAAAAD1VfwAP1V8AAAAAD/AAAAAA9VfAAA9VfAAAAAA/wAAAAAPVXwAAD1XwAAAAAP8AAAAAD1V8AAA9V8AAAAAD/AAAAAA9V8AAAPVfAAAAAA/wAAAAAPVfAAAD1XwAAAAAP8AAAAAD1V8AAA9V8AAAAAD/AAAAAA9VfAAAPVfAAAAAA/wAAAAAPVXwAAD1XwAAAAAP8AAAAAD1V8AAD1V8AAAAAD/AAAAAA9VX8AD1VfAAAAAA/wAAAAAPVVf//1VXwAAAAAP8AAAAAD1VVf/1VV8AAAAAD/AAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAAPVVVVVVVfAAAAAA/wAAAAAD1VVVVVVXwAAAAAP8AAAAAA9VVVVVVV8AAAAAD/AAAAAAPVVVVVVVfAAAAAA98AAAAAD1VVVVVVfAAAAAAPfAAAAAA9VVVVVVXwAAAAAD3wAAAAAPVVVVVVV8AAAAAA98AAAAAA9VVVVVVfAAAAAAPfAAAAAAPVVVVVVfAAAAAAD3wAAAAAA9VVVVVXwAAAAAA98AAAAAAD1VVVVXwAAAAAA9fAAAAAAAPVVVVfwAAAAAAPV8AAAAAAA/VVVfwAAAAAAD1fAAAAAAAD////AAAAAAAA9XwAAAAAAAD///AAAAAAAA9VfAAAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAPVVVVV/AAAAAAAAAAAAAAAPVVVVVX8AAAAAAAAAAAAAAPVVVVVVXwAAAAAAAAAAAAA/VVVVVVVfwAAAAAAAAAAAD/VVVVVVVV/8AAAAAAAAAA/9VVVVVVVVV//wAAAAAAAP/1VVVVVVVVVVf//AAAAA//9VVVVVVVVVVVVV////////VVVVVVVVVVVVVVVX////9VVVVVVVVQ=="},
- {"width" : "36", "buffer":"VVVVVVVX/1VVVVVVVVV///1VVVVVVVf8AP/VVVVVVX/AAAP1VVVVVfwAAAA9VVVVX8AAAAA9VVVV/wAAAAA9VVVX8AAAAAAPVVV/AAAAAAAPVVf8AAAAAAAPVV/AAAAAAAAPVfwAAAAAAAAPV/AAAAAAAAAPXwAAAAAAAAAPfAAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAAAAPfAAAwAAAAAAPfAAP8AAAAAAPX///fAAAAAAPV//1fAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAAPVVVVfAAAAAA9VVVVXwAAAAA9VVVVXwAAAAD9VVVVV/wAAA/1VVVVVf////9VVVVVVVf///VVVVVVVVVVVVVV"},
- {"width" : "65", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/////1VVVVVVVVVVVVVVf///////1VVVVVVVVVVVV//AAAAAD//VVVVVVVVVVV/8AAAAAAAD/1VVVVVVVVV/wAAAAAAAAAP1VVVVVVVVfwAAAAAAAAAAD9VVVVVVVfwAAAAAAAAAAAD/VVVVVVX8AAAAAAAAAAAAA/VVVVVV8AAAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAPVXwAAAAAAAP//AAAAAAAA9VfAAAAAAAP///wAAAAAAA9V8AAAAAAD9VVfwAAAAAAD1fAAAAAAA9VVVXwAAAAAAPV8AAAAAAPVVVVXwAAAAAA9XwAAAAAD1VVVVXwAAAAAA9fAAAAAAPVVVVVfAAAAAAD18AAAAAD1VVVVVfAAAAAAPXwAAAAAPVVVVVV8AAAAAA9fAAAAAA9VVVVVXwAAAAAD18AAAAAD1VVVVVfAAAAAAPXwAAAAAPVVVVVV8AAAAAA9fAAAAAA9VVVVVXwAAAAAD1fAAAAAPVVVVVVfAAAAAAPV8AAAAA9VVVVVXwAAAAAD1V8AAAAPVVVVVVfAAAAAAPVV8AAAP1VVVVVXwAAAAAA9VV////9VVVVVVfAAAAAAD1VV///9VVVVVVXwAAAAAAPVVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVV/AAAAAAAAPVVVVVVVVVVVfwAAAAAAAD1VVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVV/AAAAAAAAA9VVVVVVVVVVfwAAAAAAAAPVVVVVVVVVVXwAAAAAAAAD1VVVVVVVVVX8AAAAAAAAA9VVVVVVVVVV/AAAAAAAAAPVVVVVVVVVVfAAAAAAAAAD1VVVVVVVVVfwAAAAAAAAA9VVVVVVVVVX8AAAAAAAAA/VVVVVVVVVV8AAAAAAAAAP1VVVVVVVVVfAAAAAAAAAD1VVVVVVVVVfwAAAAAAAAD9VVVVVVVVVX8AAAAAAAAA/VVVVVVVVVV8AAAAAAAAA/VVVVVVVVVVfAAAAAAAAAP1VVVVVVVVVXwAAAAAAAAD1VVVVVVVVVV8AAAAAAAAD9VVVVVVVVVVfAAAAAAAAA/VVVVVVVVVVXwAAAAAAAA/VVVVVVVVVVVfAAAAAAAAP1VVVVVVVVVVXwAAAAAAAP1VVVVVVVVVVV8AAAAAAAD9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVVfAAAAAAA////////////1V8AAAAAAA////////////9XwAAAAAAAAAAAAAAAAAAD9fAAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAAD1X/AAAAAAAAAAAAAAAAAAPVV///////////////////1VVf/////////////////9VVVVVVVVVVVVVVVVVVVVVVU="},
- {"width" : "67", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//////9VVVVVVVVVVVVVV/////////9VVVVVVVVVVVX/8AAAAAAP/9VVVVVVVVVVf8AAAAAAAAAP9VVVVVVVVV/wAAAAAAAAAAP9VVVVVVVX/AAAAAAAAAAAAP9VVVVVVX8AAAAAAAAAAAAAP1VVVVVXwAAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAAA9VV8AAAAAAAP//wAAAAAAAPVVfAAAAAAA////wAAAAAAD1VfAAAAAAA/VVV/wAAAAAA9VXwAAAAAA9VVVV/AAAAAAPVV8AAAAAA9VVVVV8AAAAAD1VfAAAAAAPVVVVVfAAAAAAPVXwAAAAAD1VVVVV8AAAAAD1V8AAAAAD1VVVVVfAAAAAA9VfAAAAAA9VVVVVXwAAAAAPVXwAAAAAPVVVVVV8AAAAAPVV8AAAAAD1VVVVVfAAAAAD1VfAAAAAA9VVVVVXwAAAAA9VV8AAAAA9VVVVVV8AAAAAPVVXwAAAA9VVVVVVfAAAAAD1VVf////9VVVVVVXwAAAAA9VVV////9VVVVVVV8AAAAAPVVVVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVf//AAAAAAD1VVVVVVVVVVV///AAAAAAD1VVVVVVVVVVV/AAAAAAAAA9VVVVVVVVVVV8AAAAAAAAA9VVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVVfAAAAAAAAA/VVVVVVVVVVVXwAAAAAAAA/VVVVVVVVVVVV8AAAAAAAA9VVVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVVVXwAAAAAAAA/VVVVVVVVVVVV8AAAAAAAAD/VVVVVVVVVVVfAAAAAAAAAD9VVVVVVVVVVXwAAAAAAAAAD1VVVVVVVVVVfAAAAAAAAAAPVVVVVVVVVVXwAAAAAAAAAA9VVVVVVVVVVfAAAAAAAAAAD1VVVVVVVVVV//8AAAAAAAA9VVVVVVVVVVX///AAAAAAAD1VVVVVVVVVVVVf/AAAAAAA9VVVVVVVVVVVVVX8AAAAAAD1VVVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVVVXwAAAAAPVX////VVVVVVVVV8AAAAAD1f/////VVVVVVVVfAAAAAA9fwAAAD9VVVVVVVXwAAAAAPfAAAAAPVVVVVVVV8AAAAAD3wAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVfAAAAAAP8AAAAAA9VVVVVVXwAAAAAD/AAAAAAPVVVVVVXwAAAAAD3wAAAAAA9VVVVVV8AAAAAA98AAAAAAD1VVVVX8AAAAAAPXwAAAAAAP1VVVX8AAAAAAD18AAAAAAA//1f/wAAAAAAA9fAAAAAAAA////wAAAAAAA9XwAAAAAAAAA/AAAAAAAAAPVfAAAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAPVVVVX8AAAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAA/VVVVVVfwAAAAAAAAAAAAD/VVVVVVV/wAAAAAAAAAAAP9VVVVVVVV/wAAAAAAAAAA/1VVVVVVVVV/8AAAAAAAA//VVVVVVVVVVV//wAAAAD//9VVVVVVVVVVVVf///////9VVVVVVVVVVVVVVV/////1VVVVVVVVQ=="},
- {"width" : "73", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX//9VVVVVVVVVVVVVVVVVVVVf///9VVVVVVVVVVVVVVVVVVVfwAAP9VVVVVVVVVVVVVVVVVVfAAAAP1VVVVVVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVfAAAAAAD1VVV/VVVVVVVVVVVXwAAAAAD1VX////VVVVVVVVVXwAAAAAA9Vf/8D//VVVVVVVVV8AAAAAA9VfwAAAD9VVVVVVVV8AAAAAAPVfAAAAAD1VVVVVVVfAAAAAAPVXwAAAAA9VVVVVVVfAAAAAAD1XwAAAAAPVVVVVVVXwAAAAAD1V8AAAAAA9VVVVVVXwAAAAAA9VfAAAAAAPVVVVVVV8AAAAAA9VXwAAAAAD1VVVVVV8AAAAAAPVV8AAAAAA9VVVVVVfAAAAAAPVVfAAAAAAPVVVVVVfAAAAAAD1VXwAAAAAD1VVVVVXwAAAAAD1VV8AAAAAA9VVVVVXwAAAAAA9VVfAAAAAAPVVVVVV8AAAAAA9VVXwAAAAAD1VVVVV8AAAAAAD///wAAAAAAP/9VVVfAAAAAAAP//wAAAAAAA//9VVfAAAAAAAAAAAAAAAAAAAAP1VXwAAAAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAAAAA9V/wAAAAAAAAAAAAAAAAAAAD9VX///////////wAAAAAAA//9VVV///////////AAAAAAA//1VVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVVVVVX8AAAAD9VVVVVVVVVVVVVVVVVf8AAAP9VVVVVVVVVVVVVVVVVVf////1VVVVVVVVVVVVVVVVVVVf///VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="},
- {"width" : "67", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVX////////////////VVVVVV////////////////9VVVVV8AAAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAA9VVVVfAAAAAA//////////9VVVVXwAAAAA//////////9VVVVV8AAAAA9VVVVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVVVXwAAAAA9VVVVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVVVXwAAAAAP///VVVVVVVVVVVV8AAAAAA//////VVVVVVVVVfAAAAAAAAAD///9VVVVVVVXwAAAAAAAAAAAD//VVVVVVV8AAAAAAAAAAAAAP/1VVVVVfAAAAAAAAAAAAAAD/VVVVVXwAAAAAAAAAAAAAAA/VVVVV8AAAAAAAAAAAAAAAD9VVVVfAAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAAPVVVfwAAAAAAAAAAAAAAAAD1VVV/////////wAAAAAAAAPVVVV/////////8AAAAAAAD1VVVVVVVVVVVV/8AAAAAAA9VVVVVVVVVVVVVfwAAAAAAD1VVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVVVVfAAAAAA9VX///9VVVVVVVVXwAAAAAPVf////9VVVVVVVV8AAAAAD1/wAAAP1VVVVVVVfAAAAAA9fAAAAA9VVVVVVVXwAAAAAPfAAAAAD1VVVVVVV8AAAAAD3wAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAAPVVVVVVV8AAAAAA/wAAAAAD1VVVVVVfAAAAAAP8AAAAAA9VVVVVVfAAAAAAPfAAAAAAD1VVVVVXwAAAAAD3wAAAAAAPVVVVVXwAAAAAA9fAAAAAAA9VVVVfwAAAAAAPXwAAAAAAD9VVVfwAAAAAAD18AAAAAAAP////AAAAAAAD1fAAAAAAAAP///AAAAAAAA9V8AAAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAAPVVVVVX8AAAAAAAAAAAAAAPVVVVVVfwAAAAAAAAAAAAA/VVVVVVVfwAAAAAAAAAAAD/VVVVVVVV/8AAAAAAAAAA/9VVVVVVVVV//AAAAAAAAP/1VVVVVVVVVVf//AAAAA//9VVVVVVVVVVVVX////////VVVVVVVVVVVVVVVX////9VVVVVVVVQ=="},
- {"width" : "67", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf//////VVVVVVVVVVVVVVX////////9VVVVVVVVVVVX//AAAAAAD//VVVVVVVVVVf/wAAAAAAAAP/VVVVVVVVV/wAAAAAAAAAAD/VVVVVVVX/AAAAAAAAAAAAD9VVVVVVX8AAAAAAAAAAAAAD9VVVVVXwAAAAAAAAAAAAAAP1VVVVXwAAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAAAD1XwAAAAAAAAP/8AAAAAAAA9V8AAAAAAAD////AAAAAAAD18AAAAAAAP/VVf8AAAAAAA9fAAAAAAAP1VVVXwAAAAAAPXwAAAAAAPVVVVVfAAAAAAD18AAAAAAPVVVVVV8AAAAAA98AAAAAAPVVVVVVXwAAAAAPfAAAAAAD1VVVVVV8AAAAAA/wAAAAAD1VVVVVVXwAAAAAP8AAAAAA9VVVVVVV8AAAAAD/AAAAAAPVVVVVVVfAAAAAD3wAAAAAPVVVVVVVXwAAAAA98AAAAAD1VVVVVVV8AAAAAPfAAAAAA9VVVVVVVXwAAAAD3wAAAAAPVVVVVVVVfwAAAP18AAAAAD1VVVVVVVV//8//1fAAAAAA9VVVVVVVVV////VXwAAAAAPVVVVVVVVVVVdVVV8AAAAAD1VVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVVVXwAAAAAPVVVf///9VVVVVVV8AAAAAD1Vf//////1VVVVVfAAAAAA9X//AAAAP/9VVVVXwAAAAAPX/AAAAAAA/9VVVV8AAAAAA/wAAAAAAAAP9VVVfAAAAAADwAAAAAAAAAP1VVXwAAAAAAAAAAAAAAAAAP1VV8AAAAAAAAAAAAAAAAAA/VVfAAAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAAAD18AAAAAAAAD//8AAAAAAAA9fAAAAAAAAP///8AAAAAAAPXwAAAAAAA/1VVfwAAAAAAA98AAAAAAA/VVVVfAAAAAAAPfAAAAAAA9VVVVV8AAAAAAD3wAAAAAA9VVVVVXwAAAAAA98AAAAAAPVVVVVVfAAAAAAPfAAAAAAPVVVVVVXwAAAAAD3wAAAAAD1VVVVVVfAAAAAA98AAAAAD1VVVVVVXwAAAAAPfAAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVfAAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVfAAAAAA98AAAAAD1VVVVVVXwAAAAAPfAAAAAAPVVVVVVV8AAAAAD3wAAAAAD1VVVVVVfAAAAAA98AAAAAA9VVVVVVXwAAAAAPXwAAAAAD1VVVVVXwAAAAAD18AAAAAA9VVVVVXwAAAAAA9fAAAAAAD1VVVVV8AAAAAAPXwAAAAAAPVVVVX8AAAAAAPV8AAAAAAA/VVVX8AAAAAAD1XwAAAAAAD/1V/wAAAAAAA9V8AAAAAAAD///wAAAAAAA9VfAAAAAAAAA/8AAAAAAAAPVV8AAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAAPVVVVVX8AAAAAAAAAAAAAA/VVVVVVfwAAAAAAAAAAAAA/VVVVVVVfwAAAAAAAAAAAD9VVVVVVVV/8AAAAAAAAAA/9VVVVVVVVV//AAAAAAAA//1VVVVVVVVVVf//AAAAA//9VVVVVVVVVVVVX///////9VVVVVVVVVVVVVVVX////9VVVVVVVVQ=="},
- {"width" : "67", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVV//////////////////9VVX///////////////////9VX8AAAAAAAAAAAAAAAAAAP9XwAAAAAAAAAAAAAAAAAAAP3wAAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAP8AAAAAAP//////8AAAAAAD/AAAAAAP///////wAAAAAA/wAAAAAPVVVVVVVfAAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAAP8AAAAAD1VVVVVVV8AAAAAD/AAAAAA9VVVVVVVfAAAAAA/wAAAAAPVVVVVVVXwAAAAA98AAAAAD1VVVVVVXwAAAAAPfAAAAAA9VVVVVVV8AAAAAD3wAAAAAPVVVVVVVfAAAAAA98AAAAAPVVVVVVVfAAAAAA9XwAAAAD1VVVVVVXwAAAAAPVfwAAA/1VVVVVVXwAAAAAD1V/////1VVVVVVXwAAAAAD1VV///9VVVVVVVV8AAAAAA9VVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVVVV/AAAAD1VVVVVVVVVVVVVVVX/AAAA9VVVVVVVVVVVVVVVVX/AAD9VVVVVVVVVVVVVVVVVX///9VVVVVVVVVVVVVVVVVVX//1VVVVVVVVVVVVQ=="},
- {"width" : "67", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//////9VVVVVVVVVVVVVVf////////1VVVVVVVVVVVX/8AAAAAAP/9VVVVVVVVVVf/AAAAAAAAA/9VVVVVVVVV/wAAAAAAAAAAP9VVVVVVVX/AAAAAAAAAAAAP1VVVVVVX8AAAAAAAAAAAAAPVVVVVVXwAAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAAPVVV8AAAAAAAP//AAAAAAAA9VVfAAAAAAAP///AAAAAAAPVVXwAAAAAAPVVX8AAAAAAD1VXwAAAAAAPVVVXwAAAAAA9VV8AAAAAAPVVVVfAAAAAAPVVfAAAAAAPVVVVV8AAAAAD1VXwAAAAAPVVVVVfAAAAAAPVV8AAAAAD1VVVVXwAAAAAD1VfAAAAAA9VVVVVfAAAAAA9VXwAAAAAPVVVVVXwAAAAAPVV8AAAAAD1VVVVV8AAAAAPVVfAAAAAA9VVVVVfAAAAAD1VXwAAAAAPVVVVVXwAAAAA9VVfAAAAAD1VVVVXwAAAAAPVVXwAAAAA9VVVVV8AAAAAD1VV8AAAAAD1VVVVfAAAAAA9VVfAAAAAA9VVVVfAAAAAA9VVV8AAAAAD1VVVfAAAAAAPVVVfAAAAAAP1VV/AAAAAAD1VVXwAAAAAA////AAAAAAD1VVVfAAAAAAA//8AAAAAAA9VVVV8AAAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAAAAA9VVVVVX8AAAAAAAAAAAAAA9VVVVVVf8AAAAAAAAAAAAD9VVVVVVVfwAAAAAAAAAAAD9VVVVVVVVfAAAAAAAAAAAD1VVVVVVVVXwAAAAAAAAAAA9VVVVVVVVXwAAAAAAAAAAAD1VVVVVVVfwAAAAAAAAAAAAP1VVVVVVfwAAAAAAAAAAAAA/VVVVVV/AAAAAAAAAAAAAAA/VVVVV/AAAAAAAAAAAAAAAD9VVVV8AAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAA9VVV8AAAAAAAP//wAAAAAAD1VVfAAAAAAA////wAAAAAAPVVfAAAAAAD/VVV/AAAAAAD1VXwAAAAAD9VVVV8AAAAAAPVXwAAAAAD1VVVVXwAAAAAD1V8AAAAAD1VVVVVfAAAAAAPV8AAAAAA9VVVVVV8AAAAAD1fAAAAAA9VVVVVVfAAAAAAPXwAAAAAPVVVVVVV8AAAAAD18AAAAAPVVVVVVVfAAAAAA98AAAAAD1VVVVVVXwAAAAAPfAAAAAA9VVVVVVV8AAAAAD3wAAAAAPVVVVVVVfAAAAAA98AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVfAAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVfAAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAD1VVVVVVfAAAAAAP8AAAAAA9VVVVVVfAAAAAAD/AAAAAAPVVVVVVXwAAAAAD3wAAAAAA9VVVVVXwAAAAAA98AAAAAAD1VVVVV8AAAAAAPXwAAAAAAPVVVVX8AAAAAAD18AAAAAAA/VVVX8AAAAAAA9fAAAAAAAD/VV/wAAAAAAAPXwAAAAAAAD///wAAAAAAAPVfAAAAAAAAD/8AAAAAAAAD1XwAAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAP1VVVXwAAAAAAAAAAAAAAAP1VVVVfwAAAAAAAAAAAAAAPVVVVVV/wAAAAAAAAAAAAA/VVVVVVV/wAAAAAAAAAAAD/VVVVVVVV/wAAAAAAAAAAP9VVVVVVVVV//AAAAAAAAP/1VVVVVVVVVV//8AAAAA///VVVVVVVVVVVVX////////VVVVVVVVVVVVVVVf////9VVVVVVVVQ=="},
- {"width" : "67", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//////9VVVVVVVVVVVVVVf////////1VVVVVVVVVVVf/8AAAAAAP/9VVVVVVVVVV//AAAAAAAAA/9VVVVVVVVX/AAAAAAAAAAAP9VVVVVVVX8AAAAAAAAAAAAP9VVVVVVXwAAAAAAAAAAAAAP1VVVVVfwAAAAAAAAAAAAAAPVVVVVfwAAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAAA9VfAAAAAAAAP//wAAAAAAAPVXwAAAAAAA////AAAAAAAA9V8AAAAAAD/VVV/AAAAAAAPV8AAAAAAD9VVVX8AAAAAAD1fAAAAAAD1VVVVXwAAAAAAPXwAAAAAD1VVVVVfAAAAAAD18AAAAAA9VVVVVV8AAAAAA9fAAAAAA9VVVVVVfAAAAAAPfAAAAAAPVVVVVVV8AAAAAD3wAAAAAD1VVVVVVfAAAAAA98AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVfAAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVfAAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAA/wAAAAAPVVVVVVVfAAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAAPVVVVVVV8AAAAAA/wAAAAAD1VVVVVVfAAAAAAP8AAAAAA9VVVVVVfAAAAAAD/AAAAAAD1VVVVVXwAAAAAA/wAAAAAAPVVVVVXwAAAAAAPfAAAAAAA9VVVVXwAAAAAAD3wAAAAAAD1VVVfwAAAAAAA98AAAAAAAP9VX/wAAAAAAAPfAAAAAAAA////AAAAAAAAD18AAAAAAAAP/wAAAAAAAAA9fAAAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAD1VX8AAAAAAAAAAAAAAAAAA9VVfwAAAAAAAAAAAAAAAAAPVVVfwAAAAAAAAA8AAAAAAD1VVV/wAAAAAAAD/wAAAAAA9VVVV//AAAAAAP9fAAAAAAPVVVVV///8AD//1XwAAAAAD1VVVVVX//////VV8AAAAAA9VVVVVVVVf/1VVVfAAAAAAPVVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVV8AAAAAA9VX//9VVVVVVVVVfAAAAAAPVf////VVVVVVVVXwAAAAAD1/wAAP9VVVVVVVV8AAAAAA9/AAAAD1VVVVVVVfAAAAAAPfAAAAAPVVVVVVVXwAAAAAD/AAAAAD1VVVVVVV8AAAAAA/wAAAAA9VVVVVVVfAAAAAAP8AAAAAD1VVVVVVXwAAAAAD/AAAAAA9VVVVVVV8AAAAAD3wAAAAAPVVVVVVV8AAAAAA98AAAAAD1VVVVVVfAAAAAAPfAAAAAAPVVVVVVfAAAAAAD3wAAAAAA9VVVVVfAAAAAAA98AAAAAAD1VVVVfAAAAAAAPfAAAAAAAP1VVV/AAAAAAAPV8AAAAAAA/////AAAAAAAD1fAAAAAAAA///8AAAAAAAA9XwAAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAAA9VVVVVfwAAAAAAAAAAAAAA9VVVVVV/AAAAAAAAAAAAAD9VVVVVVV/AAAAAAAAAAAAP9VVVVVVVX/wAAAAAAAAAD/1VVVVVVVVX/8AAAAAAAD//VVVVVVVVVVV//wAAAAD//1VVVVVVVVVVVVf///////1VVVVVVVVVVVVVVV/////1VVVVVVVVQ=="},
- {"width" : "21", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf//VVVX///9VVfwAA/VV8AAAD1XwAAAA9fAAAAAPfAAAAAPfAAAAAP8AAAAAP8AAAAAD8AAAAAD8AAAAAD8AAAAADfAAAAAPfAAAAAPfAAAAAPXwAAAA9XwAAAD1V/AAAP1Vf/AP9VVV///1VVVV/1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/1VVVV///1VVf/AP/VV/AAAP1XwAAAA9XwAAAA9fAAAAAPfAAAAAPfAAAAAP8AAAAAD8AAAAAD8AAAAAD8AAAAAD8AAAAAPfAAAAAPfAAAAAPfAAAAA9XwAAAA9V8AAAD1VfwAA/VVX///9VVVf//VV"},
- ]
-}
-
diff --git a/apps/contourclock/font-SairaCond.json b/apps/contourclock/font-SairaCond.json
deleted file mode 100644
index b6757f7ad..000000000
--- a/apps/contourclock/font-SairaCond.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "name":"SairaCond",
- "size":"98",
- "characters":[
- {"width" : "61", "buffer":"VVVVf///////////VVVVVVVV/////////////VVVVVVX/AAAAAAAAAAAD/VVVVVX8AAAAAAAAAAAAD9VVVVXwAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAA/8AAAAAAAA9fAAAAAAAA//wAAAAAAAD3wAAAAAAA9VfAAAAAAAA98AAAAAAAPVV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA/wAAAAAAA9VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAD/AAAAAAAD1VXwAAAAAAA98AAAAAAAPVV8AAAAAAAPfAAAAAAAD1V8AAAAAAAD3wAAAAAAAP/8AAAAAAAD18AAAAAAAA/8AAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAPVVVVfwAAAAAAAAAAAAA/VVVVV/AAAAAAAAAAAAA/VVVVVV/wAAAAAAAAAAD9VVVVVVX////////////9VVVVVVVV///////////1VVVUA==" },
- {"width" : "42", "buffer":"VVVVVVX///////VVVVVV////////VVVVVf8AAAAAAPVVVVX/AAAAAAAPVVVV/wAAAAAAAPVVVf8AAAAAAAAPVVX/AAAAAAAAAPVV/wAAAAAAAAAPVf8AAAAAAAAAAPX/AAAAAAAAAAAPfwAAAAAAAAAAAPfAAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAAAAAAAAAAP8AAAMAAAAAAAAP8AAD/AAAAAAAAP8AD/3wAAAAAAAP8D/9XwAAAAAAAP8/9VXwAAAAAAAPf9VVXwAAAAAAAPfVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVXwAAAAAAAPVVVVX/////////VVVVV/////////" },
- {"width" : "59", "buffer":"Vf/////////////1VVVVf//////////////9VVVV8AAAAAAAAAAAAAD/VVVXwAAAAAAAAAAAAAA/VVVfAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD1/////////wAAAAAAAAPX/////////wAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVfAAAAAAAD1VVVVVVVVVV8AAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAA9VVVVVVVVX8AAAAAAAAD1VVVVVVVX/AAAAAAAAAPVVVVVVVV/AAAAAAAAAD1VVVVVVV/AAAAAAAAAAPVVVVVVV/wAAAAAAAAAA9VVVVVV/wAAAAAAAAAAD1VVVVV/wAAAAAAAAAAA9VVVVV/wAAAAAAAAAAAD1VVVV/wAAAAAAAAAAAAPVVVV/wAAAAAAAAAAAAD1VVVfwAAAAAAAAAAAAAPVVVfwAAAAAAAAAAAAAD1VVX8AAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAP1VVV8AAAAAAAAAAAAAP9VVVXwAAAAAAAAAAAAP9VVVV8AAAAAAAAAAAAP9VVVVXwAAAAAAAAAAAP9VVVVVfAAAAAAAAAAAP9VVVVVV8AAAAAAAAAAP9VVVVVVfAAAAAAAAAAP9VVVVVVV8AAAAAAAAAP9VVVVVVVXwAAAAAAAAP9VVVVVVVVfAAAAAAAAD9VVVVVVVVV8AAAAAAAA9VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAD1VVVVVVVVVV8AAAAAAAPVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVfAAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAA//////////3wAAAAAAAA///////////AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP///////////////////////////////////////w" },
- {"width" : "59", "buffer":"V//////////////VVVVV///////////////1VVVXwAAAAAAAAAAAAAP9VVVfAAAAAAAAAAAAAAD9VVV8AAAAAAAAAAAAAAA/VVXwAAAAAAAAAAAAAAA/VVfAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPX/////////AAAAAAAAA9f/////////AAAAAAAAD1VVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVfAAAAAAAD1VVVVVVVVVV8AAAAAAAPVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVfAAAAAAAD1VVVVVVVVVV8AAAAAAAPVVVVVVVVVVXwAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAA9VVVVVVVVVVfAAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVf/////8AAAAAAAA9VVVX//////AAAAAAAAPVVVVfAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAA/VVVVVV8AAAAAAAAAAAP1VVVVVXwAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAPVVVVVVV8AAAAAAAAAAAP1VVVVVXwAAAAAAAAAAAP9VVVVVfAAAAAAAAAAAAD9VVVVV8AAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVV//////wAAAAAAAA9VVVV//////wAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVV8AAAAAAAA9//////////AAAAAAAAD//////////wAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAA/VV8AAAAAAAAAAAAAAAP1VXwAAAAAAAAAAAAAAP1VVf/AAAAAAAAAAAAA/9VVVf//////////////9VVVVVf////////////1VVVVQ" },
- {"width" : "66", "buffer":"VVVVVX/////////VVVVVVVVVVVVf/////////VVVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVV8AAAAAAAA9VVVVVVVVVVVV8AAAAAAAA9VVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVXwAAAAAAAD1VVVVVVVVVVVXwAAAAAAAD1VVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVXwAAAAAAAD1VVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVVV8AAAAAAAPVVf/////1VVVV8AAAAAAAPVV//////9VVVV8AAAAAAAPVV8AAAAA9VVVXwAAAAAAA9VV8AAAAA9VVVXwAAAAAAA9VXwAAAAA9VVVXwAAAAAAA9VXwAAAAA9VVVfAAAAAAAA9VfAAAAAA9VVVfAAAAAAAD1VfAAAAAA9VVVfAAAAAAAD1VfAAAAAA9VVVfAAAAAAAPVV8AAAAAA9VVVfAAAAAAAPVV8AAAAAA9VVV8AAAAAAAPVV8AAAAAA9VVV8AAAAAAAPVXwAAAAAA9VVXwAAAAAAA9VXwAAAAAA9VVXwAAAAAAA9VXwAAAAAA9VVXwAAAAAAA9VfAAAAAAA9VVXwAAAAAAD1VfAAAAAAA9VVfAAAAAAAD1V8AAAAAAA9VVfAAAAAAAD1V8AAAAAAA9VVfAAAAAAAPVXwAAAAAAA9VVfAAAAAAAD//AAAAAAAAP//8AAAAAAAA/8AAAAAAAAD//8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAP//////////8AAAAAAAAD/////////////AAAAAAAAP//VVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVX////////9VVVVVVVVVVVVX////////9VV" },
- {"width" : "59", "buffer":"f/////////////////VV//////////////////VXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAD/////////VV8AAAAAAA/////////1VXwAAAAAAPVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVV8AAAAAAD1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVV8AAAAAAD1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVV8AAAAAAD1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVfAAAAAAA9Vf/1VVVVVVV8AAAAAAA//////VVVVVXwAAAAAAA/8AD//9VVVVfAAAAAAAAAAAAAP/VVVV8AAAAAAAAAAAAAA/1VVXwAAAAAAAAAAAAAAP1VVfAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD1/////////wAAAAAAAAPX/////////wAAAAAAAA9VVVVVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVXwAAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVXwAAAAAAAD3/////////8AAAAAAAAPf/////////AAAAAAAAA98AAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAD9VV8AAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAA/VVVf8AAAAAAAAAAAAA/1VVVf//////////////1VVVVV/////////////1VVVVQ" },
- {"width" : "62", "buffer":"VVVVVV////////////1VVVVVVV//////////////VVVVVV/wAAAAAAAAAAAD/VVVVVfwAAAAAAAAAAAAA9VVVVfwAAAAAAAAAAAAAD1VVVX8AAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAD///////8PVXwAAAAAAAA/////////9VfAAAAAAAAPVVVVVVVV/VV8AAAAAAAD1VVVVVVVVVVXwAAAAAAA9VVVVVVVVVVV8AAAAAAAD1VVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVX/9VVVVVV8AAAAAAAPVV/////1VVVXwAAAAAAA9V//AA//9VVVfAAAAAAAD1/wAAAAD/VVXwAAAAAAAPfwAAAAAA/1VfAAAAAAAAPwAAAAAAAP1V8AAAAAAAAMAAAAAAAAPVXwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAA//wAAAAAAAD/AAAAAAAAP//wAAAAAAAP8AAAAAAAD1VXwAAAAAAA/wAAAAAAAPVVfAAAAAAAD/AAAAAAAA9VVfAAAAAAAP8AAAAAAAD1VV8AAAAAAA/wAAAAAAAPVVXwAAAAAAD/AAAAAAAA9VVfAAAAAAAPfAAAAAAAD1VV8AAAAAAA98AAAAAAAPVVXwAAAAAAD3wAAAAAAA9VVfAAAAAAAPfAAAAAAAD1VV8AAAAAAA98AAAAAAAPVVXwAAAAAAD3wAAAAAAA9VVfAAAAAAAPfAAAAAAAD1VV8AAAAAAA98AAAAAAAPVVXwAAAAAAD3wAAAAAAA9VVfAAAAAAAPfAAAAAAAD1VV8AAAAAAA98AAAAAAAPVVXwAAAAAAD3wAAAAAAA9VVfAAAAAAAPXwAAAAAAD1VXwAAAAAAA9fAAAAAAAD1V8AAAAAAAD18AAAAAAAD//AAAAAAAAPXwAAAAAAAD/wAAAAAAAA9fAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAPVVVVV/AAAAAAAAAAAAAP1VVVVV/AAAAAAAAAAAAP9VVVVVVfwAAAAAAAAAAP9VVVVVVVf///////////9VVVVVVVVX//////////9VVVVQ==" },
- {"width" : "58", "buffer":"///////////////////////////////////////wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP/////////8AAAAAAAAD3/////////wAAAAAAAD1VVVVVVVVVfAAAAAAAA9VVVVVVVVVXwAAAAAAAPVVVVVVVVVXwAAAAAAAPVVVVVVVVVV8AAAAAAAD1VVVVVVVVVfAAAAAAAA9VVVVVVVVVfAAAAAAAA9VVVVVVVVVXwAAAAAAAPVVVVVVVVVV8AAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAA9VVVVVVVVVXwAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAD1VVVVVVVVVfAAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAPVVVVVVVVVV8AAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAA9VVVVVVVVVXwAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAD1VVVVVVVVVfAAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAPVVVVVVVVVV8AAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAA9VVVVVVVVVXwAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVXwAAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAA9VVVVVVVVV8AAAAAAAAPVVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVXwAAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVfAAAAAAAAD1VVVVVVVVXwAAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVV8AAAAAAAAPVVVVVVVVVf/////////VVVVVVVVVX/////////1VVVVVVVU=" },
- {"width" : "64", "buffer":"VVVVX///////////1VVVVVVVVf////////////9VVVVVVV/wAAAAAAAAAAA/9VVVVVV/AAAAAAAAAAAAAP1VVVVV8AAAAAAAAAAAAAAPVVVVX8AAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAAD1fAAAAAAAAA/AAAAAAAAAPXwAAAAAAAD//AAAAAAAAD18AAAAAAAD9X8AAAAAAAA9fAAAAAAAD1VXwAAAAAAAPXwAAAAAAA9VV8AAAAAAAD18AAAAAAAPVVXwAAAAAAA9fAAAAAAAD1VV8AAAAAAAPXwAAAAAAA9VVfAAAAAAAD18AAAAAAAPVVXwAAAAAAA9fAAAAAAAD1VV8AAAAAAAPXwAAAAAAA9VVfAAAAAAAD18AAAAAAAPVVXwAAAAAAA9fAAAAAAAD1VV8AAAAAAAPXwAAAAAAA9VVfAAAAAAAD18AAAAAAAPVVXwAAAAAAD1fAAAAAAAD1VV8AAAAAAA9XwAAAAAAA9VVfAAAAAAAPVfAAAAAAAPVVXwAAAAAAD1XwAAAAAAD1VXwAAAAAAA9V8AAAAAAAPVV8AAAAAAA9VXwAAAAAAA//8AAAAAAAPVV8AAAAAAAD/8AAAAAAAPVVXwAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAD9VVVVX8AAAAAAAAAAAAAD9VVVVVfwAAAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAAD9VVVVV/AAAAAAAAAAAAAAP9VVVV/AAAAAAAAAAAAAAAP1VVV8AAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAAPVXwAAAAAAAD/8AAAAAAAA9XwAAAAAAAD//wAAAAAAAPV8AAAAAAAD1VfAAAAAAAA9fAAAAAAAD1VV8AAAAAAAPXwAAAAAAA9VVfAAAAAAAD3wAAAAAAAPVVXwAAAAAAA98AAAAAAAD1VV8AAAAAAAPfAAAAAAAA9VVfAAAAAAAD3wAAAAAAAPVVXwAAAAAAAP8AAAAAAAPVVV8AAAAAAAD/AAAAAAAD1VVfAAAAAAAA/wAAAAAAA9VVXwAAAAAAAP8AAAAAAAPVVV8AAAAAAAD/AAAAAAAA9VVfAAAAAAAA/wAAAAAAAPVVXwAAAAAAAP8AAAAAAAD1VV8AAAAAAAD/AAAAAAAA9VVfAAAAAAAA/wAAAAAAAPVVXwAAAAAAAP8AAAAAAAD1VV8AAAAAAAD/AAAAAAAA9VV8AAAAAAAA/wAAAAAAAD//8AAAAAAAAP8AAAAAAAAP/8AAAAAAAAD/AAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAA9VVVVfwAAAAAAAAAAAAAA9VVVVV/wAAAAAAAAAAAAD9VVVVVV/wAAAAAAAAAAA/9VVVVVVV/////////////1VVVVVVVV///////////9VVVVU=" },
- {"width" : "62", "buffer":"VVVVX///////////VVVVVVVVX////////////1VVVVVVX/AAAAAAAAAAAP9VVVVVV/AAAAAAAAAAAAD9VVVVVfAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPV8AAAAAAAA/8AAAAAAAA9XwAAAAAAAP/8AAAAAAAA9fAAAAAAAD1V8AAAAAAAD18AAAAAAA9VV8AAAAAAAPXwAAAAAAD1VXwAAAAAAA98AAAAAAAPVVXwAAAAAAD3wAAAAAAA9VVfAAAAAAAPfAAAAAAAD1VV8AAAAAAA98AAAAAAAPVVXwAAAAAAD3wAAAAAAA9VVfAAAAAAAD/AAAAAAAD1VV8AAAAAAAP8AAAAAAAPVVXwAAAAAAA/wAAAAAAA9VVfAAAAAAAD/AAAAAAAD1VV8AAAAAAAP8AAAAAAAPVVXwAAAAAAA/wAAAAAAA9VVfAAAAAAAD/AAAAAAAD1VV8AAAAAAAP8AAAAAAAPVVXwAAAAAAA/wAAAAAAA9VVfAAAAAAAD/AAAAAAAD1VV8AAAAAAAP8AAAAAAAPVVfAAAAAAAA/wAAAAAAA9VV8AAAAAAAD/AAAAAAAA///AAAAAAAAP8AAAAAAAA//wAAAAAAAA/wAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAwAAAAAAAD1VfAAAAAAAA/wAAAAAAAPVVfwAAAAAAP3wAAAAAAA9VVf/AAAAAP1fAAAAAAAD1VVX//////9V8AAAAAAAPVVVVf////9VXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVXwAAAAAAAPVVVVVVVVVVV8AAAAAAAA9Vf/VVVVVVVfAAAAAAAAPVX/////////wAAAAAAAA9VfAP//////8AAAAAAAAD1V8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAA/VVVVXwAAAAAAAAAAAAA/1VVVVX/AAAAAAAAAAAA/1VVVVVf/////////////1VVVVVVVf///////////1VVVVVQ==" },
- {"width" : "26", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///////9/////////AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/////////3////////VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/////////////////AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP8AAAAAAA/wAAAAAAD/AAAAAAAP/////////////////w==" }
- ]
-}
diff --git a/apps/contourclock/fonts/Anton-p1.png b/apps/contourclock/fonts/Anton-p1.png
new file mode 100644
index 000000000..c049dd4a5
Binary files /dev/null and b/apps/contourclock/fonts/Anton-p1.png differ
diff --git a/apps/contourclock/fonts/Anton-p2.png b/apps/contourclock/fonts/Anton-p2.png
new file mode 100644
index 000000000..ac00cd840
Binary files /dev/null and b/apps/contourclock/fonts/Anton-p2.png differ
diff --git a/apps/contourclock/fonts/Bangers-p1.png b/apps/contourclock/fonts/Bangers-p1.png
new file mode 100644
index 000000000..e57f725f0
Binary files /dev/null and b/apps/contourclock/fonts/Bangers-p1.png differ
diff --git a/apps/contourclock/fonts/Bangers-p2.png b/apps/contourclock/fonts/Bangers-p2.png
new file mode 100644
index 000000000..b25d4f511
Binary files /dev/null and b/apps/contourclock/fonts/Bangers-p2.png differ
diff --git a/apps/contourclock/fonts/LuckiestGuy-p1.png b/apps/contourclock/fonts/LuckiestGuy-p1.png
new file mode 100644
index 000000000..0d082e40e
Binary files /dev/null and b/apps/contourclock/fonts/LuckiestGuy-p1.png differ
diff --git a/apps/contourclock/fonts/LuckiestGuy-p2.png b/apps/contourclock/fonts/LuckiestGuy-p2.png
new file mode 100644
index 000000000..3b93f83d6
Binary files /dev/null and b/apps/contourclock/fonts/LuckiestGuy-p2.png differ
diff --git a/apps/contourclock/fonts/Oswald-p1.png b/apps/contourclock/fonts/Oswald-p1.png
new file mode 100644
index 000000000..872e72d26
Binary files /dev/null and b/apps/contourclock/fonts/Oswald-p1.png differ
diff --git a/apps/contourclock/fonts/Oswald-p2.png b/apps/contourclock/fonts/Oswald-p2.png
new file mode 100644
index 000000000..a7b353b9f
Binary files /dev/null and b/apps/contourclock/fonts/Oswald-p2.png differ
diff --git a/apps/contourclock/fonts/RubikOne-p1.png b/apps/contourclock/fonts/RubikOne-p1.png
new file mode 100644
index 000000000..376909fe1
Binary files /dev/null and b/apps/contourclock/fonts/RubikOne-p1.png differ
diff --git a/apps/contourclock/fonts/RubikOne-p2.png b/apps/contourclock/fonts/RubikOne-p2.png
new file mode 100644
index 000000000..89a7453db
Binary files /dev/null and b/apps/contourclock/fonts/RubikOne-p2.png differ
diff --git a/apps/contourclock/fonts/TitanOne-p1.png b/apps/contourclock/fonts/TitanOne-p1.png
new file mode 100644
index 000000000..a9f3ec1a8
Binary files /dev/null and b/apps/contourclock/fonts/TitanOne-p1.png differ
diff --git a/apps/contourclock/fonts/TitanOne-p2.png b/apps/contourclock/fonts/TitanOne-p2.png
new file mode 100644
index 000000000..a52b11e1c
Binary files /dev/null and b/apps/contourclock/fonts/TitanOne-p2.png differ
diff --git a/apps/contourclock/fonts/font-Anton.json b/apps/contourclock/fonts/font-Anton.json
new file mode 100644
index 000000000..5013839b2
--- /dev/null
+++ b/apps/contourclock/fonts/font-Anton.json
@@ -0,0 +1,17 @@
+{
+ "name":"Anton",
+ "size":"100",
+ "characters":[
+ {"width" : "53", "buffer":"VVVVVV/////9VVVVVVVVVVX///////1VVVVVVVVX/wAAAAA//VVVVVVVX/AAAAAAAD/VVVVVVV/AAAAAAAAAP1VVVVVfAAAAAAAAAAP1VVVVXwAAAAAAAAAAD1VVVV8AAAAAAAAAAAD1VVVfAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAPV8AAAAAAP/wAAAAAA9fAAAAAAD//wAAAAAD18AAAAAA9VXwAAAAAPXwAAAAAPVVfAAAAAA9fAAAAAA9VVfAAAAAA98AAAAAD1VV8AAAAAD3wAAAAA9VVXwAAAAAPfAAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD3wAAAAAPVVXwAAAAAPfAAAAAA9VVfAAAAAA98AAAAAD1VXwAAAAAD3wAAAAAD1V8AAAAAAPfAAAAAAD9fAAAAAAD18AAAAAAD/wAAAAAAPV8AAAAAAA8AAAAAAA9XwAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAD1VXwAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAD1VVXwAAAAAAAAAAAA9VVVfAAAAAAAAAAAAPVVVVfwAAAAAAAAAAD1VVVVfwAAAAAAAAAA9VVVVVX8AAAAAAAAA/VVVVVVX/AAAAAAAA/1VVVVVVV/8AAAAAD/1VVVVVVVVf///////1VVVVVVVVVV//////VVVVVU="},
+ {"width" : "34", "buffer":"VVVVVV/////VVVVVV/////9VVVVV8AAAAPVVVVVfAAAAD1VVVVfAAAAA9VVVVfAAAAAPVVVVfAAAAAD1VVVfAAAAAA9VVVfAAAAAAPVVV/AAAAAAD1VX/AAAAAAA9Vf8AAAAAAAPX/wAAAAAAAD//AAAAAAAAA/wAAAAAAAAAP8AAAAAAAAAD/AAAAAAAAAA/wAAAAAAAAAP8AAAAAAAAAD/AAAAAAAAAA/wAAAAAAAAAP8AAAAAAAAAD/AAAAAAAAAA/wAAMAAAAAAP8AAPwAAAAAD/AA/fAAAAAA/wP/XwAAAAAP//9V8AAAAAD//VVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVXwAAAAAPVVVV8AAAAAD1VVVfAAAAAA9VVVX///////VVVVf//////Q=="},
+ {"width" : "52", "buffer":"VVVVVVX///9VVVVVVVVVVVX//////1VVVVVVVVV//wAAAP/9VVVVVVVX/wAAAAAA/9VVVVVVX8AAAAAAAAP1VVVVVfwAAAAAAAAAP1VVVVfwAAAAAAAAAA/VVVVfAAAAAAAAAAAA9VVVXwAAAAAAAAAAAD1VVXwAAAAAAAAAAAAPVVXwAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAPVV8AAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAD1fAAAAAAA8AAAAAAA9fAAAAAAD/8AAAAAAD3wAAAAAD9fwAAAAAA98AAAAAD1VfAAAAAAPfAAAAAA9VV8AAAAAD3wAAAAA9VVfAAAAAA/wAAAAAPVVXwAAAAAP8AAAAAD1VVfAAAAAD/AAAAAA9VVXwAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVVfAAAAAD/AAAAAD1VVXwAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVVfAAAAAD/AAAAAD1VVXwAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVV8AAAAAD/AAAAAD1VVfAAAAAA/wAAAAA9VVXwAAAAAP8AAAAAPVVV8AAAAAD/AAAAAD1VVfAAAAAD3//////9VVfAAAAAA9///////VVXwAAAAAPVVVVVVVVVV8AAAAAD1VVVVVVVVV8AAAAAD1VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAAPVVVVVVVVVXwAAAAAPVVVVVVVVVXwAAAAAD1VVVVVVVVV8AAAAAD1VVVVVVVVV8AAAAAA9VVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVV8AAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAAPVVVVVVVVVXwAAAAAA////////9XwAAAAAAD////////18AAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA///////////////////////////////////Q=="},
+ {"width" : "53", "buffer":"VVVVVVVX//1VVVVVVVVVVVVf/////9VVVVVVVVVV///AAD//1VVVVVVVV/8AAAAAA/9VVVVVVV/wAAAAAAAD/VVVVVVfwAAAAAAAAA/VVVVVXwAAAAAAAAAAPVVVVV8AAAAAAAAAAAPVVVVfAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAPVVXwAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAA9V8AAAAAAD/AAAAAAD1fAAAAAAA//AAAAAAD18AAAAAAPVfAAAAAAPXwAAAAAD1VfAAAAAA9fAAAAAA9VV8AAAAAD18AAAAAD1VV8AAAAAPXwAAAAA9VVXwAAAAA9fAAAAAD1VVfAAAAAD18AAAAAPVVV8AAAAAPXwAAAAA9VVXwAAAAA9fAAAAAD1VVfAAAAAD18AAAAAPVVV8AAAAAPX//////9VVXwAAAAA9f//////1VVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVfAAAAAAPVVVVVVVVVfwAAAAAD1VVVVVVVX/8AAAAAAPVVVVVVVX/8AAAAAAA9VVVVVVVfAAAAAAAAD1VVVVVVV8AAAAAAAA9VVVVVVVXwAAAAAAAD1VVVVVVVfAAAAAAAA9VVVVVVVV8AAAAAAAPVVVVVVVVXwAAAAAAP1VVVVVVVVfAAAAAAD9VVVVVVVVV8AAAAAA9VVVVVVVVVXwAAAAAA9VVVVVVVVVfAAAAAAA/VVVVVVVVV8AAAAAAA/VVVVVVVVXwAAAAAAAPVVVVVVVVfAAAAAAAA9VVVVVVVV8AAAAAAAA9VVVVVVVXwAAAAAAAD1VVVVVVVf/AAAAAAAD1VVVVVVV//wAAAAAAPVVVVVVVVVfwAAAAAA9VVVVVVVVVXwAAAAAA9VVVVVVVVVXwAAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAPX//////1VVXwAAAAA9///////VVVfAAAAAD3wAAAAA9VVV8AAAAAPfAAAAAD1VVXwAAAAA98AAAAAPVVVfAAAAAA/wAAAAA9VVV8AAAAAD/AAAAAD1VVXwAAAAAP8AAAAAPVVVfAAAAAA/wAAAAA9VVV8AAAAAD/AAAAAD1VVXwAAAAAP8AAAAAPVVVfAAAAAD3wAAAAA9VVV8AAAAAPfAAAAAD1VVXwAAAAA98AAAAAPVVVfAAAAAD3wAAAAA9VVV8AAAAAPXwAAAAA9VVXwAAAAA9fAAAAAD1VV8AAAAAD18AAAAAPVVXwAAAAAPXwAAAAAPVV8AAAAAA9fAAAAAAPVfAAAAAAPV8AAAAAAP/wAAAAAA9XwAAAAAAP8AAAAAAD1XwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAD1VVV8AAAAAAAAAAAA9VVVV8AAAAAAAAAAAP1VVVV8AAAAAAAAAAD9VVVVV/AAAAAAAAAA9VVVVVV/wAAAAAAAA/VVVVVVVf8AAAAAAD/1VVVVVVVX////////1VVVVVVVVV///////VVVVVU="},
+ {"width" : "55", "buffer":"VVVVVVf/////////1VVVVVVVf//////////VVVVVVVXwAAAAAAAAD1VVVVVVV8AAAAAAAAA9VVVVVVV8AAAAAAAAAPVVVVVVVfAAAAAAAAAD1VVVVVVXwAAAAAAAAA9VVVVVVXwAAAAAAAAAPVVVVVVV8AAAAAAAAAD1VVVVVVfAAAAAAAAAA9VVVVVVXwAAAAAAAAAPVVVVVVXwAAAAAAAAAD1VVVVVV8AAAAAAAAAA9VVVVVVfAAAAAAAAAAPVVVVVVXwAAAAAAAAAD1VVVVVXwAAAAAAAAAA9VVVVVV8AAAAAAAAAAPVVVVVVfAAAAAAAAAAD1VVVVVfAAAAAAAAAAA9VVVVVXwAAAAAAAAAAPVVVVVV8AAAAAAAAAAD1VVVVVfAAAAMAAAAAA9VVVVVfAAAAPwAAAAAPVVVVVXwAAAPfAAAAAD1VVVVV8AAAD3wAAAAA9VVVVV8AAAA98AAAAAPVVVVVfAAAAPfAAAAAD1VVVVXwAAAPXwAAAAA9VVVVV8AAAD18AAAAAPVVVVV8AAAA9fAAAAAD1VVVVfAAAAPXwAAAAA9VVVVXwAAAPV8AAAAAPVVVVV8AAAD1fAAAAAD1VVVV8AAAA9XwAAAAA9VVVVfAAAAPV8AAAAAPVVVVXwAAAPVfAAAAAD1VVVXwAAAD1XwAAAAA9VVVV8AAAA9V8AAAAAPVVVVfAAAAPVfAAAAAD1VVVXwAAAD1XwAAAAA9VVVXwAAAD1V8AAAAAPVVVV8AAAA9VfAAAAAD1VVVfAAAAPVXwAAAAA9VVVXwAAAD1V8AAAAAPVVVXwAAAD1VfAAAAAD1VVV8AAAA9VXwAAAAA9VVVfAAAAPVV8AAAAAPVVVfAAAAD1VfAAAAAD1VVXwAAAD1VXwAAAAA9VVV8AAAA9VV8AAAAAPVVVfAAAAPVVfAAAAAD1VVfAAAAD1VXwAAAAA9VVXwAAAA9VV8AAAAAPVVV8AAAA9VVfAAAAAD1VVfAAAAPVVXwAAAAA9VVfAAAAD1VV8AAAAAPVVXwAAAA9VVfAAAAAD1VV8AAAA9VVXwAAAAA9VV8AAAAPVVV8AAAAAPVVfAAAAD1VVfAAAAAD1VXwAAAA9VVXwAAAAA9VV8AAAA9VVV8AAAAAPVV8AAAAPVVVfAAAAAD1VfAAAAD1VVXwAAAAA9VXwAAAA9VVV8AAAAAPVXwAAAA9VVVfAAAAAD1V8AAAAPVVVXwAAAAA9VfAAAAA////wAAAAAD//wAAAAD///wAAAAAAP/8AAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAD//////////AAAAAAA///////////8AAAAAA//VVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVf//////1VVVVVVVVVVX//////1VQ=="},
+ {"width" : "53", "buffer":"V///////////////1Vf///////////////1V8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVXwAAAAA/////////9VfAAAAAP/////////VV8AAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVV8AAAAD1VVVVVVVVVVXwAAAAPVVVVVVVVVVVfAAAAA9VVf/VVVVVVV8AAAAD1X////1VVVVXwAAAAPV/8AP/9VVVVfAAAAA9/AAAAD/VVVV8AAAAA/wAAAAA/VVVXwAAAAAwAAAAAAPVVVfAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAA9VfAAAAAAA8AAAAAAA9V8AAAAAA//AAAAAAD1XwAAAAAP1/AAAAAAPVfAAAAAD1VfAAAAAA9V8AAAAA9VV8AAAAAA9XwAAAAD1VV8AAAAAD1fAAAAA9VVXwAAAAAPV8AAAAD1VVfAAAAAA9X//////VVVfAAAAAD1f/////9VVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAAP///////VVVfAAAAAA///////9VVV8AAAAAD/AAAAAD1VVXwAAAAAP8AAAAAPVVVfAAAAAA/wAAAAA9VVV8AAAAAPfAAAAAD1VVXwAAAAA98AAAAAPVVVfAAAAAD3wAAAAA9VVV8AAAAAPfAAAAAD1VVXwAAAAA98AAAAAPVVVfAAAAAD3wAAAAA9VVV8AAAAAPfAAAAAD1VVXwAAAAA98AAAAAPVVVfAAAAAD3wAAAAA9VVV8AAAAAPfAAAAAD1VVXwAAAAA98AAAAAD1VV8AAAAAD3wAAAAAPVVXwAAAAA9fAAAAAAPVV8AAAAAD18AAAAAAPVfAAAAAAPXwAAAAAAP/wAAAAAA9fAAAAAAAP8AAAAAAD1fAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAPVVV8AAAAAAAAAAAAD1VVXwAAAAAAAAAAAAPVVVXwAAAAAAAAAAAD1VVVX8AAAAAAAAAAA9VVVVX/AAAAAAAAAA/VVVVVV/wAAAAAAAAP1VVVVVVf8AAAAAAA/1VVVVVVVX////////9VVVVVVVVV///////1VVVVU="},
+ {"width" : "53", "buffer":"VVVVVV/////9VVVVVVVVVVX///////1VVVVVVVVX/wAAAAA//VVVVVVVX/AAAAAAAD/VVVVVVV/AAAAAAAAAP1VVVVV/AAAAAAAAAAP1VVVVfwAAAAAAAAAAD1VVVXwAAAAAAAAAAAD1VVVfAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVfAAAAAAD/8AAAAAA9V8AAAAAA//8AAAAAD1XwAAAAAPVV8AAAAAPVfAAAAAD1VXwAAAAA9XwAAAAA9VVXwAAAAD1fAAAAAD1VVfAAAAAPV8AAAAAPVVV8AAAAA9XwAAAAA9VVXwAAAAD1fAAAAAD1VVXwAAAAPV8AAAAAPVVVfAAAAA9XwAAAAA9VVV8AAAAD18AAAAAD1VVXwAAAAPXwAAAAAPVVVf/////9fAAAAAA9VVV//////18AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VX///1VVVV8AAAAAD1f/////VVVXwAAAAAPX/AAAD/1VVfAAAAAA98AAAAAP1VV8AAAAAA/AAAAAAD1VXwAAAAAAwAAAAAAD1VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAA98AAAAAAA/wAAAAAAD3wAAAAAAP/wAAAAAAPfAAAAAAD1XwAAAAAA98AAAAAA9VXwAAAAAD3wAAAAAPVVXwAAAAAPfAAAAAA9VVfAAAAAA98AAAAAD1VV8AAAAAA/wAAAAAPVVXwAAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAA98AAAAAD1VV8AAAAAD3wAAAAAPVVXwAAAAAPfAAAAAA9VVfAAAAAA9fAAAAAD1VV8AAAAAD18AAAAAPVVXwAAAAAPXwAAAAAPVV8AAAAAD1fAAAAAAP1fAAAAAAPV8AAAAAAP/wAAAAAA9V8AAAAAAD8AAAAAAD1XwAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAD1VVVfAAAAAAAAAAAA9VVVV/AAAAAAAAAAAPVVVVV/AAAAAAAAAAD1VVVVVfwAAAAAAAAD9VVVVVVf8AAAAAAAD/VVVVVVVX/wAAAAAD/VVVVVVVVV////////VVVVVVVVVVX//////VVVVVU="},
+ {"width" : "51", "buffer":"f///////////////9/////////////////8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAA9/////////wAAAAAA9/////////8AAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVVfAAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAD1VVVVVVVVX///////1VVVVVVVVX///////VVVVVVVV"},
+ {"width" : "52", "buffer":"VVVVVf//////VVVVVVVVVX////////1VVVVVVVf/AAAAAAD/1VVVVVV/wAAAAAAAA/1VVVVX/AAAAAAAAAA/VVVVX8AAAAAAAAAAA9VVVXwAAAAAAAAAAAD1VVXwAAAAAAAAAAAAPVVV8AAAAAAAAAAAAA9VV8AAAAAAAAAAAAAPVVfAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAPXwAAAAAAPwAAAAAAD3wAAAAAAP/wAAAAAA98AAAAAAPV/AAAAAAPfAAAAAAPVV8AAAAAD3wAAAAAPVVfAAAAAA98AAAAAD1VV8AAAAAD/AAAAAD1VVfAAAAAA/wAAAAA9VVXwAAAAAP8AAAAAPVVV8AAAAAD/AAAAAD1VVfAAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVV8AAAAAD/AAAAAD1VVfAAAAAA/wAAAAA9VVXwAAAAAP8AAAAAPVVV8AAAAAPfAAAAAD1VVfAAAAAD3wAAAAAPVVXwAAAAA98AAAAAD1VXwAAAAAPfAAAAAAPVXwAAAAAD18AAAAAA//wAAAAAA9fAAAAAAD/wAAAAAA9XwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAD9VVXwAAAAAAAAAAAD9VVVfAAAAAAAAAAAD1VVVV8AAAAAAAAAAD1VVVV8AAAAAAAAAAAP1VVV8AAAAAAAAAAAA/VVV8AAAAAAAAAAAAA9VV8AAAAAAAAAAAAAD1V8AAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAA9XwAAAAAAP8AAAAAAD18AAAAAA//wAAAAAA9fAAAAAA/VfAAAAAAPfAAAAAA9VV8AAAAAD3wAAAAAPVVXwAAAAA98AAAAAPVVV8AAAAAPfAAAAAD1VVfAAAAAA/wAAAAA9VVXwAAAAAP8AAAAAPVVVfAAAAAD/AAAAAD1VVXwAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVVfAAAAAD/AAAAAD1VVXwAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVVfAAAAAD/AAAAAD1VVXwAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVVfAAAAAD/AAAAAD1VVXwAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVVfAAAAAD/AAAAAD1VVXwAAAAA/wAAAAA9VVV8AAAAAP8AAAAAPVVV8AAAAAD/AAAAAD1VVfAAAAAD3wAAAAAPVVXwAAAAA98AAAAAD1VXwAAAAAPfAAAAAAPVV8AAAAAD18AAAAAA/X8AAAAAA9fAAAAAAD/8AAAAAAPXwAAAAAADwAAAAAAPV8AAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAD1VfAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAA9VVfAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAPVVVXwAAAAAAAAAAAPVVVV8AAAAAAAAAAAPVVVVX8AAAAAAAAAAPVVVVVfwAAAAAAAAA/VVVVVVfwAAAAAAAD/VVVVVVV/8AAAAAAP9VVVVVVVV////////1VVVVVVVVVf//////VVVVVQ=="},
+ {"width" : "53", "buffer":"VVVVVV/////9VVVVVVVVVVX///////1VVVVVVVVf/wAAAAA//VVVVVVVX/AAAAAAAD/VVVVVVX8AAAAAAAAAP1VVVVV/AAAAAAAAAAP1VVVVfAAAAAAAAAAAD1VVVXwAAAAAAAAAAAD1VVVfAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAPVVXwAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAA9XwAAAAAAP/AAAAAAD1fAAAAAAD//AAAAAAPV8AAAAAA9VfAAAAAAPXwAAAAAPVVfAAAAAA9fAAAAAA9VV8AAAAAD3wAAAAAPVVV8AAAAAPfAAAAAA9VVXwAAAAA98AAAAAD1VVfAAAAAD3wAAAAAPVVV8AAAAAPfAAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAA9VVXwAAAAAP8AAAAAD1VVfAAAAAA/wAAAAAPVVV8AAAAAD/AAAAAAPVVfAAAAAAP8AAAAAA9VV8AAAAAA/wAAAAAA9VfAAAAAAD/AAAAAAA//wAAAAAAPfAAAAAAA/8AAAAAAA98AAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAD1V8AAAAAAAMAAAAAAPVV8AAAAAAD8AAAAAA9VV/AAAAAA98AAAAAD1VV/8AAAA/XwAAAAAPVVVf/////1fAAAAAA9VVVV////1V8AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD1//////9VVV8AAAAAPX//////1VVXwAAAAA9fAAAAAPVVVfAAAAAD18AAAAA9VVV8AAAAAPXwAAAAD1VVXwAAAAA9fAAAAAPVVVfAAAAAD18AAAAA9VVV8AAAAAPXwAAAAD1VVXwAAAAA9fAAAAAPVVVfAAAAAPV8AAAAAPVVXwAAAAA9XwAAAAA9VVfAAAAAD1fAAAAAA9VXwAAAAAPV8AAAAAA/f8AAAAAA9XwAAAAAA//AAAAAAPVXwAAAAAAMAAAAAAA9VfAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAD1VVV8AAAAAAAAAAAA9VVVV8AAAAAAAAAAAPVVVVV/AAAAAAAAAAD1VVVVV/wAAAAAAAAD9VVVVVVf8AAAAAAAD/VVVVVVVX/wAAAAAP/VVVVVVVVV////////VVVVVVVVVVX/////9VVVVVU="},
+ {"width" : "20", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/////////////8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA//////////////VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//////////////AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP/////////////1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU="}
+ ]
+}
diff --git a/apps/contourclock/fonts/font-Bangers.json b/apps/contourclock/fonts/font-Bangers.json
new file mode 100644
index 000000000..73f2ca1dd
--- /dev/null
+++ b/apps/contourclock/fonts/font-Bangers.json
@@ -0,0 +1,17 @@
+{
+ "name":"Bangers",
+ "size":"100",
+ "characters":[
+ {"width" : "60", "buffer":"VVVVVVVVVVVVX//VVVVVVVVVVVVVVVVX////VVVVVVVVVVVVVVX/8AA/1VVVVVVVVVVVVV/8AAAA/VVVVVVVVVVVVX8AAAAAP1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVX8AAAAAAA9VVVVVVVVVVfwAAAAAAAPVVVVVVVVVV8AAAAAAAAD1VVVVVVVVXwAAAAAAAAD1VVVVVVVVfAAAAAAAAAA9VVVVVVVV8AAAAAAAAAA9VVVVVVVXwAAAAAAAAAA9VVVVVVVXwAAAAAAAAAAPVVVVVVVfAAAAAAAAAAAPVVVVVVV8AAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAA9VVVXwAAAAAAD/wAAAAA9VVVfAAAAAAA//8AAAAA9VVVfAAAAAAP9VfAAAAAPVVV8AAAAAA/VVXwAAAAPVVV8AAAAAD1VVV8AAAAPVVV8AAAAAD1VVVfAAAAPVVXwAAAAAPVVVVfAAAAPVVXwAAAAA9VVVVXwAAAPVVfAAAAAD1VVVVXwAAAPVVfAAAAAD1VVVVXwAAAPVV8AAAAAPVVVVVXwAAAPVV8AAAAA9VVVVVV8AAA9VV8AAAAA9VVVVVV8AAA9VXwAAAAD1VVVVVV8AAA9VXwAAAAD1VVVVVV8AAA9VXwAAAAPVVVVVVV8AAA9VfAAAAAPVVVVVVV8AAA9VfAAAAAPVVVVVVV8AAA9VfAAAAA9VVVVVVV8AAA9VfAAAAA9VVVVVVV8AAA9V8AAAAA9VVVVVVV8AAA9V8AAAAD1VVVVVVXwAAD1V8AAAAD1VVVVVVXwAAD1V8AAAAD1VVVVVVXwAAD1XwAAAAPVVVVVVVXwAAD1XwAAAAPVVVVVVVXwAAD1XwAAAAPVVVVVVVfAAAD1XwAAAAPVVVVVVVfAAAPVXwAAAA9VVVVVVVfAAAPVXwAAAA9VVVVVVVfAAAPVfAAAAA9VVVVVVV8AAAPVfAAAAA9VVVVVVV8AAA9VfAAAAA9VVVVVVV8AAA9VfAAAAA9VVVVVVXwAAA9VfAAAAD1VVVVVVXwAAA9VfAAAAD1VVVVVVfAAAD1VfAAAAD1VVVVVVfAAAD1VfAAAAD1VVVVVV8AAAD1V8AAAAD1VVVVVV8AAAPVV8AAAAD1VVVVVXwAAAPVV8AAAAD1VVVVVfAAAAPVV8AAAAD1VVVVVfAAAA9VV8AAAAA9VVVVV8AAAA9VV8AAAAA9VVVVXwAAAA9VV8AAAAA9VVVVfAAAAD1VV8AAAAA9VVVV8AAAAD1VV8AAAAAPVVVXwAAAAPVVVfAAAAAD1VV/AAAAAPVVVfAAAAAA9Vf8AAAAA9VVVfAAAAAAP//AAAAAA9VVVfAAAAAAD/wAAAAAD1VVVfAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAPVVVVVVVXwAAAAAAAAAA9VVVVVVVXwAAAAAAAAAD1VVVVVVVV8AAAAAAAAAPVVVVVVVVVfAAAAAAAAA9VVVVVVVVVXwAAAAAAAP1VVVVVVVVVV8AAAAAAD/VVVVVVVVVVVfwAAAAA/1VVVVVVVVVVVX/wAAA/9VVVVVVVVVVVVVf/////VVVVVVVVVVVVVVVf///VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"},
+ {"width" : "40", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/VVVVVVVVVVf//1VVVVVVVV///89VVVVVVf///AAPVVVVX///8AAAPVVVf///AAAAAD1Vf//wAAAAAAA9V//AAAAAAAAAPVfAAAAAAAAAAPVXwAAAAAAAAAD1V8AAAAAAAAAA9VfAAAAAAAAAAPVfAAAAAAAAAAD1XwAAAAAAAAAA9V8AAAAAAAAAA9VfAAAAAAAAAAPVXwAAAAAAAAAD1V8AAAAAAAAAA9VfAAAAAAAAAAPVXwAAAAAAAAAPVXwAAAAAAAAAD1V8AAAAAAAAAA9VfAAAAAAAAAAPVXwAAAAAAAAAD1V8AAAAAAAAAD1VfAAAAAAAAAA9VXwAAAAAAAAAPVXwAD/8AAAAAD1V8P///wAAAAA9Vf//1VfAAAAA9VX/VVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAD1VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVVfAAAAA9VVVVVVXwAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAD1VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVVfAAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVV8AAAAAPVVVVVVfAAAAAD1VVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVVfAAAAAPVVVVVVXwAAAAD1VVVVVXwAAAAA9VVVVVV8AAAAAPVVVVVVfAAAAAD1VVVVVXwAAAAD1VVVVVV8AAAAA9VVVVVV8AAAAAPVVVVVVfAAAAAD1VVVVVXwAAAAA9VVVVVV8AAAAAPVVVVVVfAAAAAPVVVVVVfAAAAAD1VVVVVXwAAAAA9VVVVVV8AAAAAPVVVVVVfAAAAAD1VVVVVXwAAAAA9VVVVVXwAAAAD/VVVVVV8AAAD//VVVVVVfAAD//1VVVVVVXwD//1VVVVVVVV///1VVVVVVVVV//1VVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVQ=="},
+ {"width" : "65", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///1VVVVVVVVVVVVVVVV//////VVVVVVVVVVVVVVV//AAAD/9VVVVVVVVVVVVV/wAAAAAP9VVVVVVVVVVVV/wAAAAAAA/VVVVVVVVVVV/wAAAAAAAA/VVVVVVVVVVfwAAAAAAAAAPVVVVVVVVVXwAAAAAAAAAAPVVVVVVVVX8AAAAAAAAAAAPVVVVVVVV/AAAAAAAAAAAA9VVVVVVVXwAAAAAAAAAAAA9VVVVVVV8AAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAA9VVVXwAAAAAAAMAAAAAAAD1VVVfAAAAAAA//AAAAAAAPVVVXwAAAAAAP9/AAAAAAA9VVVfAAAAAAD1VfAAAAAAD1VVV8AAAAAA9VVfAAAAAAPVVVXwAAAAAPVVV8AAAAAA9VVVfAAAAAA9VVV8AAAAAD1VVXwAAAAAPVVVXwAAAAAPVVVfAAAAAA9VVVfAAAAAA9VVV8AAAAAD1VVV8AAAAAD1VVXwAAAAAPVVVXwAAAAAPVVVfAAAAAA9VVVfAAAAAA9VVV8AAAAAD1VVV8AAAAAPVVVXwAAAAD/VVVfAAAAAA9VVVfAA////9VVXwAAAAAD1VVV//////VVVVfAAAAAAPVVVX//1VVVVVVXwAAAAAD1VVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVX8AAAAAAAD1VVVVVVVVVVV/AAAAAAAA9VVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVVXwAAAAAAAD1VVVVVVVVVVV8AAAAAAAA9VVVVVVVVVVV/AAAAAAAAD1VVVVVVVVVVfwAAAAAAAA9VVVVVVVVVVXwAAAAAAAAPVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVfAAAAAAAAA9VVVVVVVVVVXwAAAAAAAA/VVVVVVVVVVV8AAAAAAAAP1VVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVfAAAAAAAAP1VVVVVVVVVVXwAAAAAAAD9VVVVVVVVVVV8AAAAAAAA9VVVVVVVVVVVfAAAAAAAA/VVVVVVVVVVVXwAAAAAAAP1VVVVVVVVVVV8AAAAAAAP1VVVVVVVVVVVfAAAAAAAD9VVVVVVVVVVVV8AAAAAAD9VVVVVVVVVVVVfAAAAAAA/VVVVVVVVVVVVXwAAAAAA/VVVVVVVVVVVVV8AAAAAAP1VVVVVVVVVVVVXwAAAAAD1VVVVVV//1VVVV8AAAAAA9VVf//////VVVVXwAAAAAA///////wA9VVVV8AAAAAAA//8AAAAAD1VVVXwAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAD9VVVV8AAAAAAAAAD//////1VVVXwAAAAAA/////////VVVVVfAA////////VVVVVVVVVVV///////1VVVVVVVVVVVVVX//1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "62", "buffer":"VVVVVVVVVVVVVVVV////1VVVVVVVX////////////1VVVX///////////wAAAPVVVVf///AAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAD1VVVVfAAA//wAAAAAAAAPVVVVV//////wAAAAAAAA9VVVVX///1VXwAAAAAAAD1VVVVVVVVVV8AAAAAAAAPVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVXwAAAAAAAAP1VVVVVVVVV8AAAAAAAAD9VVVVVVVVVfAAAAAAAAD9VVVVVVVVVfwAAAAAAAD/VVVVVVVVVX8AAAAAAAA/VVVVVVVVVV8AAAAAAAA/VVVVVVVVVVfAAAAAAAA/1VVVVVVVVVfwAAAAAAAP1VVVVVVVVVX8AAAAAAAP1VVVVVVVVVV8AAAAAAAP9VVVVVVVVVV/AAAAAAAP9VVVVVVVVVVfwAAAAAAD9VVVVVVVVVVfwAAAAAAD9VVVVVVVVVVX8AAAAAAA/VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAP1VVVVVVVVVVXwAAAAAAAP/1VVVVVVVVV8AAAAAAAAD/9VVVVVVVVXwAAAAAAAAAD/VVVVVVVVfAAAAAAAAAAA/1VVVVVVV8AAAAAAAAAAAP1VVVVVVXwAAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVVfAAAD/8AAAAAAAAD1VVVV8AP////8AAAAAAAPVVVVX////VV//AAAAAAAPVVVVf/9VVVVV/AAAAAAA9VVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVXwAAAAA9VVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVfAAAAAD1VVVVVf//9VVVXwAAAAA9VVf//////9VVV8AAAAAD1VV///8AAD1VVfAAAAAA9VVfAAAAAAD1VXwAAAAAD1VV8AAAAAAD1X8AAAAAA9VVXwAAAAAAD//AAAAAAD1VVfAAAAAAAD/AAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAPVVVVVVV8AAAAAAAAAAAP1VVVVVVV8AAAAAAAAAAD9VVVVVVVV8AAAAAAAAAD9VVVVVVVVV8AAAAAAAAD/VVVVVVVVVV/AAAAAAAD/VVVVVVVVVVV/wAAAAAP/VVVVVVVVVVVVf///////VVVVVVVVVVVVVX/////9VVVVVVVVVVU="},
+ {"width" : "59", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/1VVVVVVVVVVVVf//////VVVVVVVVVVVVV////8D1VVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVV8AAAAD1VVVVVf/1VVVVXwAAAAPVVVf////VVVVVfAAAAA9V////8A9VVVVXwAAAAD1f/8AAAD1VVVVfAAAAA9V8AAAAAPVVVVV8AAAAD1XwAAAAA9VVVVXwAAAAPV8AAAAAPVVVVV8AAAAD1XwAAAAA9VVVVXwAAAAPVfAAAAAD1VVVVfAAAAA9V8AAAAAPVVVVXwAAAAPVXwAAAAA9VVVVfAAAAA9V8AAAAAD1VVVV8AAAAD1XwAAAAA9VVVVXwAAAA9VfAAAAAD1VVVV8AAAAD1V8AAAAAPVVVVXwAAAAPVXwAAAAA9VVVVfAAAAA9VfAAAAAD1VVVXwAAAAPVXwAAAAAPVVVVfAAAAA9VfAAAAAD1VVVV8AAAAD1V8AAAAAPVVVVfAAAAA9VXwAAAAA9VVVV8AAAAD1VfAAAAAD1VVVXwAAAAPVV8AAAAAPVVVVfAAAAD1VfAAAAAA9VVVXwAAAAPVV8AAAAAD1VVVfAAAAA9VXwAAAAA9VVVV8AAAAD1VfAAAAAD1VVVfAAAAA9VV8AAAAAPVVVV8AAAAD1VXwAAAAA9VVVXwAAAAPVV8AAAAAD1VVV8AAAAD1VXwAAAAAPVVVXwAAAAPVVfAAAAAD1VVVfAAAAA9VV8AAAAAPVVVV8AAAAD1VXwAAAAA9VVVfAAAAA9VVfAAAAAD1VVV8AAAAD1VXwAAAAAPVVVXwAAAAPVVfAAAAAD1VVV8AAAAD1VV8AAAAAPVVVXwAAAAPVVXwAAAAA9VVVfAAAAA9VVfAAAAAD1VVXwAAAAA///wAAAAAD//VfAAAAAA//8AAAAAAD//V8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAPVVV8AAAAA/wAAAAAAD/9VVXwD/////wAAAAAA//1VVX/////1XwAAAAAPVVVVVf/VVVVVfAAAAAD1VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVXwAAAAA9VVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVXwAAAAAPVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVfAAAAAAPVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVXwAAAA//VVVVVVVVVVVVfAAA///1VVVVVVVVVVVV8A///1VVVVVVVVVVVVVX///1VVVVVVVVVVVVVVVf/1VVVVVVVVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "57", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX////VVVVVVf////////////VVVX//////////8AAAPVVVf//wAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAD1VVfAAAAAAAD///////1VVfAAAAAA/////////VVVfAAAAAD/9VVVVVVVVVVfAAAAAPVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVV8AAAAA9VVVVVVVVVVVV8AAAAA9VVVVVVVVVVVV8AAAAA9VVVVVVVVVVVV8AAAAA9VVVVVVVVVVVV8AAAAA9VVVVVVVVVVVV8AAAAA9VVVVVVVVVVVXwAAAAAP/1VVVVVVVVVXwAAAAAD///1VVVVVVVXwAAAAAAAP//9VVVVVVXwAAAAAAAAAP/1VVVVVXwAAAAAAAAAAD/VVVVVXwAAAAAAAAAAAP9VVVVfAAAAAAAAAAAAA/VVVVfAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAPVV8AAP///8AAAAAAAAPVV8P//////8AAAAAAAPVV///1VVVX/AAAAAAAPVV/1VVVVVVXwAAAAAAPVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVXwAAAAA9V//1VVVVVVVXwAAAAA9V/////1VVVVXwAAAAA9V8AP///1VVVXwAAAAA9V8AAAAP1VVVfAAAAAD1V8AAAAD1VVVfAAAAAD1V8AAAAD1VVV8AAAAAD1V8AAAAD1VVV8AAAAAPVV8AAAAD1VVXwAAAAAPVV8AAAAA9VVfAAAAAA9VV8AAAAAPVX8AAAAAA9VV8AAAAAD//wAAAAAA9VV8AAAAAA/8AAAAAAD1VV8AAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAA9VVVVVXwAAAAAAAAAAD1VVVVVXwAAAAAAAAAAPVVVVVVV8AAAAAAAAAA9VVVVVVVfAAAAAAAAAD1VVVVVVVfAAAAAAAAAPVVVVVVVVXwAAAAAAAD9VVVVVVVVV8AAAAAAAP1VVVVVVVVVfwAAAAAD9VVVVVVVVVVX/AAAAA/1VVVVVVVVVVVf/AAD/9VVVVVVVVVVVVV/////VVVVVVVVVVVVVVV//9VVVVVVVVVVV"},
+ {"width" : "59", "buffer":"VVVVVVVVVVVX///1VVVVVVVVVVVVVVf/////VVVVVVVVVVVVVf/AAAD/VVVVVVVVVVVVf8AAAAAPVVVVVVVVVVVf8AAAAAAPVVVVVVVVVVX8AAAAAAAPVVVVVVVVVX8AAAAAAAAPVVVVVVVVV/AAAAAAAAAPVVVVVVVVfAAAAAAAAAAPVVVVVVVXwAAAAAAAAAA9VVVVVVV8AAAAAAAAAAA9VVVVVVfAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVVXwAAAAAAA/AAAAAA9VVV8AAAAAAAP/AAAAAD1VVXwAAAAAAD1fAAAAD/VVV8AAAAAAA9VfAAAD/VVVXwAAAAAAPVVfAAA/VVVV8AAAAAAD1VV8AA/VVVVXwAAAAAAPVVXwA/1VVVV8AAAAAAD1VVfA/1VVVVXwAAAAAAPVVVf/1VVVVV8AAAAAAD1VVV/1VVVVVXwAAAAAAPVVVX1VVVVVVfAAAAAAD1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVV8AAAAAAPVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVV8AAAAAAPVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVV8AAAAAAD1VVVVVVVVVVXwAAAAAA9VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVV8AAAAAAPVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVV8AAAAAAPVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVfAAAAAAD3////1VVVVVV8AAAAAAD//////VVVVVXwAAAAAADAAAAD/VVVVV8AAAAAAAAAAAAAP1VVVXwAAAAAAAAAAAAAP1VVVfAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVXwAAAAAAP///8AAAAAPVfAAAAAAD/////AAAAA9V8AAAAAA9VVVV/AAAAD1XwAAAAAPVVVVVfAAAAPVfAAAAAA9VVVVV8AAAA9V8AAAAAD1VVVVV8AAAD1XwAAAAAPVVVVVXwAAAPVfAAAAAA9VVVVVfAAAA9V8AAAAAA9VVVVV8AAAD1V8AAAAAD1VVVVfAAAAPVXwAAAAAPVVVVV8AAAA9VfAAAAAA9VVVVfAAAAD1V8AAAAAD1VVVV8AAAAPVXwAAAAAD1VVVfAAAAA9VfAAAAAAPVVVfwAAAAD1VfAAAAAAPVVX8AAAAAPVV8AAAAAAP1/8AAAAAD1VXwAAAAAAP//AAAAAAPVVfAAAAAAADwAAAAAAA9VVfAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAA9VVVVVVXwAAAAAAAAAA/VVVVVVVX8AAAAAAAAAP1VVVVVVVX8AAAAAAAAP1VVVVVVVVV/AAAAAAAP9VVVVVVVVVV/8AAAAA/9VVVVVVVVVVVf/8AA//9VVVVVVVVVVVVV/////1VVVVVVVVVVVVVVV//1VVVVVVVVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "53", "buffer":"VVVVVVVVVVVVVV///9VVVVVVVVVV///////VVVVVVVf//////wAA9VVVf//////wAAAAAD1VVV///8AAAAAAAAA9VVVfAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAPVVVXwAAAAAAAAAAAD1VVVfAAAAAAAAAAAAPVVVV8AAAAAAAAAAAA9VVVXwAAAAAAAAAAAPVVVV8AAAAAAAAAAAA9VVVXwAAAAAAAAAAAD1VVVfAAAAAAAAAAAAPVVVV8AAAAAAAAAAAD1VVVXwAAAAAAAAAAAPVVVVfAAAAAAAAAAAA9VVVV8AAAAAAAAAAAPVVVVfAAAAAAAAAAAA9VVVV8AAAAAAAAAAAD1VVVXwAAAAAAAAAAA9VVVVfAAAAAAAAAAAD1VVVV8AAAAAAAAAAAPVVVVXwAAA/AAAAAAD1VVVV8AA///AAAAAAPVVVVXz///1fAAAAAA9VVVVf//1VV8AAAAAPVVVVV/VVVVXwAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAA9VVVVVVVVVVfAAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAPVVVVVVVVVVXwAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAA9VVVVVVVVVV8AAAAAD1VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVXwAAAAAPVVVVVVVVVVfAAAAAA9VVVVVVVVVV8AAAAP/1VVVVVVVVVXwD////9VVVVVVVVVV/////9VVVVVVVVVVVX//VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "69", "buffer":"VVVVVVVVVVVVV//////VVVVVVVVVVVVVVVV////////VVVVVVVVVVVVVVf/AAAAAA/1VVVVVVVVVVVVX/AAAAAAAA/VVVVVVVVVVVV/wAAAAAAAAP1VVVVVVVVVVf8AAAAAAAAAA9VVVVVVVVVV/AAAAAAAAAAA9VVVVVVVVVfwAAAAAAAAAAAPVVVVVVVVV/AAAAAAAAAAAAD1VVVVVVVXwAAAAAAAAAAAAD1VVVVVVVfAAAAAAAAAAAAAA9VVVVVVV8AAAAAAAAAAAAAA9VVVVVVXwAAAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAAAPVVVVXwAAAAAAD//wAAAAAAPVVVVXwAAAAAA////AAAAAAPVVVVfAAAAAAD9VVfwAAAAAPVVVVfAAAAAAPVVVV8AAAAAPVVVVfAAAAAA9VVVVfAAAAAPVVVVfAAAAAD1VVVVfAAAAAPVVVV8AAAAAPVVVVVXwAAAAPVVVV8AAAAAPVVVVVXwAAAA9VVVV8AAAAA9VVVVVXwAAAA9VVVV8AAAAA9VVVVVfAAAAA9VVVV8AAAAA9VVVVVfAAAAD1VVVV8AAAAA9VVVVVfAAAAD1VVVV8AAAAA9VVVVV8AAAAPVVVVV8AAAAA9VVVVXwAAAAPVVVVVfAAAAA9VVVVXwAAAA9VVVVVfAAAAA9VVVVfAAAAA9VVVVVfAAAAAPVVVV8AAAAD1VVVVVfAAAAAD1VVfwAAAAPVVVVVVXwAAAAA9VV/AAAAA9VVVVVVXwAAAAAP//wAAAAD1VVVVVVV8AAAAAD//AAAAAPVVVVVVVVfAAAAAAAAAAAAD9VVVVVVVVfAAAAAAAAAAAAP1VVVVVVVVXwAAAAAAAAAAA9VVVVVVVVVV8AAAAAAAAAAA9VVVVVVVVVVfAAAAAAAAAAA9VVVVVVVVVX8AAAAAAAAAAAPVVVVVVVVV/wAAAAAAAAAAAD1VVVVVVVX8AAAAAAAAAAAAD1VVVVVVVfAAAAAAAAAAAAAA9VVVVVVX8AAAAAAAAAAAAAA9VVVVVVfwAAAAAAAAAAAAAAPVVVVVVfAAAAAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAAAAAD1VVVVXwAAAAAAP//AAAAAAD1VVVVfAAAAAAD///8AAAAAD1VVVV8AAAAAA/1VV/AAAAAA9VVVV8AAAAAD9VVVXwAAAAA9VVVXwAAAAA/VVVVV8AAAAA9VVVXwAAAAD9VVVVV8AAAAA9VVVfAAAAAPVVVVVVfAAAAA9VVVfAAAAA9VVVVVVfAAAAAPVVV8AAAAD1VVVVVVXwAAAAPVVV8AAAAD1VVVVVVXwAAAAPVVXwAAAAPVVVVVVVXwAAAAPVVXwAAAA9VVVVVVVXwAAAAPVVXwAAAA9VVVVVVVXwAAAAPVVXwAAAD1VVVVVVVXwAAAAPVVfAAAAD1VVVVVVVXwAAAAPVVfAAAAD1VVVVVVVXwAAAA9VVfAAAAD1VVVVVVVXwAAAA9VVfAAAAD1VVVVVVVfAAAAA9VVfAAAAD1VVVVVVVfAAAAA9VV8AAAAD1VVVVVVV8AAAAA9VV8AAAAD1VVVVVVV8AAAAA9VV8AAAAA9VVVVVVXwAAAAD1VV8AAAAA9VVVVVVfAAAAAD1VV8AAAAAPVVVVVX8AAAAAPVVV8AAAAAD9VVVV/wAAAAAPVVV8AAAAAA/////8AAAAAA9VVV8AAAAAAD////AAAAAAA9VVV8AAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAAA9VVVVVV8AAAAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAAAAAPVVVVVVVfAAAAAAAAAAAAAA9VVVVVVVfAAAAAAAAAAAAAP1VVVVVVVXwAAAAAAAAAAAA/VVVVVVVVV/AAAAAAAAAAAP1VVVVVVVVVf8AAAAAAAAAD/VVVVVVVVVVV/wAAAAAAAD/1VVVVVVVVVVVX/wAAAAAD/9VVVVVVVVVVVVVf///////9VVVVVVVVVVVVVVVf/////9VVVVVVVVVVV"},
+ {"width" : "58", "buffer":"VVVVVVV/////9VVVVVVVVVVVVf///////VVVVVVVVVVV/8AAAAAP/VVVVVVVVVX/AAAAAAAD9VVVVVVVVX8AAAAAAAAD9VVVVVVVfwAAAAAAAAAP1VVVVVVfwAAAAAAAAAAPVVVVVVfAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VXwAAAAAAA/wAAAAAAPVXwAAAAAAD//wAAAAAD1V8AAAAAAP9V/AAAAAAPVfAAAAAAP1VV8AAAAAD1fAAAAAAPVVVXwAAAAA9XwAAAAAPVVVV8AAAAAD18AAAAAPVVVVXwAAAAA9fAAAAAD1VVVV8AAAAAPXwAAAAD1VVVVfAAAAAD18AAAAA9VVVVXwAAAAAPfAAAAAPVVVVVfAAAAAD/AAAAAD1VVVVXwAAAAA/wAAAAA9VVVVV8AAAAAP8AAAAAPVVVVV8AAAAAD/AAAAAD1VVVVfAAAAAA/wAAAAAPVVVVXwAAAAAP8AAAAAA9VVVXwAAAAAD3wAAAAAD1VVXwAAAAAA98AAAAAAP1VfwAAAAAAPfAAAAAAA///wAAAAAAD3wAAAAAAA//AAAAAAAA98AAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAD1VV/AAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAPVVVVfwAAAAA8AAAAAAD1VVVV/8AAAP/wAAAAAA9VVVVV/////9fAAAAAAPVVVVVVf///VXwAAAAAD1VVVVVVVVVVV8AAAAAD1VVVVVVVVVVV8AAAAAA9VVVVVVVVVVVfAAAAAAPVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVV8AAAAAA9VVVVVVVVVVV8AAAAAA9VVVVVVVVVVV8AAAAAAPVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAPVVVVVVVVVVfwAAAAAAPVVVVVVVVVVfwAAAAAAD1VVVVVVVVVfAAAAAAAD1VVVVVVVVV/AAAAAAAD1VVVVVVVVf/AAAAAAAA9VVVVVVV//8AAAAAAAA9VVVVVVV//AAAAAAAAAPVVVVVVVfAAAAAAAAAAPVVVVVVVXwAAAAAAAAAPVVVVVVVV8AAAAAAAAAPVVVVVVVVfAAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVV8AAAAAAAAD1VVVVVVVVfAAAAAAAAD1VVVVVVVVXwAAAAAAAD1VVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAD1VVVVVVVVVfAAAAAAAP1VVVVVVVVVXwAAAAAAP1VVVVVVVVVV8AAAAAAPVVVVVVVVVVVfAAAAAA/VVVVVVVVVVVXwAAAAD/VVVVVVVVVVVV8AAAAP9VVVVVVVVVVVVfAAAA/1VVVVVVVVVVVVXwAAP/VVVVVVVVVVVVVV8AD/9VVVVVVVVVVVVVVf///VVVVVVVVVVVVVVVX//1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="},
+ {"width" : "28", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX9VVVVVVf//VVVX////z1VVX///AA9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAD1VVV8AAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAD1VVV8AAAA9VVVfAAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAAPVVVfAAAAPVVVXwAAAD1VVV8AAAA9VVVfAAAAPVVVf/////1VVX/////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/////1VVX/////9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAAPVVVfAAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AAAAPVVVfAAAAD1VVXwAAAA9VVV8AD//9VVV8P////VVVf//1VVVVVX/VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="}
+ ]
+}
diff --git a/apps/contourclock/font-BarlowCond.json b/apps/contourclock/fonts/font-BarlowCond.json
similarity index 100%
rename from apps/contourclock/font-BarlowCond.json
rename to apps/contourclock/fonts/font-BarlowCond.json
diff --git a/apps/contourclock/font-BebasNeue.json b/apps/contourclock/fonts/font-BebasNeue.json
similarity index 100%
rename from apps/contourclock/font-BebasNeue.json
rename to apps/contourclock/fonts/font-BebasNeue.json
diff --git a/apps/contourclock/font-Dekko.json b/apps/contourclock/fonts/font-Dekko.json
similarity index 100%
rename from apps/contourclock/font-Dekko.json
rename to apps/contourclock/fonts/font-Dekko.json
diff --git a/apps/contourclock/font-DinAlternate.json b/apps/contourclock/fonts/font-DinAlternate.json
similarity index 100%
rename from apps/contourclock/font-DinAlternate.json
rename to apps/contourclock/fonts/font-DinAlternate.json
diff --git a/apps/contourclock/font-Impact.json b/apps/contourclock/fonts/font-Impact.json
similarity index 100%
rename from apps/contourclock/font-Impact.json
rename to apps/contourclock/fonts/font-Impact.json
diff --git a/apps/contourclock/fonts/font-LuckiestGuy.json b/apps/contourclock/fonts/font-LuckiestGuy.json
new file mode 100644
index 000000000..3b7eb45f3
--- /dev/null
+++ b/apps/contourclock/fonts/font-LuckiestGuy.json
@@ -0,0 +1,17 @@
+{
+ "name":"LuckiestGuy",
+ "size":"100",
+ "characters":[
+ {"width" : "65", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVVVVVVVVVVVVVVVVVVV////9VVVVVVVVVVVVVVVX//8///VVVVVVVVVVVVVVX/wAAAA/1VVVVVVVVVVVVX/AAAAAAP9VVVVVVVVVVVV/AAAAAAAD9VVVVVVVVVVVfAAAAAAAAA/VVVVVVVVVVXwAAAAAAAAA/VVVVVVVVVX8AAAAAAAAAAPVVVVVVVVVfAAAAAAAAAAAPVVVVVVVVXwAAAAAAAAAAAPVVVVVVVV8AAAAAAAAAAAAPVVVVVVVfAAAAAAAAAAAAA9VVVVVVXwAAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAAD1VfAAAAAAAAP8AAAAAAAAPVV8AAAAAAAP//AAAAAAAAPVfAAAAAAAD9V/AAAAAAAA9V8AAAAAAA9VVfAAAAAAAD1XwAAAAAAPVVVfAAAAAAAPVfAAAAAAD1VVVfAAAAAAAPV8AAAAAAPVVVVfAAAAAAA9fAAAAAAD1VVVV8AAAAAAD18AAAAAAPVVVVV8AAAAAAPXwAAAAAD1VVVVXwAAAAAA9fAAAAAAPVVVVVXwAAAAAD18AAAAAD1VVVVVfAAAAAAD3wAAAAAPVVVVVV8AAAAAAP8AAAAAA9VVVVVV8AAAAAA/wAAAAAD1VVVVVXwAAAAAD/AAAAAA9VVVVVVfAAAAAAP8AAAAAD1VVVVVV8AAAAAA/wAAAAAPVVVVVVXwAAAAAD/AAAAAA9VVVVVVfAAAAAAP8AAAAAD1VVVVVVfAAAAAA/wAAAAAPVVVVVVV8AAAAAD/AAAAAA9VVVVVVXwAAAAAP8AAAAAD1VVVVVVfAAAAAA/wAAAAAPVVVVVVV8AAAAAD/AAAAAA9VVVVVVXwAAAAAP8AAAAAD1VVVVVV8AAAAAA/wAAAAAPVVVVVVXwAAAAAD3wAAAAA9VVVVVVfAAAAAAPfAAAAAD1VVVVVV8AAAAAD18AAAAAD1VVVVVXwAAAAAPXwAAAAAPVVVVVV8AAAAAA9fAAAAAA9VVVVVXwAAAAAD18AAAAAA9VVVVVfAAAAAAPV8AAAAAD1VVVVXwAAAAAA9XwAAAAAPVVVVVfAAAAAAPVfAAAAAAPVVVVXwAAAAAA9V8AAAAAA9VVVVfAAAAAAD1V8AAAAAA9VVVXwAAAAAAPVXwAAAAAA9VVVfAAAAAAD1VfAAAAAAA9VVXwAAAAAAPVVfAAAAAAA9VX8AAAAAAA9VV8AAAAAAA///AAAAAAAPVVXwAAAAAAA//AAAAAAAA9VVXwAAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAAA9VVVVVV8AAAAAAAAAAAAAPVVVVVVV8AAAAAAAAAAAAA9VVVVVVXwAAAAAAAAAAAAPVVVVVVVXwAAAAAAAAAAAD1VVVVVVVXwAAAAAAAAAAA9VVVVVVVVXwAAAAAAAAAAPVVVVVVVVVXwAAAAAAAAAD1VVVVVVVVVX8AAAAAAAAA9VVVVVVVVVVX/AAAAAAAA/VVVVVVVVVVVV/AAAAAAA/1VVVVVVVVVVVVf8AAAAA/1VVVVVVVVVVVVVf/wAAD/1VVVVVVVVVVVVVVV/////1VVVVVVVVVVVVVVVVX///VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "41", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/9VVVVVVVVVVV////////1VVVVfAA//////VVVVXwAAAAAAA9VVVV8AAAAAAAD1VVVfAAAAAAAAPVVVXwAAAAAAAA9VVV8AAAAAAAAD1VVfAAAAAAAAAPVVfwAAAAAAAAA9VX8AAAAAAAAAD1V8AAAAAAAAAAPVfAAAAAAAAAAA9XwAAAAAAAAAAD18AAAAAAAAAAAPfAAAAAAAAAAAA/wAAAAAAAAAAAD3wAAAAAAAAAAAPfAAAAAAAAAAAA98AAAAAAAAAAAD18AAAAAAAAAAAPXwAAAAAAAAAAA9fAAAAAAAAAAAD1fAAAAAAAAAAAPV8AAAAAAAAAAA9XwAAAAAAAAAAD1XwAAAAAAAAAAPVfAAAAAAAAAAA9V8AAAAAAAAAAD1V8AAAAAAAAAAPVXwAAAAAAAAAA9VXwADAAAAAAAD1VfAA/AAAAAAAPVV8APfAAAAAAA9VV8D18AAAAAAPVVXz9XwAAAAAA9VVf/VfAAAAAAD1VVfVV8AAAAAAPVVV1VXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAPVVVVVV8AAAAAA9VVVVVXwAAAAAD1VVVVVfAAAAAAPVVVVVV8AAAAAA9VVVVVXwAAAAAD1VVVVVfAAAAAAPVVVVVV8AAAAAA9VVVVVXwAAAAAD1VVVVVfAAAAAAPVVVVVV8AAAAAA9VVVVVXwAAAAAD1VVVVVfAAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVfAAAAAAD1VVVVV8AAAAAAPVVVVVXwAAAAAA9VVVVVf///////1VVVVVX//////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "52", "buffer":"VVVVVVVVVVVVVVVVVVVVVVf////VVVVVVVVVVVf//////1VVVVVVVVV//AAAAD/1VVVVVVVX/AAAAAAA/1VVVVVVX8AAAAAAAA/1VVVVVfwAAAAAAAAA/VVVVVfwAAAAAAAAAA9VVVVfAAAAAAAAAAAD1VVVXwAAAAAAAAAAAPVVVV8AAAAAAAAAAAA9VVVfAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAPVVV8AAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAPVVfAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAD1VfAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAA9VXwAADwAAAAAAAAAPVV8AD///AAAAAAAAD1VfAP/1/8AAAAAAAA9VXwP1VVXwAAAAAAAD1V8/VVVVfAAAAAAAA9Vf/VVVVV8AAAAAAAPVV9VVVVVfAAAAAAAD1VdVVVVVV8AAAAAAA9VVVVVVVVfAAAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVV8AAAAAAD1VVVVVVVV8AAAAAAA9VVVVVVVVfAAAAAAA9VVVVVVVVfAAAAAAAPVVVVVVVVfAAAAAAAPVVVVVVVVfAAAAAAAD1VVVVVVVXwAAAAAAD1VVVVVVVXwAAAAAAD1VVVVVVVXwAAAAAAA9VVVVVVVfwAAAAAAA9VVVVVVVfwAAAAAAA9VVVVVVVfAAAAAAAA9VVVVVVVfAAAAAAAA9VVVVVVV/AAAAAAAA9VVVVVVV/AAAAAAAA9VVVVVVX8AAAAAAAA9VVVVVVf8AAAAAAAA9VVVVVV/wAAAAAAAAD/////X/AAAAAAAAAAP////38AAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAD1/////AAAAAAAAAAA9X//////////wAAAAPVVVVVX///////////1VVVVVVVVVVV/////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="},
+ {"width" : "54", "buffer":"VVVVX//////1VVVVVVVVVV////////1VVVVVVVVf8AAAAAAP/VVVVVVVX/AAAAAAAAP9VVVVVV/wAAAAAAAAA/VVVVVX8AAAAAAAAAAD1VVVVfAAAAAAAAAAAA9VVVX8AAAAAAAAAAAAPVVVfwAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAA9VfAAAD//wAAAAAAAA9VfAAD////AAAAAAAA9VfAA/9VVfwAAAAAAA9VfAP9VVVV8AAAAAAA9VfA/VVVVVfAAAAAAA9VX/1VVVVVXwAAAAAA9VX/VVVVVVV8AAAAAA9VX1VVVVVVV8AAAAAA9VX1VVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVXwAAAAAA9VVVVVVVVVXwAAAAAA9VVVVVVVVVfAAAAAAD1VVVVVVVVVfAAAAAAD1VVVVVVVVX8AAAAAAD1VVVVVVVVfwAAAAAAPVVVVVVVV/8AAAAAAAPVVVVVX///wAAAAAAA9VVVVVX//AAAAAAAAD1VVVVVXwAAAAAAAAAD1VVVVVXwAAAAAAAAAPVVVVVVXwAAAAAAAAA9VVVVVVXwAAAAAAAAAPVVVVVVXwAAAAAAAAAD1VVVVVXwAAAAAAAAAA9VVVVVXwAAAAAAAAAAPVVVVVXwAAAAAAAAAAPVVVVVXwAAAAAAAAAAD1VVVVXwAAAAAAAAAAD1VVVVXwAAAAAAAAAAA9VVVVXwAAAAAAAAAAA9VVVVXwAAAAAAAAAAA9VVVVXw//AAAAAAAAA9VVVVX///8AAAAAAAAPVVVVX/VV/wAAAAAAAPVVVVVVVVX8AAAAAAAPVVVVVVVVVfAAAAAAAPVVVVVVVVVXwAAAAAAPVVVVVVVVVV8AAAAAAPX1VVVVVVVV8AAAAAAPX9VVVVVVVV8AAAAAAPX/VVVVVVVV8AAAAAAPXz9VVVVVVV8AAAAAAPXw/1VVVVVV8AAAAAAPXwD/VVVVVXwAAAAAAPfAAP9VVVVfAAAAAAAPfAAA//VVX8AAAAAAAPfAAAD////wAAAAAAAPfAAAAA//8AAAAAAAAPfAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAA9VV/AAAAAAAAAAAAAD1VVX8AAAAAAAAAAAAP1VVV/AAAAAAAAAAAA9VVVVX8AAAAAAAAAAP1VVVVV/wAAAAAAAAA/VVVVVVX/wAAAAAAA/1VVVVVVVf/wAAAAAP/VVVVVVVVVf//AAP//VVVVVVVVVVVf/////1VVVVVVVVVVVVV//1VVVVVVVV"},
+ {"width" : "56", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///////1VVVVVVVVVVf///////VVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAD1VVV//////9fAAAAAAPVVVX//////18AAAAAA9VVVfAAAAAPXwAAAAAD1VVXwAAAAA9fAAAAAAPVVVfAAAAAD18AAAAAA9VVV8AAAAA9XwAAAAAD1VVXwAAAAD1fAAAAAAPVVVfAAAAAPV8AAAAAA9VVV8AAAAA9XwAAAAAD1VVXwAAAAD1fAAAAAAPVVV8AAAAAPV8AAAAAA9VVXwAAAAA9XwAAAAAD1VVfAAAAAPVfAAAAAAPVVV8AAAAA9V8AAAAAA9VVXwAAAAD1XwAAAAAD1VVfAAAAAPVfAAAAAAPVVV8AAAAA9V8AAAAAA9VVXwAAAAD1fAAAAAAD1VV8AAAAAPV8AAAAAAPVVXwAAAAD1XwAAAAAA9VVfAAAAAPVfAAAAAAD1VV8AAAAA9V8AAAAAAPVVXwAAAAD1XwAAAAAA9VVfAAAAAPVfAAAAAAD1VV8AAAAA9V8AAAAAAPVVfAAAAAD1XwAAAAAA9VV8AAAAA9VfAAAAAAD1VXwAAAAD1V8AAAAAAPVVfAAAAAPVXwAAAAAA9VV8AAAAA9VfAAAAAAD1VXwAAAAD1V8AAAAAAPVVfAAAAAPVXwAAAAAA9VV8AAAAD1VfAAAAAAPVVfAAAAAPVV8AAAAAA9VV8AAAAA9VXwAAAAAD1VXwAAAAD1VfAAAAAAPVVfAAAAAPVV8AAAAAA9VV8AAAAA9VXwAAAAAD1VXwAAAAD1VfAAAAAAD31fAAAAAPVV8AAAAAAD/XwAAAAAP//AAAAAAAD9fAAAAAAP/wAAAAAAAD18AAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAP8AAAAP///wAAAAAAAP//////////wAAAAAAD9f////9VVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAD1VVVVVVVVVVfAAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAAA9VVVVVVVVVVfAAAAAAD1VVVVVVVVVV8AAAAAAPVVVVVVVVVVXwAAAAP/9VVVVVVVVVVfAP/////VVVVVVVVVVV/////9VVVVVVVVVVVVX/9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "55", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV9VVVVVVVf//////////VVVV//////////////1VVVf///AAAAAAAAAA9VVVXwAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAD1VVVfAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAD1VVVfAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAPVVVfAAAAAD////AAAD1VVXwAAAAD////////9VVV8AAAAD1VVVX////VVVfAAAAA9VVVVVVVVVVVXwAAAAPVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVfAAAAA9VVVVVVVVVVVXwAAAAPVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVfAAAAA9VVVVVVVVVVVXwAAAAPVVVVVVVVVVVV8AAAAD1f///VVVVVVVfAAAAAP/////1VVVVVXwAAAAA/AAAD/1VVVVV8AAAAAAAAAAA/VVVVVfAAAAAAAAAAAA/VVVVXwAAAAAAAAAAAD9VVVV8AAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAPVV8////8AAAAAAAAAA9Vf//////wAAAAAAAAPVX9VVVVf/wAAAAAAAD1VVVVVVVV/wAAAAAAAPVVVVVVVVV/AAAAAAAD1VVVVVVVVV8AAAAAAA9VVVVVVVVVXwAAAAAAPVVVVVVVVVV8AAAAAAD1VVVVVVVVVXwAAAAAA9VVVVVVVVVV8AAAAAAPVVVVVVVVVVfAAAAAAD1VVVVVVVVVXwAAAAAAPX1VVVVVVVV8AAAAAAPX/VVVVVVVV8AAAAAAD18/1VVVVVV8AAAAAAA9fD/1VVVVV8AAAAAAAPXwA/9VVVX8AAAAAAAD18AA/////8AAAAAAAA9fAAAP///wAAAAAAAAPXwAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAP1VVfwAAAAAAAAAAAAP1VVV/wAAAAAAAAAAAPVVVVV/8AAAAAAAAAA/VVVVVV/8AAAAAAAAD/VVVVVVVf/wAAAAAA/9VVVVVVVVf/8AAAA//1VVVVVVVVVV//////9VVVVVVVVVVVVf///9VVVVVVVVVVVVVVVVVVVVVVVVVVQ=="},
+ {"width" : "59", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX////1VVVVVVVVVVVVV///////1VVVVVVVVVVV//AAAAD//VVVVVVVVVV/wAAAAAAD/1VVVVVVVVfwAAAAAAAAP9VVVVVVVfwAAAAAAAAAD1VVVVVVX8AAAAAAAAAAPVVVVVVV8AAAAAAAAAAA9VVVVVVfAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAADwAAAA9VVVfAAAAAAAA////AAD1VVV8AAAAAAA//X//8APVVVXwAAAAAAP1VVVf/w9VVV8AAAAAAD1VVVVV//1VVXwAAAAAA9VVVVVVX/VVVfAAAAAAPVVVVVVVV9VVV8AAAAAD1VVVVVVVVVVVfAAAAAAPVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVfAAAAAA9VVV//9VVVVVV8AAAAAD1VX////9VVVVXwAAAAAPVf/wAA//VVVVfAAAAAD1f/AAAAA/1VVV8AAAAAPf8AAAAAAP1VVXwAAAAAP8AAAAAAAD1VVfAAAAAAMAAAAAAAAD1VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAPfAAAAAAAAD/wAAAAAAA98AAAAAAAD//8AAAAAAD3wAAAAAAA/VX8AAAAAAPfAAAAAAAPVVV8AAAAAA98AAAAAAD1VVV8AAAAAD3wAAAAAA9VVVV8AAAAAPfAAAAAAD1VVVXwAAAAA98AAAAAA9VVVVXwAAAAD3wAAAAAD1VVVVfAAAAAPfAAAAAAPVVVVV8AAAAA98AAAAAA9VVVVXwAAAAD3wAAAAAD1VVVVfAAAAAPXwAAAAAPVVVVV8AAAAA9fAAAAAAPVVVVfAAAAAD18AAAAAA9VVVV8AAAAAPXwAAAAAA9VVVfAAAAAA9fAAAAAAA9VVXwAAAAAD1fAAAAAAA/VX8AAAAAAPV8AAAAAAA///AAAAAAA9XwAAAAAAAP/AAAAAAAPVXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAPVVVVVVfAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAA/VVVVVVVfAAAAAAAAAAP1VVVVVVVfAAAAAAAAAD1VVVVVVVVfwAAAAAAAD9VVVVVVVVVf8AAAAAAD/VVVVVVVVVVX/AAAAAP/VVVVVVVVVVVV///////VVVVVVVVVVVVVf////9VVVVVVU="},
+ {"width" : "52", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//////////////////////////////////8AAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAD3wAAAAAP/8AAAAAAA98A///////wAAAAAAPf//////VVfAAAAAAPX/9VVVVVVXwAAAAAD1VVVVVVVVV8AAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAPVVVVVVVVVXwAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVfAAAAAAAPVVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVV8AAAAAAA9VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVXwAAAAAAD1VVVVVVVV8AAAAAAA9VVVVVVVV8AAAAAAA9VVVVVVVVfAAAAAAAPVVVVVVVVXwAAAAAAD1VVVVVVVXwAAAAAAD1VVVVVVVV8AAAAAAA9VVVVVVVVfAAAAAAAPVVVVVVVVfAAAAAAAD1VVVVVVVXwAAAAAAD1VVVVVVVXwAAAAAAA9VVVVVVVV8AAAAAAAPVVVVVVVVfAAAAAAAPVVVVVVVVfAAAAAAAD1VVVVVVVXwAAAAAAA9VVVVVVVV8AAAAAAAPVVVVVVVV8AAAAAAAPVVVVVVVVfAAAAAAAD1VVVVVVVfAAAAAAAA9VVVVVVVXwAAAAAAA9VVVVVVVV8AAAAAAAPVVVVVVVV8AAAAAAAD1VVVVVVVfAAAAAAAA9VVVVVVVXwAAAAAAA9VVVVVVVXwAAAAAAAPVVVVVVVV8AAAAAAAD1VVVVVVVfAAAAAAAD1VVVVVVVfAAAAAAAA9VVVVVVVXwAAAAAAAPVVVVVVVXwAAAAAAAD1VVVVVVV8AAAAAAAD1VVVVVVVfAAAAAAAA9VVVVVVVfwAAAAAAAPVVVVVVVX////wAAAPVVVVVVVVV////////1VVVVVVVVVVVV////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="},
+ {"width" : "58", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/1VVVVVVVVVVVVVVV/////1VVVVVVVVVVVVf//AA//9VVVVVVVVVVV/8AAAAA/9VVVVVVVVVX/AAAAAAAP1VVVVVVVVf8AAAAAAAAP1VVVVVVVfwAAAAAAAAA/VVVVVVVfAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAD1V8AAAAAAA/8AAAAAAA9VfAAAAAAD//8AAAAAAD1XwAAAAAD9VfwAAAAAA9V8AAAAAD1VVfAAAAAAPVfAAAAAD1VVV8AAAAAD1XwAAAAD1VVVXwAAAAA9V8AAAAA9VVVVfAAAAAPVfAAAAA9VVVVXwAAAAD1XwAAAAPVVVVVfAAAAA9V8AAAAD1VVVVXwAAAA9VfAAAAD1VVVVV8AAAAPVXwAAAA9VVVVVfAAAAD1VfAAAAD1VVVVXwAAAA9VXwAAAA9VVVVV8AAAAPVV8AAAAPVVVVV8AAAAPVVfAAAAA9VVVVfAAAAD1VV8AAAAPVVVVfAAAAA9VVfAAAAA9VVVfAAAAA9VVV8AAAAD9VVfAAAAAPVVVfAAAAAP9V/AAAAAPVVVV8AAAAAP//AAAAAD1VVVfAAAAAAP8AAAAAD1VVVV8AAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAA9VXwAAAAAA//wAAAAAAD1XwAAAAAA///wAAAAAA9V8AAAAAA9VV/AAAAAAPV8AAAAAA9VVV8AAAAAA9fAAAAAA9VVVXwAAAAAPXwAAAAA9VVVVfAAAAAD18AAAAA9VVVVXwAAAAAP8AAAAAPVVVVV8AAAAAD/AAAAAD1VVVVXwAAAAA/wAAAAA9VVVVV8AAAAAP8AAAAAPVVVVVfAAAAAD/AAAAAD1VVVVXwAAAAA/wAAAAA9VVVVV8AAAAAP8AAAAAPVVVVV8AAAAAD/AAAAAA9VVVVfAAAAAA/wAAAAAPVVVVfAAAAAAP8AAAAAA9VVVXwAAAAAD/AAAAAAD1VVfwAAAAAA/wAAAAAAP1VfwAAAAAAP8AAAAAAA///AAAAAAAD/AAAAAAAA//AAAAAAAA98AAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAA/VVVVVV/AAAAAAAAAAA/VVVVVVX/AAAAAAAAAD9VVVVVVVX/AAAAAAAAP9VVVVVVVVX/wAAAAAP/1VVVVVVVVVX//AAAP//VVVVVVVVVVVV//////VVVVVVVVVVVVVVX///VVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="},
+ {"width" : "57", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf//VVVVVVVVVVVVVVX/////1VVVVVVVVVVVV//wAA//VVVVVVVVVVVf8AAAAAP9VVVVVVVVVX/AAAAAAA/1VVVVVVVVfwAAAAAAAD9VVVVVVVV8AAAAAAAAAPVVVVVVVfwAAAAAAAAAD1VVVVVV/AAAAAAAAAAA9VVVVVXwAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAPVfAAAAAAA//wAAAAAAD1fAAAAAAD//8AAAAAAD1fAAAAAAPVVfAAAAAAD1fAAAAAA9VVXwAAAAAD1fAAAAAD1VVV8AAAAAA9fAAAAAPVVVVfAAAAAA98AAAAAPVVVVfAAAAAA98AAAAA9VVVVfAAAAAA98AAAAA9VVVVXwAAAAA98AAAAA9VVVVXwAAAAA98AAAAA9VVVVXwAAAAAP8AAAAA9VVVVXwAAAAAP8AAAAAPVVVVfAAAAAAP8AAAAAPVVVVfAAAAAAP8AAAAAD1VVV8AAAAAAPfAAAAAA9VVXwAAAAAAPfAAAAAAPVVfAAAAAAAPfAAAAAAD//8AAAAAAAPfAAAAAAA//wAAAAAAAPfAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAA9VVV/AAAAAAA8AAAAAA9VVVf8AAAAAP/AAAAAA9VVVV/8AAA//XwAAAAA9VVVVX/////1XwAAAAA9VVVVVX///VVXwAAAAA9VVVVVVVVVVVXwAAAAD1VVVVVVVVVVVfAAAAAD1VVVVVVVVVVVfAAAAAD1VVVVVVVVVVV8AAAAAD1VVVVVVVVVVV8AAAAAD1VVdVVVVVVVXwAAAAAPVVVf1VVVVVVfAAAAAAPVVV//VVVVVVfAAAAAAPVVV8P/VVVVX8AAAAAAPVVV8A//VVV/wAAAAAA9VVV8AA////8AAAAAAA9VVV8AAA///AAAAAAAA9VVV8AAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAD1VVVVVfAAAAAAAAAAA/VVVVVVX8AAAAAAAAAD9VVVVVVV/wAAAAAAAA/VVVVVVVVX/AAAAAAAP9VVVVVVVVVf/8AAAAP/VVVVVVVVVVV///////1VVVVVVVVVVVVX////1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"},
+ {"width" : "22", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/1VVVVf//1VVV/wA/1VV/AAA/VV8AAAD1VfAAAAPVfAAAAA9XwAAAAPXwAAAAA98AAAAAPfAAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD3wAAAAA98AAAAAPfAAAAAD3wAAAAD1fAAAAA9XwAAAAPVfAAAAPVV8AAAPVVXwAA/VVVf///VVVV//9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/9VVVV///9VVV/AAP1VV8AAAPVV8AAAA9V8AAAAPVfAAAAA9fAAAAAPXwAAAAA98AAAAAPfAAAAAD/AAAAAA/wAAAAAP8AAAAAD/AAAAAA/wAAAAAP8AAAAAD3wAAAAA98AAAAAPfAAAAAD18AAAAD1fAAAAA9V8AAAA9VfAAAAPVV/AAA/VVX/AD/VVVX//9VVVVX/1VVVVVVVVVQ=="}
+ ]
+}
diff --git a/apps/contourclock/font-Nunito.json b/apps/contourclock/fonts/font-Nunito.json
similarity index 100%
rename from apps/contourclock/font-Nunito.json
rename to apps/contourclock/fonts/font-Nunito.json
diff --git a/apps/contourclock/font-OpenSansEC.json b/apps/contourclock/fonts/font-OpenSansEC.json
similarity index 100%
rename from apps/contourclock/font-OpenSansEC.json
rename to apps/contourclock/fonts/font-OpenSansEC.json
diff --git a/apps/contourclock/fonts/font-Oswald.json b/apps/contourclock/fonts/font-Oswald.json
new file mode 100644
index 000000000..97c61911c
--- /dev/null
+++ b/apps/contourclock/fonts/font-Oswald.json
@@ -0,0 +1,17 @@
+{
+ "name":"Oswald",
+ "size":"100",
+ "characters":[
+ {"width" : "54", "buffer":"VVVVVf//////9VVVVVVVVVX////////9VVVVVVVV/wAAAAAAD/1VVVVVVf8AAAAAAAAD9VVVVVV/AAAAAAAAAAPVVVVVXwAAAAAAAAAAD9VVVVfAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAA9XwAAAAAA//AAAAAAA9fAAAAAAD//wAAAAAA9fAAAAAAPVV8AAAAAA9fAAAAAA9VVfAAAAAAPfAAAAAA9VVXwAAAAAPfAAAAAD1VVXwAAAAAPfAAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVV8AAAAAP8AAAAAD1VVXwAAAAAPfAAAAAA9VVXwAAAAAPfAAAAAA9VVXwAAAAAPfAAAAAAPVVfAAAAAAPfAAAAAAD1V8AAAAAA9fAAAAAAA//wAAAAAA9XwAAAAAAP/AAAAAAA9XwAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAD1VVV8AAAAAAAAAAAAPVVVVfAAAAAAAAAAAA9VVVVX8AAAAAAAAAAD1VVVVV/AAAAAAAAAA/VVVVVVX8AAAAAAAAP9VVVVVVV/8AAAAAAD/VVVVVVVVX////////1VVVVVVVVVX//////9VVVVV"},
+ {"width" : "34", "buffer":"VVVVVV/////1VVVVV/////9VVVVX8AAAAPVVVVX8AAAAD1VVVfwAAAAA9VVV/wAAAAAPVVV/AAAAAAD1VX8AAAAAAA9Vf8AAAAAAAPV/wAAAAAAAD3/AAAAAAAAA/8AAAAAAAAAP8AAAAAAAAAD/AAAAAAAAAA/wAAAAAAAAAP8AAAAAAAAAD/AAAAAAAAAA/wAAAAAAAAAP8AAAAAAAAAD/AAAAAAAAAA/wAAPAAAAAAP8AA/8AAAAAD/AP/XwAAAAA/w/9V8AAAAAP//VVfAAAAAD/9VVXwAAAAA/1VVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVXwAAAAA9VVVV8AAAAAPVVVVfAAAAAD1VVVX//////9VVVV///////VVVVVVVVVVVQ=="},
+ {"width" : "55", "buffer":"VVVVVX///////1VVVVVVVVVf////////1VVVVVVVV/wAAAAAAA/1VVVVVVX/AAAAAAAAA/1VVVVVX8AAAAAAAAAA/VVVVVXwAAAAAAAAAAA9VVVVXwAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAA9V8AAAAAAD/wAAAAAAPV8AAAAAAP//AAAAAAD1fAAAAAAP1V8AAAAAAPXwAAAAAPVVXwAAAAAD3wAAAAAPVVVfAAAAAA98AAAAAPVVVV8AAAAAPfAAAAAD1VVVfAAAAAD3wAAAAA9VVVXwAAAAA98AAAAA9VVVV8AAAAAPfAAAAAPVVVVXwAAAAD/AAAAAD1VVVV8AAAAA/wAAAAA9VVVV8AAAAAP8AAAAAPVVVVfAAAAAD/AAAAAD1VVVXwAAAAA/wAAAAA9VVVV8AAAAAP8AAAAAPVVVVfAAAAAD/AAAAAD1VVVfAAAAAA/wAAAAA9VVVXwAAAAAP///////VVVV8AAAAAPf//////1VVV8AAAAAD1VVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVVXwAAAAAPVVVVVVVVVVXwAAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVfAAAAAAPVVVVVVVVVVXwAAAAAD1VVVVVVVVVXwAAAAAD1VVVVVVVVVXwAAAAAD1VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVfAAAAAAPVVVVVVVVVVfAAAAAAPVVVVVVVVVVXwAAAAAD1VVVVVVVVVXwAAAAAD1VVVVVVVVVXwAAAAAD1VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVfAAAAAAPVVVVVVVVVVfAAAAAAPVVVVVVVVVVXwAAAAAD1VVVVVVVVVXwAAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVfAAAAAAPVVVVVVVVVVXwAAAAAPVVVVVVVVVVXwAAAAAD1VVVVVVVVVXwAAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAAPVVVVVVVVVVfAAAAAAPVVVVVVVVVVXwAAAAAPVVVVVVVVVVXwAAAAAD1VVVVVVVVVXwAAAAAD1VVVVVVVVVV8AAAAAA9VVVVVVVVVV8AAAAAAD/////////1fAAAAAAAP////////9fAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAA9f/////////////////X/////////////////1VVVVVVVVVVVVVVVVVVQ=="},
+ {"width" : "54", "buffer":"VVVVVf//////9VVVVVVVVVf////////9VVVVVVVX/wAAAAAAD/1VVVVVVfwAAAAAAAAD9VVVVVX8AAAAAAAAAAP1VVVVfwAAAAAAAAAAD9VVVV8AAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAD1fAAAAAAA//AAAAAAA9fAAAAAAD//wAAAAAA9fAAAAAAPVV8AAAAAA9fAAAAAA9VVfAAAAAAP8AAAAAD1VVXwAAAAAP8AAAAAD1VVXwAAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP///////VVVV8AAAAAP///////VVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAD1VVVVVVVVVVfAAAAAD1VVVVVVVVVV8AAAAAPVVVVVVVVVVfwAAAAAPVVVVVVVX///AAAAAA9VVVVVVVf//wAAAAAD1VVVVVVVfAAAAAAAAP1VVVVVVVfAAAAAAAA/VVVVVVVVfAAAAAAAP1VVVVVVVVfAAAAAAA/VVVVVVVVVfAAAAAAD1VVVVVVVVVfAAAAAAA/VVVVVVVVVfAAAAAAAP9VVVVVVVVfAAAAAAAA/VVVVVVVVfAAAAAAAAD1VVVVVVVfAAAAAAAAA9VVVVVVVfAAAAAAAAA9VVVVVVVf//AAAAAAAPVVVVVVVX///AAAAAAD1VVVVVVVVV/wAAAAAD1VVVVVVVVVV8AAAAAD1VVVVVVVVVVfAAAAAA9VVVVVVVVVVfAAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVXwAAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAPVVVVVVVVVVV8AAAAAP//////9VVVV8AAAAAP///////VVVV8AAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVVfAAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP8AAAAAPVVVV8AAAAAP8AAAAAD1VVV8AAAAAPfAAAAAD1VVXwAAAAA9fAAAAAA9VVXwAAAAA9fAAAAAAPVV/AAAAAA9fAAAAAAD//8AAAAAA9XwAAAAAA//AAAAAAD1XwAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAPVVVV8AAAAAAAAAAAA9VVVVfwAAAAAAAAAAD1VVVVX8AAAAAAAAAAPVVVVVVfwAAAAAAAAD9VVVVVVX/AAAAAAAD/1VVVVVVVf////////9VVVVVVVVV///////9VVVVV"},
+ {"width" : "59", "buffer":"VVVVVVVVX///////9VVVVVVVVVVVf///////1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAAPVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVfAAAAAAAD1VVVVVVVVVV8AAAAAAAPVVVVVVVVVVfAAAAAAAA9VVVVVVVVVV8AAAAAAAD1VVVVVVVVVfAAAAAAAAPVVVVVVVVVV8AAAAAAAA9VVVVVVVVVXwAAAAAAAD1VVVVVVVVV8AAAAAAAAPVVVVVVVVVXwAAAAAAAA9VVVVVVVVV8AAAAAAAAD1VVVVVVVVXwAAAAAAAAPVVVVVVVVV8AAAAAAAAA9VVVVVVVVXwAAAAAAAAD1VVVVVVVVfAAAAAAAAAPVVVVVVVVXwAAAAAAAAA9VVVVVVVVfAAADAAAAAD1VVVVVVVXwAAA/AAAAAPVVVVVVVVfAAAPfAAAAA9VVVVVVVXwAAA98AAAAD1VVVVVVVfAAAPXwAAAAPVVVVVVVV8AAA9fAAAAA9VVVVVVVfAAAD18AAAAD1VVVVVVV8AAA9XwAAAAPVVVVVVVfAAAD1fAAAAA9VVVVVVV8AAAPV8AAAAD1VVVVVVXwAAD1XwAAAAPVVVVVVV8AAAPVfAAAAA9VVVVVVXwAAD1V8AAAAD1VVVVVV8AAAPVXwAAAAPVVVVVVXwAAA9VfAAAAA9VVVVVV8AAAPVV8AAAAD1VVVVVXwAAA9VXwAAAAPVVVVVVfAAAD1VfAAAAA9VVVVVXwAAA9VV8AAAAD1VVVVVfAAAD1VXwAAAAPVVVVVXwAAAPVVfAAAAA9VVVVVfAAAD1VV8AAAAD1VVVVV8AAAPVVXwAAAAPVVVVVfAAAD1VVfAAAAA9VVVVV8AAAPVVV8AAAAD1VVVVfAAAA9VVXwAAAAPVVVVV8AAAPVVVfAAAAA9VVVVfAAAA9VVV8AAAAD1VVVV8AAAD1VVXwAAAAPVVVVXwAAA9VVVfAAAAA9VVVV8AAAD1VVV8AAAAD1VVVXwAAAPVVVXwAAAAPVVVV8AAAD1VVVfAAAAA9VVVXwAAAPVVVV8AAAAD1VVVfAAAA9VVVXwAAAAPVVVXwAAAPVVVVfAAAAA9VVVfAAAA9VVVV8AAAAD1VVXwAAAPVVVVXwAAAAPVVVfAAAA9VVVVfAAAAA9VVXwAAAA/////wAAAAA////AAAAA////8AAAAAA///8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAP//////////AAAAAAD/////////////AAAAAA///1VVVVVVVVVfAAAAAPVVVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVV//////1VVVVVVVVVVVVX//////VVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "54", "buffer":"V///////////////1VV///////////////1VV8AAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VXwAAAAD/////////1VXwAAAAP/////////1VXwAAAA9VVVVVVVVVVVXwAAAA9VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VVVVVVVVVVVXwAAAD1VX///9VVVVVXwAAAD1X/////9VVVVXwAAAD1/8AAAD/1VVVfAAAAA/8AAAAAD9VVVfAAAAAPAAAAAAAPVVVfAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAPVfAAAAAAA/8AAAAAAPVfAAAAAAP//wAAAAAPVfAAAAAA/VX8AAAAAD1fAAAAAD1VVfAAAAAD1fAAAAAPVVVfAAAAAD1fAAAAAPVVVXwAAAAD1fAAAAA9VVVXwAAAAA9fAAAAA9VVVV8AAAAA9fAAAAA9VVVV8AAAAA9f/////1VVVV8AAAAA9f/////1VVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVV8AAAAA9VVVVVVVVVVVfAAAAA9VVVVVVVVVVVfAAAAA9VVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAAPVVVVVVVVVVVfAAAAA9VVVVVVVVVVVfAAAAA9///////VVVVfAAAAA9///////VVVVfAAAAA98AAAAAPVVVVfAAAAA98AAAAAPVVVVfAAAAA98AAAAAPVVVVfAAAAA98AAAAAPVVVV8AAAAA98AAAAAPVVVV8AAAAA9fAAAAAPVVVV8AAAAA9fAAAAAPVVVV8AAAAA9fAAAAAPVVVV8AAAAA9fAAAAAPVVVV8AAAAD1fAAAAAD1VVXwAAAAD1fAAAAAD1VVXwAAAAD1fAAAAAA9VVfAAAAAD1XwAAAAAPVV8AAAAAPVXwAAAAAD//wAAAAAPVXwAAAAAA//AAAAAAPVV8AAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAPVVVV8AAAAAAAAAAAA9VVVVfAAAAAAAAAAAD1VVVVXwAAAAAAAAAA/VVVVVV/AAAAAAAAAP9VVVVVVf8AAAAAAAD/VVVVVVVV/////////1VVVVVVVVX///////9VVVVV"},
+ {"width" : "55", "buffer":"VVVVVf///////VVVVVVVVVV/////////1VVVVVVVX/AAAAAAAD/1VVVVVVf8AAAAAAAAA/VVVVVVfwAAAAAAAAAA9VVVVVfAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAPVVfAAAAAAD/wAAAAAA9VXwAAAAAD//wAAAAAPVXwAAAAAD1V/AAAAAD1V8AAAAAD1VV8AAAAA9VfAAAAAD1VVfAAAAAPVfAAAAAA9VVXwAAAAA9XwAAAAAPVVVfAAAAAPV8AAAAAPVVVXwAAAAD1fAAAAAD1VVV8AAAAA9XwAAAAA9VVVfAAAAAPV8AAAAAPVVVXwAAAAD18AAAAAD1VVV8AAAAA9fAAAAAA9VVVf//////XwAAAAAPVVVV//////V8AAAAAD1VVVVVVVVVVfAAAAAA9VVVVVVVVVVXwAAAAAPVVVVVVVVVVV8AAAAAD1VVVVVVVVVVfAAAAAA9VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VV///1VVVVXwAAAAA9Vf////9VVVV8AAAAAPV/8AAA/9VVVfAAAAAD1/AAAAAP9VVXwAAAAAP8AAAAAAP1VV8AAAAAA8AAAAAAAPVVfAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAD18AAAAAAAD8AAAAAAA9fAAAAAAAP/8AAAAAAPXwAAAAAAP1fwAAAAAD18AAAAAAPVVfAAAAAAPfAAAAAAPVVV8AAAAAD3wAAAAAPVVVfAAAAAA98AAAAAPVVVV8AAAAAPfAAAAAD1VVVfAAAAAD3wAAAAA9VVVXwAAAAAP8AAAAAPVVVV8AAAAAD/AAAAAD1VVVfAAAAAA/wAAAAA9VVVXwAAAAAP8AAAAAPVVVVfAAAAAD/AAAAAD1VVVXwAAAAA/wAAAAA9VVVV8AAAAAP8AAAAAPVVVVfAAAAAD/AAAAAD1VVVXwAAAAA/wAAAAA9VVVV8AAAAAP8AAAAAPVVVVfAAAAAD/AAAAAD1VVVXwAAAAA/wAAAAA9VVVV8AAAAAP8AAAAAPVVVVfAAAAAD/AAAAAA9VVVXwAAAAD3wAAAAAPVVVV8AAAAA98AAAAAD1VVV8AAAAAPXwAAAAA9VVVfAAAAAD18AAAAAPVVVXwAAAAA9fAAAAAD1VVV8AAAAAPXwAAAAA9VVVfAAAAAD18AAAAAD1VVXwAAAAD1XwAAAAA9VVXwAAAAA9V8AAAAAPVVV8AAAAAPVfAAAAAA9VV8AAAAAD1V8AAAAAD1V8AAAAAD1VfAAAAAAP/8AAAAAA9VV8AAAAAA/8AAAAAA9VVfAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAD1VVVfAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAA9VVVVXwAAAAAAAAAAA9VVVVVfwAAAAAAAAAA9VVVVVV/AAAAAAAAAD9VVVVVVV/AAAAAAAAP9VVVVVVVX/wAAAAAA/1VVVVVVVVX////////VVVVVVVVVVV//////9VVVVVQ=="},
+ {"width" : "48", "buffer":"f///////////////////////////////8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAP/////////AAAAAAP/////////wAAAAAPVVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAPVVVVVVVVVfAAAAAPVVVVVVVVVfAAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAPVVVVVVVVVfAAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAPVVVVVVVVVfAAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAPVVVVVVVVVfAAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAPVVVVVVVVVfAAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAPVVVVVVVVVfAAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAAPVVVVVVVVV8AAAAA9VVVVVVVVV8AAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAA9VVVVVVVVXwAAAAD1VVVVVVVVXwAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAD1VVVVVVVVfAAAAAPVVVVVVVVVfAAAAAPVVVVVVVVV///////VVVVVVVVV///////VVVVVVVVVVVVVVVVVVVVVVV"},
+ {"width" : "55", "buffer":"VVVVVX//////9VVVVVVVVVV////////9VVVVVVVVX/wAAAAAAP9VVVVVVVX8AAAAAAAAP9VVVVVVXwAAAAAAAAAP1VVVVVXwAAAAAAAAAAPVVVVVXwAAAAAAAAAAA9VVVVXwAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAPVVfAAAAAAD/wAAAAAD1VXwAAAAAD//AAAAAAPVV8AAAAAD1V8AAAAAD1VfAAAAAD1VXwAAAAA9VfAAAAAD1VV8AAAAAPVXwAAAAA9VVXwAAAAD1V8AAAAA9VVV8AAAAAPVfAAAAAPVVVXwAAAAD1XwAAAAD1VVV8AAAAA9V8AAAAA9VVVfAAAAAPVfAAAAA9VVVXwAAAAD1XwAAAAPVVVV8AAAAA9V8AAAAD1VVVfAAAAAPVfAAAAA9VVVXwAAAAD1XwAAAAPVVVV8AAAAA9V8AAAAD1VVVfAAAAAPVfAAAAAPVVVXwAAAAD1XwAAAAD1VVV8AAAAA9V8AAAAA9VVVfAAAAA9VfAAAAAPVVVXwAAAAPVV8AAAAD1VVXwAAAAD1VfAAAAA9VVV8AAAAA9VXwAAAAD1VVfAAAAAPVV8AAAAA9VVfAAAAAPVVXwAAAAD1VXwAAAAD1VV8AAAAAPVXwAAAAD1VVXwAAAAA/fwAAAAA9VVV8AAAAAD/wAAAAA9VVVXwAAAAADAAAAAAPVVVVfAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAPVVVVVfAAAAAAAAAAAD1VVVVV8AAAAAAAAAAD1VVVVVXwAAAAAAAAAD1VVVVVVfAAAAAAAAAD1VVVVVV/AAAAAAAAAAP1VVVVV/AAAAAAAAAAA/VVVVV8AAAAAAAAAAAA9VVVV8AAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAD1VVfAAAAAADwAAAAAAPVVfAAAAAAP/8AAAAAA9VXwAAAAAP1/wAAAAAPVXwAAAAAPVVfAAAAAD1V8AAAAAPVVV8AAAAAPVfAAAAAD1VVfAAAAAD1fAAAAAD1VVV8AAAAA9XwAAAAA9VVVfAAAAAD18AAAAAPVVVXwAAAAA9fAAAAAPVVVV8AAAAAPXwAAAAD1VVVXwAAAAD3wAAAAA9VVVV8AAAAA98AAAAAPVVVVfAAAAAPfAAAAAD1VVVXwAAAAA/wAAAAA9VVVV8AAAAAP8AAAAAPVVVVfAAAAAD/AAAAAD1VVVXwAAAAA/wAAAAA9VVVV8AAAAAP8AAAAAPVVVVfAAAAAD/AAAAAD1VVVXwAAAAA/wAAAAA9VVVV8AAAAAP8AAAAAPVVVVfAAAAAPfAAAAAD1VVVXwAAAAD18AAAAA9VVVV8AAAAA9fAAAAAPVVVV8AAAAAPXwAAAAA9VVVfAAAAAD18AAAAAPVVVXwAAAAA9fAAAAAD1VVXwAAAAAPV8AAAAAPVVV8AAAAAPVfAAAAAD1VV8AAAAAD1XwAAAAAP1V8AAAAAA9V8AAAAAA//8AAAAAA9VXwAAAAAA/8AAAAAAPVV8AAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAPVVVVV/AAAAAAAAAAA/VVVVVX8AAAAAAAAAA/VVVVVVX8AAAAAAAAD9VVVVVVVf/AAAAAAA/9VVVVVVVVf////////1VVVVVVVVVX//////9VVVVVQ=="},
+ {"width" : "55", "buffer":"VVVVVX//////9VVVVVVVVVV/////////VVVVVVVVV/wAAAAAAP/VVVVVVVX8AAAAAAAAD9VVVVVVX8AAAAAAAAAD9VVVVVXwAAAAAAAAAAP1VVVVXwAAAAAAAAAAAPVVVVXwAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAD1VXwAAAAAD/8AAAAAA9VXwAAAAAD//wAAAAAD1V8AAAAAD1VfAAAAAA9VfAAAAAD1VV8AAAAAPVfAAAAAD1VVfAAAAAA9XwAAAAA9VVV8AAAAAPV8AAAAAPVVVfAAAAAD1fAAAAAPVVVXwAAAAA9fAAAAAD1VVV8AAAAAPXwAAAAA9VVVXwAAAAA98AAAAAPVVVV8AAAAAPfAAAAAD1VVVfAAAAAD3wAAAAA9VVVXwAAAAA98AAAAAPVVVV8AAAAAPfAAAAAD1VVVfAAAAAD3wAAAAA9VVVXwAAAAA98AAAAAPVVVV8AAAAAP8AAAAAD1VVVfAAAAAD/AAAAAA9VVVXwAAAAA/wAAAAAPVVVV8AAAAAP8AAAAAD1VVVfAAAAAD/AAAAAA9VVVXwAAAAA/wAAAAAPVVVV8AAAAAPfAAAAAD1VVVfAAAAAD3wAAAAA9VVVXwAAAAA98AAAAAPVVVV8AAAAAPfAAAAAD1VVVfAAAAAD3wAAAAA9VVVXwAAAAA98AAAAAD1VVV8AAAAAPfAAAAAA9VVVfAAAAAD3wAAAAAPVVVfAAAAAA9fAAAAAA9VVfAAAAAAPXwAAAAAD1VfAAAAAAD18AAAAAAP//AAAAAAA9fAAAAAAA//AAAAAAAPV8AAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAPVVXwAAAAAADwAAAAAD1VVfwAAAAAD/AAAAAA9VVV/wAAAA/18AAAAAPVVVV//wA//1fAAAAAD1VVVV////9VXwAAAAA9VVVVVV/9VVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1VVVVVVVVVVXwAAAAA9VVVVVVVVVVV8AAAAAPVVVVVVVVVVVfAAAAAD1f/////9VVVXwAAAAA9f//////VVVV8AAAAAPXwAAAAD1VVVfAAAAAD18AAAAA9VVVfAAAAAA9fAAAAAPVVVXwAAAAA9V8AAAAD1VVV8AAAAAPVfAAAAA9VVVfAAAAAD1XwAAAAD1VVXwAAAAA9V8AAAAA9VVV8AAAAAPVfAAAAAPVVV8AAAAAPVXwAAAAA9VV8AAAAAD1V8AAAAAD9V8AAAAAA9VfAAAAAAP/8AAAAAAPVV8AAAAAAP8AAAAAAPVVfAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAPVVVVVX8AAAAAAAAAA/VVVVVVf8AAAAAAAAD/VVVVVVVf/AAAAAAA/9VVVVVVVVf////////1VVVVVVVVVX//////9VVVVVQ=="},
+ {"width" : "18", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV////////////8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP////////////VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV////////////8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP8AAAAP//////f/////VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"}
+ ]
+}
diff --git a/apps/contourclock/font-Phosphate.json b/apps/contourclock/fonts/font-Phosphate.json
similarity index 100%
rename from apps/contourclock/font-Phosphate.json
rename to apps/contourclock/fonts/font-Phosphate.json
diff --git a/apps/contourclock/font-Quicksand.json b/apps/contourclock/fonts/font-Quicksand.json
similarity index 100%
rename from apps/contourclock/font-Quicksand.json
rename to apps/contourclock/fonts/font-Quicksand.json
diff --git a/apps/contourclock/fonts/font-RubikOne.json b/apps/contourclock/fonts/font-RubikOne.json
new file mode 100644
index 000000000..af56dca35
--- /dev/null
+++ b/apps/contourclock/fonts/font-RubikOne.json
@@ -0,0 +1,17 @@
+{
+ "name":"RubikOne",
+ "size":"100",
+ "characters":[
+ {"width" : "57", "buffer":"VVVVVVX/////9VVVVVVVVVVVX///////1VVVVVVVVVVf8AAAAAD/VVVVVVVVVX8AAAAAAAP9VVVVVVVVfwAAAAAAAA/VVVVVVVV8AAAAAAAAAD1VVVVVVXwAAAAAAAAAA9VVVVVV/AAAAAAAAAAAPVVVVVV8AAAAAAAAAAAD1VVVVXwAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAA9fAAAAAAAA/wAAAAAAA9fAAAAAAAD/8AAAAAAAPfAAAAAAAPVfAAAAAAAPfAAAAAAA9VXwAAAAAAPfAAAAAAD1VXwAAAAAAP8AAAAAAD1VXwAAAAAAP8AAAAAAD1VV8AAAAAAP8AAAAAAD1VV8AAAAAAP8AAAAAAD1VV8AAAAAAP8AAAAAAD1VV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAPVVV8AAAAAAP8AAAAAAD1VV8AAAAAAP8AAAAAAD1VV8AAAAAAP8AAAAAAD1VV8AAAAAAP8AAAAAAD1VV8AAAAAAP8AAAAAAD1VXwAAAAAAPfAAAAAAD1VXwAAAAAAPfAAAAAAA9VXwAAAAAAPfAAAAAAAPVfAAAAAAAPfAAAAAAAD/8AAAAAAAPfAAAAAAAA/wAAAAAAA9fAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAPVVVVVVfAAAAAAAAAAA9VVVVVVXwAAAAAAAAAD9VVVVVVV/AAAAAAAAAPVVVVVVVVfwAAAAAAAD9VVVVVVVVV/wAAAAAA/1VVVVVVVVVf///////9VVVVVVVVVVVf//////VVVVVV"},
+ {"width" : "45", "buffer":"VVVVVVVV//////1VVVVVVVX//////9VVVVVVVfAAAAAAPVVVVVVV8AAAAAAPVVVVVVXwAAAAAAPVVVVVVXwAAAAAAPVVVVVVfAAAAAAAPVVVVVV8AAAAAAAPVVVVVXwAAAAAAAPVVVVVXwAAAAAAAPVVVVV/AAAAAAAAPVVVVV8AAAAAAAAPVVVVXwAAAAAAAAPVVVVfAAAAAAAAAPVVVV8AAAAAAAAAPVVVXwAAAAAAAAAPVVVXwAAAAAAAAAPVVVfAAAAAAAAAAPVVV8AAAAAAAAAAPVVXwAAAAAAAAAAPVVfAAAAAAAAAAAPVVfAAAAAAAAAAAPVX8AAAAAAAAAAAPVXwAAAAAAAAAAAPVfAAAAAAAAAAAAPV8AAAAAAAAAAAAPXwAAAAAAAAAAAAPfAAAAAAAAAAAAAPfAAAAAAAAAAAAAP8AAAAAAAAAAAAAP8AAAAAAAAAAAAAP8AAAAAAAAAAAAAP8AAAAAAAAAAAAAP8AAAAAAAAAAAAAPfAAAAAAAAAAAAAPfAAAAAAAAAAAAAPfAAAAAAAAAAAAAPXwAAAAAAAAAAAAPV8AAAAAAAAAAAAPV8AAAAAwAAAAAAPV8AAAAD8AAAAAAPVfAAAAPfAAAAAAPVfAAAA9fAAAAAAPVXwAAD1fAAAAAAPVV8AAPVfAAAAAAPVV8AAPVfAAAAAAPVV8AA9VfAAAAAAPVVfAD1VfAAAAAAPVVXwPVVfAAAAAAPVVXw9VVfAAAAAAPVVX/1VVfAAAAAAPVVV/1VVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVfAAAAAAPVVVVVVVX///////VVVVVVVX//////1"},
+ {"width" : "58", "buffer":"VVVVVVf//////1VVVVVVVVVVV////////1VVVVVVVVVX/AAAAAAA/1VVVVVVVVX8AAAAAAAA/VVVVVVVVXwAAAAAAAAA9VVVVVVVfwAAAAAAAAAD1VVVVVVXwAAAAAAAAAAPVVVVVVXwAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAPVfAAAAAAAD/AAAAAAAD1XwAAAAAAD/8AAAAAAA9XwAAAAAAD1XwAAAAAAPV8AAAAAAD1V8AAAAAAD1fAAAAAAA9VfAAAAAAA9XwAAAAAA9VXwAAAAAAPV8AAAAAAPVV8AAAAAAD1fAAAAAAD1VfAAAAAAA9XwAAAAAD1VXwAAAAAAPV8AAAAAA9VV8AAAAAAD1X///////VVfAAAAAAA9V//////9VVXwAAAAAAPVVVVVVVVVVXwAAAAAAPVVVVVVVVVVXwAAAAAAD1VVVVVVVVVV8AAAAAAA9VVVVVVVVVVfAAAAAAAPVVVVVVVVVVfAAAAAAAD1VVVVVVVVVfAAAAAAAD1VVVVVVVVVfAAAAAAAA9VVVVVVVVVfAAAAAAAAPVVVVVVVVVXwAAAAAAAPVVVVVVVVVXwAAAAAAAD1VVVVVVVVXwAAAAAAAD1VVVVVVVVXwAAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVV8AAAAAAAAPVVVVVVVVV8AAAAAAAAPVVVVVVVVV8AAAAAAAAD1VVVVVVVV8AAAAAAAAD1VVVVVVVV8AAAAAAAAD1VVVVVVVVfAAAAAAAAA9VVVVVVVVfAAAAAAAAA9VVVVVVVVfAAAAAAAAA9VVVVVVVVfAAAAAAAAAPVVVVVVVVfAAAAAAAAAPVVVVVVVVfAAAAAAAAAPVVVVVVVVfAAAAAAAAAPVVVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAA9VVVVVVVXwAAAAAAAAAD//////VXwAAAAAAAAAAP/////9V8AAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAD1//////////////////9f/////////////////9Q=="},
+ {"width" : "59", "buffer":"VV///////////////9VVV////////////////9VVXwAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAA9VVf///////wAAAAAAAPVVVf///////wAAAAAAD1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVX8AAAAAAD1VVVVVVVVVV/AAAAAAA9VVVVVVVVVVfAAAAAAAPVVVVVVVVVVXwAAAAAAD1VVVVVVVVVV8AAAAAAA9VVVVVVVVVVfAAAAAAAPVVVVVVVVVVfwAAAAAAD1VVVVVVVVVV8AAAAAAA9VVVVVVVVVV/AAAAAAAPVVVVVVVVVVfwAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVXwAAAAAAAA/VVVVVVVVV8AAAAAAAAA/1VVVVVVVXwAAAAAAAAAP1VVVVVVVfAAAAAAAAAAD1VVVVVVV8AAAAAAAAAAD1VVVVVVXwAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAAPVVVVVVXwAAAAAAAAAAAPVVVVVVfAAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAPVVVVVX/////wAAAAAAA9VVVVVX/////wAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVV8AAAAAAPVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVfAAAAAAD3//////9VVVV8AAAAAAP///////9VVVfAAAAAAA/wAAAAAA9VVV8AAAAAAD/AAAAAAA9VVfAAAAAAAP8AAAAAAA///wAAAAAAA/wAAAAAAA//8AAAAAAAD/AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAD9VVVVVV8AAAAAAAAAAA/VVVVVVV/AAAAAAAAAAPVVVVVVVV/wAAAAAAAA/1VVVVVVVVf8AAAAAAA/9VVVVVVVVVX////////1VVVVVVVVVVV///////1VVVVVU="},
+ {"width" : "62", "buffer":"VVVVVVVVVX//////9VVVVVVVVVVVVV///////9VVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVXwAAAAAAAPVVVVVVVVVVVfAAAAAAAA9VVVVVVVVVVXwAAAAAAAD1VVVVVVVVVVfAAAAAAAAPVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVfAAAAAAAAD1VVVVVVVVVXwAAAAAAAAPVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVfAAAAAAAAAPVVVVVVVVVXwAAAAAAAAA9VVVVVVVVVfAAAAAAAAAD1VVVVVVVVXwAAAAAAAAAPVVVVVVVVVfAAAAAAAAAA9VVVVVVVVV8AAAAAAAAAD1VVVVVVVVfAAAAAAAAAAPVVVVVVVVXwAAAAAAAAAA9VVVVVVVVfAAAAAAAAAAD1VVVVVVVV8AAAAAAAAAAPVVVVVVVVfAAAAAAAAAAA9VVVVVVVXwAAAAAAAAAAD1VVVVVVVfAAAAAAAAAAAPVVVVVVVV8AAAAAAAAAAA9VVVVVVVfAAAAAAAAAAAD1VVVVVVV8AAAAAAAAAAAPVVVVVVVfAAAAAAAAAAAA9VVVVVVV8AAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAAPVVVVVVV8AAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAAAPVVVVVVfAAAAAAwAAAAAA9VVVVVV8AAAAAPwAAAAAD1VVVVVfAAAAAD3wAAAAAPVVVVVV8AAAAAPfAAAAAA9VVVVVfAAAAAD18AAAAAD1VVVVV8AAAAAPXwAAAAAPVVVVVfAAAAAD1fAAAAAA9VVVVV8AAAAAPV8AAAAAD1VVVVfAAAAAD1XwAAAAAPVVVVV8AAAAAPVfAAAAAA9VVVVfAAAAAD1V8AAAAAD1VVVV8AAAAAPVXwAAAAAPVVVVfAAAAAA9VfAAAAAA9VVVV8AAAAAPVV8AAAAAD1VVVfAAAAAA9VXwAAAAAPVVVV8AAAAAPVVfAAAAAA9VVVfAAAAAA9VV8AAAAAD1VVV8AAAAAPVVXwAAAAAD///XwAAAAAP//8AAAAAAD///8AAAAAAP//AAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA9/////////wAAAAAAA///3/////////wAAAAAAP//9VVVVVVVVVXwAAAAAD1VVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVf//////1VVVVVVVVVVVVVf/////9VVVU="},
+ {"width" : "59", "buffer":"VVVf/////////////1VVVVX//////////////1VVVV8AAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAD1VVV8AAAAAP////////9VVVXwAAAAD/////////1VVVfAAAAA9VVVVVVVVVVVVV8AAAAD1VVVVVVVVVVVVXwAAAAPVVVVVVVVVVVVVfAAAAA9VVVVVVVVVVVVXwAAAAD1V///9VVVVVVVfAAAAAPV/////VVVVVVV8AAAAA9fwAAA/1VVVVVXwAAAAD3wAAAAP1VVVVVfAAAAAD8AAAAAD9VVVVV8AAAAADAAAAAAD9VVVVXwAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAPVV8AAAAAAA/AAAAAAAAPVXwAAAAAAP/AAAAAAAA9VfAAAAAAP1fAAAAAAAD1V8AAAAAD9VfAAAAAAAPVV//////9VVfAAAAAAA9VV//////VVVfAAAAAAA9VVVVVVVVVVV8AAAAAAD1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVV8AAAAAAPX//////9VVVXwAAAAAA9///////9VVV8AAAAAAD3wAAAAAA9VVXwAAAAAAP8AAAAAAD1VVfAAAAAAA/wAAAAAAD1VXwAAAAAAD/AAAAAAAPVVfAAAAAAAPfAAAAAAAP//wAAAAAAD18AAAAAAAP/8AAAAAAAPXwAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAA9VVVVV8AAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAD9VVVVVV8AAAAAAAAAAA9VVVVVVV/AAAAAAAAAAPVVVVVVVV/wAAAAAAAAP1VVVVVVVVf8AAAAAAAP9VVVVVVVVVX////////9VVVVVVVVVVV///////9VVVVVU="},
+ {"width" : "59", "buffer":"VVVVVVVVX//////VVVVVVVVVVVVV///////1VVVVVVVVVVV/AAAAAAPVVVVVVVVVVVXwAAAAAA9VVVVVVVVVVV8AAAAAAD1VVVVVVVVVVXwAAAAAAPVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAPVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAPVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAD1VVVVVVVVVVfAAAAAAAPVVVVVVVVVVXwAAAAAAAP1VVVVVVVVVfAAAAAAAAP/VVVVVVVVXwAAAAAAAAD/VVVVVVVVfAAAAAAAAAAP1VVVVVVXwAAAAAAAAAAP1VVVVVVfAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAA9fAAAAAAAA/8AAAAAAAD18AAAAAAAP/8AAAAAAAPfAAAAAAAD1V8AAAAAAA98AAAAAAA9VV8AAAAAAA/wAAAAAAPVVV8AAAAAAD/AAAAAAA9VVXwAAAAAAP8AAAAAAPVVVXwAAAAAA/wAAAAAA9VVVfAAAAAAD/AAAAAAD1VVV8AAAAAAP8AAAAAAPVVVXwAAAAAA/wAAAAAA9VVVfAAAAAAD/AAAAAAD1VVV8AAAAAAP8AAAAAAPVVVXwAAAAAA/wAAAAAA9VVVfAAAAAAD/AAAAAAD1VVV8AAAAAAP8AAAAAAD1VVfAAAAAAA/wAAAAAAD1VXwAAAAAAPfAAAAAAAD1V8AAAAAAA98AAAAAAAD//AAAAAAAD3wAAAAAAAD/wAAAAAAAPXwAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAPVVVVVVVfAAAAAAAAAAD1VVVVVVVfwAAAAAAAAD9VVVVVVVVf8AAAAAAAA/VVVVVVVVVX/AAAAAAD/VVVVVVVVVVV////////1VVVVVVVVVVVf//////VVVVVVU="},
+ {"width" : "52", "buffer":"X///////////////9X////////////////3wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAD3////////wAAAAAAD1/////////AAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVV8AAAAAAPVVVVVVVVV8AAAAAAD1VVVVVVVVfAAAAAAD1VVVVVVVVXwAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVXwAAAAAAPVVVVVVVVV8AAAAAAPVVVVVVVVVfAAAAAAD1VVVVVVVVfAAAAAAA9VVVVVVVVV8AAAAAA9VVVVVVVVVf//////9VVVVVVVVVV//////9VVVVVVVQ=="},
+ {"width" : "58", "buffer":"VVVVVV///////VVVVVVVVVVVX////////VVVVVVVVVVf8AAAAAAD/VVVVVVVVV/wAAAAAAAD9VVVVVVVV/AAAAAAAAAD9VVVVVVV8AAAAAAAAAAP1VVVVVV8AAAAAAAAAAAPVVVVVV8AAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAA9VfAAAAAAA//wAAAAAAPVXwAAAAAA///AAAAAAD1V8AAAAAA9VV8AAAAAA9VfAAAAAA9VVXwAAAAAPVXwAAAAAPVVV8AAAAAD1V8AAAAAD1VVfAAAAAA9VfAAAAAA9VVV8AAAAAPVXwAAAAA9VVVfAAAAAD1V8AAAAAD1VVXwAAAAA9VfAAAAAA9VVXwAAAAAPVXwAAAAAPVVV8AAAAAD1V8AAAAAD1VVfAAAAAA9VfAAAAAAPVVfAAAAAAPVXwAAAAAD1VfAAAAAAPVVfAAAAAAP1fAAAAAAD1VXwAAAAAA//AAAAAAA9VV8AAAAAAA/AAAAAAAPVVfAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAA98AAAAAAAD/8AAAAAAAPfAAAAAAAP//wAAAAAAD3wAAAAAAP1VfAAAAAAA98AAAAAAPVVV8AAAAAAD/AAAAAAD1VVfAAAAAAA/wAAAAAD1VVV8AAAAAAP8AAAAAA9VVVfAAAAAAD/AAAAAAPVVVXwAAAAAA/wAAAAAD1VVV8AAAAAAP8AAAAAA9VVVfAAAAAAD/AAAAAAPVVVXwAAAAAA/wAAAAAD1VVV8AAAAAAP8AAAAAA9VVVfAAAAAAD/AAAAAAD1VVfAAAAAAA/wAAAAAAPVVXwAAAAAA98AAAAAAA9VfwAAAAAAPfAAAAAAAD//wAAAAAAD3wAAAAAAAP/AAAAAAAA98AAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAD1VVVVVVX/AAAAAAAAA/1VVVVVVVf/AAAAAAAD/1VVVVVVVVX////////9VVVVVVVVVVX///////1VVVVVQ=="},
+ {"width" : "58", "buffer":"VVVVVVf/////9VVVVVVVVVVVV////////VVVVVVVVVVX/AAAAAAP/VVVVVVVVVX8AAAAAAAD/VVVVVVVVfwAAAAAAAAD9VVVVVVVfwAAAAAAAAAD1VVVVVVfAAAAAAAAAAAPVVVVVVfAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAD3wAAAAAAAP/AAAAAAAA98AAAAAAAP/8AAAAAAAPfAAAAAAAPVXwAAAAAAD3wAAAAAAPVVfAAAAAAAP8AAAAAAPVVV8AAAAAAD/AAAAAAD1VVfAAAAAAA/wAAAAAA9VVV8AAAAAAP8AAAAAAPVVVfAAAAAAD/AAAAAAPVVVXwAAAAAA/wAAAAAD1VVV8AAAAAAP8AAAAAA9VVVfAAAAAAD/AAAAAAPVVVXwAAAAAA/wAAAAAA9VVV8AAAAAAP8AAAAAAPVVV8AAAAAAD/AAAAAAD1VVfAAAAAAA/wAAAAAAPVVXwAAAAAA98AAAAAAD1VXwAAAAAAPfAAAAAAAPVXwAAAAAAD3wAAAAAAA//wAAAAAAA98AAAAAAAD/wAAAAAAAPfAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAA9VVVVV/AAAAAAAAAAAA9VVVVVX8AAAAAAAAAAA9VVVVVVX8AAAAAAAAAAPVVVVVVVfwAAAAAAAAAD1VVVVVVVfwAAAAAAAAD1VVVVVVVV/8AAAAAAAA9VVVVVVVVV/wAAAAAAA9VVVVVVVVVVfAAAAAAAPVVVVVVVVVVXwAAAAAAPVVVVVVVVVVXwAAAAAAD1VVVVVVVVVV8AAAAAAA9VVVVVVVVVVfAAAAAAA9VVVVVVVVVVfAAAAAAAPVVVVVVVVVVXwAAAAAAPVVVVVVVVVVXwAAAAAAD1VVVVVVVVVV8AAAAAAD1VVVVVVVVVV8AAAAAAA9VVVVVVVVVVfAAAAAAA9VVVVVVVVVVfAAAAAAAPVVVVVVVVVVXwAAAAAAPVVVVVVVVVVXwAAAAAAD1VVVVVVVVVV8AAAAAAD1VVVVVVVVVV8AAAAAAA9VVVVVVVVVVfAAAAAAA9VVVVVVVVVVfAAAAAAAPVVVVVVVVVVXwAAAAAAPVVVVVVVVVVXwAAAAAAD1VVVVVVVVVV8AAAAAAA9VVVVVVVVVVfAAAAAAA9VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAAPVVVVVVVVVVXwAAAAAAD1VVVVVVVVVV8AAAAAAD1VVVVVVVVVVfAAAAAAA9VVVVVVVVVVXwAAAAAA9VVVVVVVVVVVf//////9VVVVVVVVVVVX//////9VVVVVVVVQ=="},
+ {"width" : "20", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/////////////8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA9//////1/////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/////////////wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD/AAAAAP8AAAAA/wAAAAD///////f/////8="}
+ ]
+}
diff --git a/apps/contourclock/font-SairaEC.json b/apps/contourclock/fonts/font-SairaEC.json
similarity index 100%
rename from apps/contourclock/font-SairaEC.json
rename to apps/contourclock/fonts/font-SairaEC.json
diff --git a/apps/contourclock/font-Teko.json b/apps/contourclock/fonts/font-Teko.json
similarity index 100%
rename from apps/contourclock/font-Teko.json
rename to apps/contourclock/fonts/font-Teko.json
diff --git a/apps/contourclock/fonts/font-TitanOne.json b/apps/contourclock/fonts/font-TitanOne.json
new file mode 100644
index 000000000..d8210a208
--- /dev/null
+++ b/apps/contourclock/fonts/font-TitanOne.json
@@ -0,0 +1,17 @@
+{
+ "name":"TitanOne",
+ "size":"100",
+ "characters":[
+ {"width" : "74", "buffer":"VVVVVVVVX///////VVVVVVVVVVVVVVVVf////////9VVVVVVVVVVVVVV//AAAAAAAP/1VVVVVVVVVVVV/8AAAAAAAAA/9VVVVVVVVVVV/wAAAAAAAAAAD/VVVVVVVVVVfwAAAAAAAAAAAA/VVVVVVVVVfwAAAAAAAAAAAAAP1VVVVVVVX8AAAAAAAAAAAAAAP1VVVVVVV8AAAAAAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAPAAAAAAAAAA9VVfAAAAAAAAAD/AAAAAAAAAD1VXwAAAAAAAAA9fAAAAAAAAAD1VfAAAAAAAAAPVfAAAAAAAAAPVV8AAAAAAAAA9V8AAAAAAAAA9VXwAAAAAAAAD1V8AAAAAAAAD1V8AAAAAAAAA9VXwAAAAAAAAD1XwAAAAAAAAD1VfAAAAAAAAAPVfAAAAAAAAAPVV8AAAAAAAAA9V8AAAAAAAAA9VXwAAAAAAAAD1XwAAAAAAAAD1VfAAAAAAAAAD18AAAAAAAAAPVV8AAAAAAAAAPXwAAAAAAAAD1VV8AAAAAAAAA9fAAAAAAAAAPVVXwAAAAAAAAD18AAAAAAAAA9VVfAAAAAAAAAPXwAAAAAAAAD1VV8AAAAAAAAA9fAAAAAAAAAPVVXwAAAAAAAAD18AAAAAAAAA9VVfAAAAAAAAAPXwAAAAAAAAD1VV8AAAAAAAAA9fAAAAAAAAAPVVXwAAAAAAAAA98AAAAAAAAA9VVfAAAAAAAAAD3wAAAAAAAAD1VV8AAAAAAAAAP8AAAAAAAAAPVVXwAAAAAAAAA/wAAAAAAAAA9VVfAAAAAAAAAD/AAAAAAAAAD1VV8AAAAAAAAAP8AAAAAAAAAPVVXwAAAAAAAAA/wAAAAAAAAA9VVfAAAAAAAAAD/AAAAAAAAAD1VV8AAAAAAAAAP8AAAAAAAAAPVVXwAAAAAAAAA/wAAAAAAAAA9VVfAAAAAAAAAD/AAAAAAAAAD1VV8AAAAAAAAAP8AAAAAAAAAPVVXwAAAAAAAAA/wAAAAAAAAA9VVfAAAAAAAAAD/AAAAAAAAAD1VV8AAAAAAAAAP8AAAAAAAAAPVVXwAAAAAAAAA/wAAAAAAAAA9VVfAAAAAAAAAD/AAAAAAAAAD1VV8AAAAAAAAAP8AAAAAAAAAPVVXwAAAAAAAAA98AAAAAAAAA9VVfAAAAAAAAAD3wAAAAAAAAD1VV8AAAAAAAAAPfAAAAAAAAAPVVXwAAAAAAAAA98AAAAAAAAA9VVfAAAAAAAAAPXwAAAAAAAAD1VV8AAAAAAAAA9fAAAAAAAAAPVVXwAAAAAAAAD18AAAAAAAAA9VVfAAAAAAAAAPXwAAAAAAAAD1VV8AAAAAAAAA9fAAAAAAAAAPVVXwAAAAAAAAD18AAAAAAAAA9VVfAAAAAAAAAPXwAAAAAAAAD1VV8AAAAAAAAA9XwAAAAAAAAD1VfAAAAAAAAAD1fAAAAAAAAAPVV8AAAAAAAAA9V8AAAAAAAAA9VXwAAAAAAAAD1XwAAAAAAAAD1VfAAAAAAAAAPVfAAAAAAAAAPVV8AAAAAAAAA9VfAAAAAAAAA9VXwAAAAAAAAD1V8AAAAAAAAA9VfAAAAAAAAA9VXwAAAAAAAAD1XwAAAAAAAAD1VfAAAAAAAAAD1fAAAAAAAAAPVVfAAAAAAAAAD/wAAAAAAAAA9VV8AAAAAAAAAD8AAAAAAAAAPVVXwAAAAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAAAAAAPVVVVVVfAAAAAAAAAAAAAAAAA9VVVVVV/AAAAAAAAAAAAAAAAPVVVVVVV/AAAAAAAAAAAAAAAP1VVVVVVVfAAAAAAAAAAAAAAD9VVVVVVVVfwAAAAAAAAAAAAD9VVVVVVVVVf8AAAAAAAAAAAA/VVVVVVVVVVX/AAAAAAAAAAD/VVVVVVVVVVVV//AAAAAAAAP/1VVVVVVVVVVVVf//////////VVVVVVVVVVVVVVVf///////9VVVVVVVU="},
+ {"width" : "44", "buffer":"VVVVVVVVVVVVVVVVVVVVVVf////9VVVVVVX////////1VVVX///8AAAAA/1VVf//AAAAAAAAD1V//AAAAAAAAAAPV/8AAAAAAAAAAA9fwAAAAAAAAAAAD18AAAAAAAAAAAAPXwAAAAAAAAAAAA9fAAAAAAAAAAAAD3wAAAAAAAAAAAAPfAAAAAAAAAAAAA98AAAAAAAAAAAAD3wAAAAAAAAAAAAPfAAAAAAAAAAAAA98AAAAAAAAAAAAD3wAAAAAAAAAAAAP8AAAAAAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAAAAP8AAAAAAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAAAAP8AAAAAAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAAAAP8AAAAAAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAAAAP8AAAAAAAAAAAAA/wAAAAAAAAAAAAD/AAAAAAAAAAAAAPfAAAAAAAAAAAAA98AAAAAAAAAAAAD3///8AAAAAAAAAPX///8AAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAAA9VVVV8AAAAAAAAD1VVVXwAAAAAAAAPVVVVfAAAAAAAD/9VVVVf/////////VVVVVf///////VVVVVVVVVVVVVVVVU="},
+ {"width" : "61", "buffer":"VVVVVV///////VVVVVVVVVVVX/////////9VVVVVVVVV//8AAAAAAD//VVVVVVVf/wAAAAAAAAAP/VVVVVV/8AAAAAAAAAAAD/VVVVV/AAAAAAAAAAAAAD9VVVX8AAAAAAAAAAAAAAD1VVX8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAD1fAAAAAD/wAAAAAAAAAA9XwAAAA///wAAAAAAAAAPVfAAAP/1V/AAAAAAAAAD1XwAA/9VVV8AAAAAAAAA9V8AA/VVVVfAAAAAAAAAPVXwD9VVVVXwAAAAAAAAD1VfP9VVVVV8AAAAAAAAA9VX/1VVVVVfAAAAAAAAA9VVXVVVVVVXwAAAAAAAAPVVVVVVVVVV8AAAAAAAAD1VVVVVVVVV8AAAAAAAAA9VVVVVVVVVfAAAAAAAAA9VVVVVVVVVfAAAAAAAAAPVVVVVVVVVfAAAAAAAAAD1VVVVVVVVXwAAAAAAAAD1VVVVVVVVXwAAAAAAAAA9VVVVVVVVXwAAAAAAAAA9VVVVVVVVXwAAAAAAAAAPVVVVVVVVXwAAAAAAAAAPVVVVVVVVV8AAAAAAAAAD1VVVVVVVV8AAAAAAAAAD1VVVVVVVV8AAAAAAAAAA9VVVVVVVV8AAAAAAAAAA9VVVVVVVV8AAAAAAAAAA9VVVVVVVV8AAAAAAAAAAPVVVVVVVV8AAAAAAAAAAPVVVVVVVV8AAAAAAAAAAPVVVVVVVV8AAAAAAAAAAPVVVVVVVV8AAAAAAAAAAPVVVVVVVV8AAAAAAAAAAPVVVVVVVV8AAAAAAAAAA/VVVVVVVV8AAAAAAAAAA/VVVVVVVV8AAAAAAAAAD9VVVVVVVV8AAAAAAAAAD9VVVVVVVV8AAAAAAAAAP1VVVVVVVV8AAAAAAAAAP1VVVVVVVV8AAAAAAAAAPVVVVVVVVV8AAAAAAAAAA///////1V8AAAAAAAAAAD///////VfAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1VX/////////////////9VVf////////////////9VVVVVVVVVVVVVVVVVVVVVQ=="},
+ {"width" : "61", "buffer":"VVVVVf///////VVVVVVVVVVVf/////////9VVVVVVVVX//AAAAAAAD//VVVVVVVf/AAAAAAAAAAP/VVVVVVfwAAAAAAAAAAAD9VVVVV/AAAAAAAAAAAAAD9VVVV/AAAAAAAAAAAAAAP1VVV8AAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAD/8AAAAAAAAAA9V8AAAA///wAAAAAAAAAPVXwAAP/1VfAAAAAAAAAD1V8AA/9VVV8AAAAAAAAD1VfAD/VVVVXwAAAAAAAA9VV8P9VVVVV8AAAAAAAAPVVf/1VVVVVfAAAAAAAAD1VV/VVVVVVXwAAAAAAAA9VVVVVVVVVXwAAAAAAAAPVVVVVVVVVfwAAAAAAAAPVVVVVVVVX/wAAAAAAAAD1VVVVX////AAAAAAAAAA9VVVVX///wAAAAAAAAAA9VVVVV8AAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAPVVVVVVXwAAAAAAAAAAAA9VVVVVV8AAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAA9VVVVf///wAAAAAAAAAAD1VVVV////wAAAAAAAAAA9VVVVVVVV/wAAAAAAAAAPVVVVVVVVV/AAAAAAAAAD1VVVVVVVVV8AAAAAAAAA9VVVVVVVVVfAAAAAAAAAPVVXVVVVVVV8AAAAAAAAD1Vf/1VVVVVfAAAAAAAAAPVfz/1VVVVXwAAAAAAAAD1XwA/9VVVXwAAAAAAAAA9XwAA//VVXwAAAAAAAAAPV8AAAP///wAAAAAAAAAD18AAAAD//wAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAP1VVV/AAAAAAAAAAAAAA/1VVVX/wAAAAAAAAAAAD/VVVVVX/8AAAAAAAAAAP9VVVVVVV//8AAAAAAAP/1VVVVVVVVf//////////VVVVVVVVVVVf///////VVVVVVVQ=="},
+ {"width" : "62", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/////1VVVVVVVVVVVVf////////VVVVVVVVVVX//8AAAAAD/VVVVVVVVVf/8AAAAAAAAPVVVVVVVVf/AAAAAAAAAAPVVVVVVVf8AAAAAAAAAAA9VVVVVVX8AAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAAPVVVVVVXwAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAAPVVVVVVfAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAPVVVfAAAAAADAAAAAAAAA9VVV8AAAAAA/AAAAAAAAD1VVfAAAAAAPfAAAAAAAAPVVV8AAAAAA98AAAAAAAA9VVfAAAAAAD3wAAAAAAAD1VV8AAAAAAPfAAAAAAAAPVVXwAAAAAD18AAAAAAAA9VV8AAAAAAPXwAAAAAAAD1VXwAAAAAA9fAAAAAAAAPVV8AAAAAAD18AAAAAAAA9VXwAAAAAA9XwAAAAAAAD1V8AAAAAAD1fAAAAAAAAPVXwAAAAAAPV8AAAAAAAA9VfAAAAAAA9XwAAAAAAAD1XwAAAAAAPVfAAAAAAAAPVfAAAAAAA9V8AAAAAAAA9XwAAAAAAD1XwAAAAAAAD1fAAAAAAAPVfAAAAAAAAPXwAAAAAAD1V8AAAAAAAA9fAAAAAAAPVXwAAAAAAAD18AAAAAAA9VfAAAAAAAAPfAAAAAAAD1V8AAAAAAAA98AAAAAAA9VXwAAAAAAAD3wAAAAAAD1VfAAAAAAAAP8AAAAAAAPVV8AAAAAAAA/wAAAAAAA9VXwAAAAAAAD/AAAAAAAPVVfAAAAAAAAP8AAAAAAAP//wAAAAAAAA/wAAAAAAAP/8AAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAD1/////////8AAAAAAAAAPV/////////8AAAAAAAAA9VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVXwAAAAAAAAPVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVXwAAAAAAAAPVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVXwAAAAAAAAPVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVXwAAAAAAAAPVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVXwAAAAAAAAPVVVVVVVVVVfAAAAAAAAA9VVVVVVVVVV8AAAAAAAAD1VVVVVVVVVXwAAAAAAAAPVVVVVVVVVVfAAAAAAAD/9VVVVVVVVVVf/////////VVVVVVVVVVVf///////VVVVVVVVVVVVVVVVVVVVVVU="},
+ {"width" : "61", "buffer":"VVVVVVVVVVVVVVVVVVVVVVf////////////////1VVX/////////////////VVXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAA9VVfAAAAAA//////////9VVXwAAAAA///////////VVV8AAAAA9VVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVfAAAAAPVVVVVVVVVVVVVXwAAAAD1VVVVVVVVVVVVV8AAAAAP////VVVVVVVVVfAAAAAA/////9VVVVVVVXwAAAAAAAAAD//1VVVVVV8AAAAAAAAAAAP/1VVVVVfAAAAAAAAAAAAA/1VVVVXwAAAAAAAAAAAAA/1VVVV8AAAAAAAAAAAAAA/VVVVfAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAA9VVf/AAAAAAAAAAAAAAAD1VV////AAAAAAAAAAAAA9VVVX///8AAAAAAAAAAAPVVVVVVX/8AAAAAAAAAAA9VVVVVVVf8AAAAAAAAAAPVVVVVVVVfwAAAAAAAAAD1VVVVVVVVfAAAAAAAAAA9VVVVVVVVV8AAAAAAAAAPVV9VVVVVVXwAAAAAAAAD1V/9VVVVVV8AAAAAAAAA9V8P9VVVVVXwAAAAAAAAPVfAP9VVVVXwAAAAAAAAD1fAAP9VVVV8AAAAAAAAA9XwAAP9VVV8AAAAAAAAAPV8AAAP/VX8AAAAAAAAAD18AAAAP//8AAAAAAAAAA9fAAAAAD/wAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAP1VVVfwAAAAAAAAAAAAAP1VVVV/wAAAAAAAAAAAA/VVVVVV/8AAAAAAAAAAP/VVVVVVV//wAAAAAAAP/9VVVVVVVVf//////////VVVVVVVVVVV////////VVVVVVVQ=="},
+ {"width" : "67", "buffer":"VVVVVVVVf///////1VVVVVVVVVVVVf//////////1VVVVVVVVVV//AAAAAAAA//9VVVVVVVVX/AAAAAAAAAAA//VVVVVVVX8AAAAAAAAAAAAP9VVVVVVfwAAAAAAAAAAAAAD1VVVVVfwAAAAAAAAAAAAAAPVVVVVfAAAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAP//AAAA9VVVfAAAAAAAAAD/////wAPVVVXwAAAAAAAAD/VVX///D1VVXwAAAAAAAAD1VVVVV//1VVV8AAAAAAAAD1VVVVVVX1VVVfAAAAAAAAD1VVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVVV8AAAAAAAA9VVVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVVXwAAAAAAAA9VVV///9VVVVV8AAAAAAAAPVV//////VVVVfAAAAAAAAPVX/8AAAP/VVVXwAAAAAAAD1f8AAAAAD9VVV8AAAAAAAA9/wAAAAAAD1VVfAAAAAAAAD/AAAAAAAAPVVXwAAAAAAAAMAAAAAAAAA9VV8AAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAAAPXwAAAAAAAAADwAAAAAAAAD18AAAAAAAAAD/AAAAAAAAAPfAAAAAAAAAD18AAAAAAAAD3wAAAAAAAAD1fAAAAAAAAA98AAAAAAAAA9V8AAAAAAAAPfAAAAAAAAAPVfAAAAAAAAD18AAAAAAAAPVXwAAAAAAAA9fAAAAAAAAD1V8AAAAAAAAD3wAAAAAAAA9VfAAAAAAAAA98AAAAAAAAPVV8AAAAAAAAPfAAAAAAAAD1VfAAAAAAAAD3wAAAAAAAA9VXwAAAAAAAA98AAAAAAAAPVV8AAAAAAAAPfAAAAAAAAD1VfAAAAAAAAD3wAAAAAAAA9VXwAAAAAAAA98AAAAAAAAPVV8AAAAAAAAPXwAAAAAAAD1VfAAAAAAAAD18AAAAAAAA9VXwAAAAAAAA9fAAAAAAAAPVV8AAAAAAAAPXwAAAAAAAD1VfAAAAAAAAD18AAAAAAAA9VXwAAAAAAAA9fAAAAAAAAPVV8AAAAAAAAPV8AAAAAAAD1VfAAAAAAAAD1fAAAAAAAA9VfAAAAAAAAA9XwAAAAAAAPVXwAAAAAAAAPV8AAAAAAAD1V8AAAAAAAAPVXwAAAAAAAPVfAAAAAAAAD1V8AAAAAAAD1XwAAAAAAAA9VfAAAAAAAA9V8AAAAAAAAPVV8AAAAAAAD18AAAAAAAAD1VfAAAAAAAAP8AAAAAAAAA9VXwAAAAAAAA8AAAAAAAAA9VVfAAAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAAAD1VVVVVV8AAAAAAAAAAAAAD1VVVVVVXwAAAAAAAAAAAAP1VVVVVVVfwAAAAAAAAAAAP1VVVVVVVV/wAAAAAAAAAA/VVVVVVVVVV/wAAAAAAAAP/VVVVVVVVVVV//AAAAAAD/9VVVVVVVVVVVV/////////VVVVVVVVVVVVVVX//////1VVVVVVQ=="},
+ {"width" : "57", "buffer":"VVVVVVVVVVVVVVVVVVVV////////////////9VV/////////////////1XwAAAAAAAAAAAAAAAD9XwAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAPVX///////wAAAAAAAAPVX///////8AAAAAAAAPVVVVVVVVVfAAAAAAAAPVVVVVVVVVfAAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVV8AAAAAAAA9VVVVVVVVXwAAAAAAAA9VVVVVVVVXwAAAAAAAD1VVVVVVVVXwAAAAAAAD1VVVVVVVVXwAAAAAAAD1VVVVVVVVfAAAAAAAAD1VVVVVVVVfAAAAAAAAD1VVVVVVVVfAAAAAAAAPVVVVVVVVVfAAAAAAAAPVVVVVVVVV8AAAAAAAAPVVVVVVVVV8AAAAAAAAPVVVVVVVVV8AAAAAAAAPVVVVVVVVV8AAAAAAAAPVVVVVVVVXwAAAAAAAA9VVVVVVVVXwAAAAAAAA9VVVVVVVVXwAAAAAAAA9VVVVVVVVXwAAAAAAAA9VVVVVVVVfAAAAAAAAA9VVVVVVVVfAAAAAAAAD1VVVVVVVVfAAAAAAAAD1VVVVVVVVfAAAAAAAAD1VVVVVVVV8AAAAAAAAD1VVVVVVVV8AAAAAAAAD1VVVVVVVV8AAAAAAAAPVVVVVVVVV8AAAAAAAAPVVVVVVVVXwAAAAAAAAPVVVVVVVVXwAAAAAAAAPVVVVVVVVXwAAAAAAAAPVVVVVVVVXwAAAAAAAA9VVVVVVVVfAAAAAAAAA9VVVVVVVVfAAAAAAAAA9VVVVVVVVfAAAAAAAAA9VVVVVVVVfAAAAAAAAA9VVVVVVVV8AAAAAAAAA9VVVVVVVV8AAAAAAAAD1VVVVVVVV8AAAAAAAAD1VVVVVVVV8AAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAPVVVVVVVVXwAAAAAAAAPVVVVVVVVfAAAAAAAAAPVVVVVVVVfAAAAAAAAAPVVVVVVVVfAAAAAAAAAPVVVVVVVVfAAAAAAAAAPVVVVVVVV8AAAAAAAAA9VVVVVVVV8AAAAAAAAA9VVVVVVVV8AAAAAAAAA9VVVVVVVV8AAAAAAAAA9VVVVVVVV8AAAAAAAAA9VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVXwAAAAAAAAD1VVVVVVVfAAAAAAAAAD1VVVVVVVXwAAAAAAD//VVVVVVVVX/////////9VVVVVVVVV///////9VVVVVVVVVVVVVVVVVVVVVVVVVV"},
+ {"width" : "66", "buffer":"VVVVVVVX//////1VVVVVVVVVVVVVf/////////VVVVVVVVVVVf/8AAAAAAP/9VVVVVVVVVX/wAAAAAAAAA/9VVVVVVVV/wAAAAAAAAAAD/VVVVVVVX8AAAAAAAAAAAAD9VVVVVV/AAAAAAAAAAAAAA/VVVVVX8AAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAwAAAAAAAAD1XwAAAAAAAAP8AAAAAAAAD1XwAAAAAAAA/fAAAAAAAAD1XwAAAAAAAD1XwAAAAAAAA9XwAAAAAAAD1V8AAAAAAAA9XwAAAAAAAD1V8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAPVV8AAAAAAAA9XwAAAAAAAD1V8AAAAAAAA9XwAAAAAAAD1XwAAAAAAAA9XwAAAAAAAA9XwAAAAAAAA9XwAAAAAAAAP/AAAAAAAAD1XwAAAAAAAAD8AAAAAAAAD1V8AAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAwAAAAAAAAA9fAAAAAAAAAP8AAAAAAAAAPfAAAAAAAAA/fAAAAAAAAAPfAAAAAAAAD1XwAAAAAAAAPfAAAAAAAAD1V8AAAAAAAAP8AAAAAAAAD1V8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAP8AAAAAAAAPVV8AAAAAAAAPfAAAAAAAAPVV8AAAAAAAAPfAAAAAAAAD1V8AAAAAAAAPfAAAAAAAAD1V8AAAAAAAAPfAAAAAAAAD1XwAAAAAAAA9fAAAAAAAAA9XwAAAAAAAA9XwAAAAAAAAP/AAAAAAAAA9XwAAAAAAAAD8AAAAAAAAA9XwAAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAA9VVVVX8AAAAAAAAAAAAAAD1VVVVV/AAAAAAAAAAAAAA/VVVVVVX8AAAAAAAAAAAAD9VVVVVVV/wAAAAAAAAAAA/VVVVVVVVX/AAAAAAAAAA/9VVVVVVVVVf/wAAAAAAA//VVVVVVVVVVV//////////VVVVVVVVVVVVVf///////VVVVVVV"},
+ {"width" : "67", "buffer":"VVVVVVVX//////VVVVVVVVVVVVVVX////////1VVVVVVVVVVVVf/wAAAAAD/9VVVVVVVVVVV/wAAAAAAAA/9VVVVVVVVVX/AAAAAAAAAAP1VVVVVVVVX8AAAAAAAAAAAP1VVVVVVVXwAAAAAAAAAAAA/VVVVVVVXwAAAAAAAAAAAAA9VVVVVVXwAAAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAAAD1VV8AAAAAAAAD8AAAAAAAA9VVfAAAAAAAAD/wAAAAAAAD1VfAAAAAAAAD1fAAAAAAAA9VXwAAAAAAAA9XwAAAAAAAD1V8AAAAAAAAPVfAAAAAAAA9V8AAAAAAAAPVXwAAAAAAAPVfAAAAAAAAD1V8AAAAAAAD1XwAAAAAAAA9VfAAAAAAAAPV8AAAAAAAAPVXwAAAAAAAD1fAAAAAAAAD1V8AAAAAAAA9XwAAAAAAAA9VfAAAAAAAAPV8AAAAAAAAPVXwAAAAAAAA98AAAAAAAAD1VfAAAAAAAAPfAAAAAAAAA9VXwAAAAAAAD3wAAAAAAAAPVV8AAAAAAAA98AAAAAAAAD1VfAAAAAAAAPfAAAAAAAAA9VXwAAAAAAAD3wAAAAAAAAPVV8AAAAAAAA9fAAAAAAAAD1VfAAAAAAAAPXwAAAAAAAA9VfAAAAAAAAA98AAAAAAAAPVXwAAAAAAAAPfAAAAAAAAD1V8AAAAAAAAD3wAAAAAAAA9VfAAAAAAAAA98AAAAAAAAPVXwAAAAAAAAPfAAAAAAAAD1V8AAAAAAAAD3wAAAAAAAA9VfAAAAAAAAA98AAAAAAAAD1XwAAAAAAAAPXwAAAAAAAA9XwAAAAAAAAD18AAAAAAAAD18AAAAAAAAA9fAAAAAAAAAP8AAAAAAAAAPXwAAAAAAAAA8AAAAAAAAAD1fAAAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAAAA9VVfAAAAAAAADAAAAAAAAAPVVV8AAAAAAAP8AAAAAAAAD1VVX8AAAAAP/3wAAAAAAAA9VVVf/AAAP//V8AAAAAAAAPVVVVf/////VVfAAAAAAAAPVVVVVX///VVVXwAAAAAAAD1VVVVVVVVVVVV8AAAAAAAA9VVVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVVVfAAAAAAAAD1VVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVVfAAAAAAAAD1VVVf9VVVVVV/AAAAAAAAA9VVVf///1VVX/AAAAAAAAAPVVVXwP/////8AAAAAAAAAD1VVXwAAA///wAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAA9VVVfAAAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAAPVVVVfAAAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAAAP1VVVVV8AAAAAAAAAAAAAAP1VVVVVf8AAAAAAAAAAAAA/VVVVVVVf/AAAAAAAAAAAD/VVVVVVVVf//AAAAAAAAD/9VVVVVVVVVX///////////1VVVVVVVVVVVX////////1VVVVVVVQ=="},
+ {"width" : "23", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9VVX/////VV/AAAA/VfAAAAAPV8AAAAAPfAAAAAA98AAAAAD3wAAAAAP8AAAAAA/wAAAAAD/AAAAAAP8AAAAAA/wAAAAAD/AAAAAAP8AAAAAA/wAAAAAD/AAAAAAP8AAAAAA/wAAAAAD3wAAAAAPfAAAAAA98AAAAAD18AAAAAPXwAAAAD1XwAAAA9VX/AAD/VVX////1VVVf//VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//VVVVX////VVX/wAP/VV/AAAAPVfAAAAAPV8AAAAAPfAAAAAA98AAAAAD3wAAAAAP8AAAAAA/wAAAAAD/AAAAAAP8AAAAAA/wAAAAAD/AAAAAAP8AAAAAA/wAAAAAD/AAAAAAP8AAAAAA98AAAAAD3wAAAAAPfAAAAAA98AAAAAD18AAAAA9XwAAAAD1X8AAAD9VX/////VVV////VU="}
+ ]
+}
diff --git a/apps/contourclock/font-Yumaro.json b/apps/contourclock/fonts/font-Yumaro.json
similarity index 100%
rename from apps/contourclock/font-Yumaro.json
rename to apps/contourclock/fonts/font-Yumaro.json
diff --git a/apps/contourclock/font-YuseiMagic.json b/apps/contourclock/fonts/font-YuseiMagic.json
similarity index 100%
rename from apps/contourclock/font-YuseiMagic.json
rename to apps/contourclock/fonts/font-YuseiMagic.json
diff --git a/apps/contourclock/fonts/temp b/apps/contourclock/fonts/temp
deleted file mode 100644
index 8b1378917..000000000
--- a/apps/contourclock/fonts/temp
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/apps/contourclock/metadata.json b/apps/contourclock/metadata.json
index 6b2b51991..087d75843 100644
--- a/apps/contourclock/metadata.json
+++ b/apps/contourclock/metadata.json
@@ -1,7 +1,7 @@
{ "id": "contourclock",
"name": "Contour Clock",
"shortName" : "Contour Clock",
- "version":"0.28",
+ "version":"0.29",
"icon": "app.png",
"readme": "README.md",
"description": "A Minimalist clockface with large Digits.",
diff --git a/apps/contourclock/screenshot.png b/apps/contourclock/screenshot.png
deleted file mode 100644
index 9e263152c..000000000
Binary files a/apps/contourclock/screenshot.png and /dev/null differ
diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog
index 61a09a18d..751164c07 100644
--- a/apps/daisy/ChangeLog
+++ b/apps/daisy/ChangeLog
@@ -7,3 +7,4 @@
0.07: Use default Bangle formatter for booleans
0.08: fix idle timer always getting set to true
0.09: Use 'modules/suncalc.js' to avoid it being copied 8 times for different apps
+0.10: Use widget_utils.
diff --git a/apps/daisy/app.js b/apps/daisy/app.js
index c99b19228..3b3975105 100644
--- a/apps/daisy/app.js
+++ b/apps/daisy/app.js
@@ -1,6 +1,7 @@
var SunCalc = require("suncalc"); // from modules folder
const storage = require('Storage');
const locale = require("locale");
+const widget_utils = require('widget_utils');
const SETTINGS_FILE = "daisy.json";
const LOCATION_FILE = "mylocation.json";
const h = g.getHeight();
@@ -547,8 +548,6 @@ g.clear();
Bangle.loadWidgets();
/*
* we are not drawing the widgets as we are taking over the whole screen
- * so we will blank out the draw() functions of each widget and change the
- * area to the top bar doesn't get cleared.
*/
-for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
+widget_utils.hide();
draw();
diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json
index 0bad50151..471f8e56f 100644
--- a/apps/daisy/metadata.json
+++ b/apps/daisy/metadata.json
@@ -1,6 +1,6 @@
{ "id": "daisy",
"name": "Daisy",
- "version":"0.09",
+ "version":"0.10",
"dependencies": {"mylocation":"app"},
"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",
diff --git a/apps/espruinoctrl/ChangeLog b/apps/espruinoctrl/ChangeLog
index 5560f00bc..819ae56cb 100644
--- a/apps/espruinoctrl/ChangeLog
+++ b/apps/espruinoctrl/ChangeLog
@@ -1 +1,2 @@
0.01: New App!
+0.02: Disable not existing BTN3 on Bangle.js 2, set maximum transmit power
diff --git a/apps/espruinoctrl/custom.html b/apps/espruinoctrl/custom.html
index f8e7e38b9..2329ad214 100644
--- a/apps/espruinoctrl/custom.html
+++ b/apps/espruinoctrl/custom.html
@@ -164,6 +164,7 @@ function cmd(cmd,mac,rx) {
if (mac) {
E.showMessage("Connecting\\n"+mac);
if (mac.length==17) mac+=" random";
+ NRF.setTxPower(process.env.HWVERSION == 2 ? 8 : 4);
NRF.connect(mac).then(dev=>send(dev,cmd,onDone)).catch(err);
} else {
E.showMessage("Scanning...");
@@ -193,14 +194,16 @@ function sendCommandRX(device, text, callback) {
function done() {
Terminal.println("\\n============\\n Disconnected");
device.disconnect();
- setTimeout(function() {
- setWatch(function() {
- if (callback) callback();
- resolve();
- }, BTN3);
- g.reset().setFont("6x8",2).setFontAlign(0,0,1);
- g.drawString("Back", g.getWidth()-10, g.getHeight()-50);
- }, 200);
+ if (global.BTN3 !== undefined) {
+ setTimeout(function() {
+ setWatch(function() {
+ if (callback) callback();
+ resolve();
+ }, BTN3);
+ g.reset().setFont("6x8",2).setFontAlign(0,0,1);
+ g.drawString("Back", g.getWidth()-10, g.getHeight()-50);
+ }, 200);
+ }
}
device.getPrimaryService("6e400001-b5a3-f393-e0a9-e50e24dcca9e").then(function(s) {
service = s;
diff --git a/apps/espruinoctrl/metadata.json b/apps/espruinoctrl/metadata.json
index 5107bc6ae..9308b4a46 100644
--- a/apps/espruinoctrl/metadata.json
+++ b/apps/espruinoctrl/metadata.json
@@ -2,7 +2,7 @@
"id": "espruinoctrl",
"name": "Espruino Control",
"shortName": "Espruino Ctrl",
- "version": "0.01",
+ "version": "0.02",
"description": "Send commands to other Espruino devices via the Bluetooth UART interface. Customisable commands!",
"icon": "app.png",
"tags": "tool,bluetooth",
diff --git a/apps/fuzzyw/ChangeLog b/apps/fuzzyw/ChangeLog
index 0e5b66949..206efb10f 100644
--- a/apps/fuzzyw/ChangeLog
+++ b/apps/fuzzyw/ChangeLog
@@ -1,2 +1,3 @@
0.01: First release
0.02: Move translations to locale module (removed watch settings, now pick language in Bangle App Loader, More..., Settings)
+0.03: Change for fast loading, use widget_utils to hide widgets
\ No newline at end of file
diff --git a/apps/fuzzyw/fuzzyw.app.js b/apps/fuzzyw/fuzzyw.app.js
index debcb3c4d..e185e2ccf 100644
--- a/apps/fuzzyw/fuzzyw.app.js
+++ b/apps/fuzzyw/fuzzyw.app.js
@@ -1,6 +1,8 @@
// adapted from https://github.com/hallettj/Fuzzy-Text-International/
+{
+ const SETTINGS_FILE = "fuzzyw.settings.json";
-let fuzzy_string = {
+ let fuzzy_string = {
"hours":[
/*LANG*/"twelve",
/*LANG*/"one",
@@ -35,7 +37,11 @@ let text_scale = 3.5;
let timeout = 2.5*60;
let drawTimeout;
-function queueDraw(seconds) {
+let loadSettings = function() {
+ settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'showWidgets': false};
+}
+
+let queueDraw = function(seconds) {
let millisecs = seconds * 1000;
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
@@ -47,7 +53,7 @@ function queueDraw(seconds) {
const h = g.getHeight();
const w = g.getWidth();
-function getTimeString(date) {
+let getTimeString = function(date) {
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];
@@ -59,7 +65,7 @@ function getTimeString(date) {
return f_string;
}
-function draw() {
+let draw = function() {
let time_string = getTimeString(new Date()).replace('*', '');
// print(time_string);
g.setFont('Vector', (h-24*2)/text_scale);
@@ -71,7 +77,7 @@ function draw() {
}
g.clear();
-draw();
+loadSettings();
// Stop updates when LCD is off, restart when on
Bangle.on('lcdPower',on=>{
@@ -83,6 +89,22 @@ Bangle.on('lcdPower',on=>{
}
});
-Bangle.setUI('clock');
+Bangle.setUI({
+ mode : 'clock',
+ remove : function() {
+ // Called to unload all of the clock app
+ if (drawTimeout) clearTimeout(drawTimeout);
+ drawTimeout = undefined;
+ require('widget_utils').show(); // re-show widgets
+ }
+});
+
Bangle.loadWidgets();
-Bangle.drawWidgets();
+if (settings.showWidgets) {
+ Bangle.drawWidgets();
+} else {
+ require("widget_utils").swipeOn(); // hide widgets, make them visible with a swipe
+}
+
+draw();
+}
\ No newline at end of file
diff --git a/apps/fuzzyw/fuzzyw.settings.js b/apps/fuzzyw/fuzzyw.settings.js
new file mode 100644
index 000000000..8feb30bfb
--- /dev/null
+++ b/apps/fuzzyw/fuzzyw.settings.js
@@ -0,0 +1,33 @@
+(function(back) {
+ const SETTINGS_FILE = "fuzzy.settings.json";
+
+ // initialize with default settings...
+ let s = {'showWidgets': false}
+
+ // ...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 Word Clock' },
+ '< Back': back,
+ 'Show Widgets': {
+ value: settings.showWidgets,
+ format: () => (settings.showWidgets ? 'Yes' : 'No'),
+ onchange: () => {
+ settings.showWidgets = !settings.showWidgets;
+ save();
+ }
+ },
+ });
+})
diff --git a/apps/fuzzyw/metadata.json b/apps/fuzzyw/metadata.json
index 5d3045edb..d1040fda3 100644
--- a/apps/fuzzyw/metadata.json
+++ b/apps/fuzzyw/metadata.json
@@ -2,7 +2,7 @@
"id":"fuzzyw",
"name":"Fuzzy Text Clock",
"shortName": "Fuzzy Text",
- "version": "0.02",
+ "version": "0.03",
"description": "An imprecise clock for when you're not in a rush",
"readme": "README.md",
"icon":"fuzzyw.png",
@@ -13,6 +13,10 @@
"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}
+ ],
+ "data": [
+ {"name":"fuzzyw.settings.json"}
]
}
diff --git a/apps/gpsinfo/ChangeLog b/apps/gpsinfo/ChangeLog
index 827c13cdb..d5abdf5d6 100644
--- a/apps/gpsinfo/ChangeLog
+++ b/apps/gpsinfo/ChangeLog
@@ -8,3 +8,4 @@
0.09: Fix FIFO_FULL error
0.10: Show satellites "in view" separated by GNS-system
0.11: Show number of packets received
+0.12: Fix number of packets received
diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js
index 28cb60d8d..bbe043913 100644
--- a/apps/gpsinfo/gps-info.js
+++ b/apps/gpsinfo/gps-info.js
@@ -61,6 +61,7 @@ function getMaidenHead(param1,param2){
return U[fLon]+U[fLat]+sqLon+sqLat+L[subLon]+L[subLat]+extLon+extLat;
}
function onGPS(fix) {
+ dataCounter++;
if (lastFix.fix != fix.fix) {
// if fix is different, change the layout
if (fix.fix && leaveNofixLayout) {
@@ -127,10 +128,10 @@ function onGPS(fix) {
layout.progress.label = "in view GP/BD/GL: " + nofGP + " " + nofBD + " " + nofGL;
// console.log("in view GP/BD/GL: " + nofGP + " " + nofBD + " " + nofGL);
layout.render(layout.progress);
- layout.clear(layout.dataCounter);
- layout.dataCounter.label = ++dataCounter;
- layout.render(layout.dataCounter);
}
+ layout.clear(layout.dataCounter);
+ layout.dataCounter.label = dataCounter;
+ layout.render(layout.dataCounter);
}
if (listenerGPSraw == 0 && !fix.fix) {
@@ -157,6 +158,7 @@ Bangle.on('GPS', onGPS);
//Bangle.on('GPS-raw', onGPSraw);
Bangle.setGPSPower(1, "app");
+
function exitApp() {
load();
}
diff --git a/apps/gpsinfo/metadata.json b/apps/gpsinfo/metadata.json
index e426f5740..815cdbf21 100644
--- a/apps/gpsinfo/metadata.json
+++ b/apps/gpsinfo/metadata.json
@@ -1,7 +1,7 @@
{
"id": "gpsinfo",
"name": "GPS Info",
- "version": "0.11",
+ "version": "0.12",
"description": "An application that displays information about latitude, longitude, altitude, speed, satellites and time",
"icon": "gps-info.png",
"type": "app",
diff --git a/apps/ha/ChangeLog b/apps/ha/ChangeLog
index c0d58e5bc..2a911c207 100644
--- a/apps/ha/ChangeLog
+++ b/apps/ha/ChangeLog
@@ -5,3 +5,5 @@
0.05: Clkinfo improvements.
0.06: Updated clkinfo icon.
0.07: Update clock_info to avoid a redraw
+0.08: Allow swiping to switch triggers
+0.09: Improve web interface, arrows in UI
diff --git a/apps/ha/README.md b/apps/ha/README.md
index 654a262c8..b0309b040 100644
--- a/apps/ha/README.md
+++ b/apps/ha/README.md
@@ -1,28 +1,30 @@
# Home Assistant
-This app integrates your BangleJs into the HomeAssistant.
+This app integrates your Bangle.js into the Home Assistant.
# How to use
-Click on the left and right side of the screen to select the triggers that you
-configured. Click in the middle of the screen to send the trigger to HomeAssistant.
+Click on the left or right side of the screen to select the triggers that you configured.
+Swiping left or right works as well.
+
+Click in the middle of the screen to send the trigger to Home Assistant via Gadgetbridge.

# Initial Setup
-1.) First of all, make sure that HomeAssistant and the HomeAssistant Android App works.
+1.) First of all, make sure that Home Assistant and the Home Assistant Android Companion App work.
-2.) Open your BangleJs Gadgetbridge App, click on the Settings icon of your BangleJs and enable "Allow Intent Access"
+2.) Open your Bangle.js Gadgetbridge App, click on the Settings icon of your Bangle.js and enable "Allow Intent Access"
-3.) Enable sensor in HomeAssistant Andoird App/Configuration/Companion App/Manage Sensors/LastUpdate Trigger
+3.) Enable sensor in Home Assistant Android App/Configuration/Companion App/Manage Sensors/LastUpdate Trigger
4.) At the bottom of the same screen click on "Add New Intent" and enter "com.espruino.gadgetbridge.banglejs.HA"
-5.) The HomeAssistant Android app must be restarted in order to listen for those actions
+5.) The Home Assistant Android app must be restarted in order to listen for those actions
-- a "Force Stop" is necessary (through Android App settings) or restart your phone!
This setup must be done only once -- now you are ready to configure your BangleJS to
-control some devices or entities in your HomeAssistant :)
+control some devices or entities in your Home Assistant :)
# Setup Trigger
@@ -35,7 +37,7 @@ The following icons are currently supported:
- fire
-2.) Create an "automation" in the HomeAssistant WebUI for each trigger that you created on your BangleJs in order to tell HomeAssistant what you want to control. A sample configuration is shown in the image below -- I use this trigger to open the door:
+2.) Create an "automation" in the Home Assistant WebUI for each trigger that you created on your Bangle.js in order to tell Home Assistant what you want to control. A sample configuration is shown in the image below -- I use this trigger to open the door:

@@ -48,7 +50,7 @@ This app also implements two default trigger that can always be used:
- TRIGGER -- Will be sent whenever some trigger is executed. So you could generically listen to that.
-# How to use the library (ha.lib.js) in my own app/clk
+# How to use the library (ha.lib.js) in my own app/clock
This app inlcludes a library that can be used by other apps or clocks
to read all configured intents or to send a trigger. Example code:
@@ -74,17 +76,20 @@ ha.sendTrigger("MY_CUSTOM_TRIGGER");
# FAQ
## Sometimes the trigger is not executed
-While playing and testing a bit I found that it is very important that you allow the android HomeAssistant app, as well as BangleJs Gadgetbridge app to (1) run in background and (2), disable energy optimizations for both apps.
-Otherwise, Android could stop one of both apps and the trigger will never be sent to HomeAssistant...
+While playing and testing a bit I found that it is very important that you allow the android Home Assistant app, as well as Bangle.js Gadgetbridge app to (1) run in background and (2), disable energy optimizations for both apps.
+Otherwise, Android could stop one of both apps and the trigger will never be sent to Home Assistant...
If you still have problems, you can try another trick:
-Install "MacroDroid" from the Android AppStore and start the HomeAssistant App
+Install "MacroDroid" from the Android AppStore and start the Home Assistant App
each time the "com.espruino.gadgetbridge.banglejs.HA" intent is send together
-with the extra trigger: APP_STARTED. Then whenever you open the app on your BangleJs
-it is ensured that HomeAssistant is running...
+with the extra trigger: APP_STARTED. Then whenever you open the app on your Bangle.js
+it is ensured that Home Assistant is running...
## Thanks to
Icons created by Flaticon
## Creator
- [David Peer](https://github.com/peerdavid).
+
+## Contributor
+- [myxor](https://github.com/myxor)
diff --git a/apps/ha/custom.html b/apps/ha/custom.html
deleted file mode 100644
index 49f5a2eb8..000000000
--- a/apps/ha/custom.html
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
Upload Tigger
-
-
-
-
-
-
-
-
diff --git a/apps/ha/ha.app.js b/apps/ha/ha.app.js
index d9199fb0e..14c6dc3be 100644
--- a/apps/ha/ha.app.js
+++ b/apps/ha/ha.app.js
@@ -17,39 +17,41 @@ function draw() {
g.setFontAlign(-1,-1);
var icon = trigger.getIcon();
- g.setColor(g.theme.fg).drawImage(icon, 12, H/5-2);
- g.drawString("Home", icon.width + 20, H/5);
- g.drawString("Assistant", icon.width + 18, H/5+24);
+ g.setColor(g.theme.fg).drawImage(icon, 12, H/5-2-5);
+ g.drawString("Home", icon.width + 20, H/5-5);
+ g.drawString("Assistant", icon.width + 18, H/5+24-5);
g.setFontAlign(0,0);
- var ypos = H/5*3+20;
+ var ypos = H/5*3+23;
g.drawRect(W/2-w/2-8, ypos-h/2-8, W/2+w/2+5, ypos+h/2+5);
g.fillRect(W/2-w/2-6, ypos-h/2-6, W/2+w/2+3, ypos+h/2+3);
g.setColor(g.theme.bg).drawString(trigger.display, W/2, ypos);
+
+ // draw arrows
+ g.setColor(g.theme.fg);
+ if (position > 0) {
+ g.drawLine(10, H/2, 20, H/2 - 10);
+ g.drawLine(10, H/2, 20, H/2 + 10);
+ }
+ if (position < triggers.length -1) {
+ g.drawLine(W - 10, H/2, W - 20, H/2 - 10);
+ g.drawLine(W - 10, H/2, W - 20, H/2 + 10);
+ }
}
-
-Bangle.on('touch', function(btn, e){
- var left = parseInt(g.getWidth() * 0.3);
- var right = g.getWidth() - left;
- var isLeft = e.x < left;
- var isRight = e.x > right;
-
- if(isRight){
- Bangle.buzz(40, 0.6);
- position += 1;
- position = position >= triggers.length ? 0 : position;
- draw();
- }
-
- if(isLeft){
+function toLeft() {
Bangle.buzz(40, 0.6);
position -= 1;
position = position < 0 ? triggers.length-1 : position;
draw();
- }
-
- if(!isRight && !isLeft){
+}
+function toRight() {
+ Bangle.buzz(40, 0.6);
+ position += 1;
+ position = position >= triggers.length ? 0 : position;
+ draw();
+}
+function sendTrigger() {
ha.sendTrigger("TRIGGER");
// Now send the selected trigger
@@ -59,9 +61,34 @@ Bangle.on('touch', function(btn, e){
Bangle.buzz(80, 0.6);
}, 250);
});
+}
+
+Bangle.on('touch', function(btn, e){
+ var left = parseInt(g.getWidth() * 0.3);
+ var right = g.getWidth() - left;
+ var isLeft = e.x < left;
+ var isRight = e.x > right;
+
+ if(isLeft){
+ toLeft();
+ }
+ if(isRight){
+ toRight();
+ }
+ if(!isRight && !isLeft){
+ sendTrigger();
}
});
+Bangle.on("swipe", (lr,ud) => {
+ if (lr == -1) {
+ toLeft();
+ }
+ if (lr == 1) {
+ toRight();
+ }
+ });
+
// Send intent that the we started the app.
ha.sendTrigger("APP_STARTED");
diff --git a/apps/ha/interface.html b/apps/ha/interface.html
new file mode 100644
index 000000000..3520b217b
--- /dev/null
+++ b/apps/ha/interface.html
@@ -0,0 +1,52 @@
+
+
+
+
+
+
Home Assistant trigger config
+
+
+
+
+
+
+
+
diff --git a/apps/ha/metadata.json b/apps/ha/metadata.json
index 1432e010e..d44b4b6f8 100644
--- a/apps/ha/metadata.json
+++ b/apps/ha/metadata.json
@@ -1,14 +1,14 @@
{
"id": "ha",
- "name": "HomeAssistant",
- "version": "0.07",
- "description": "Integrates your BangleJS into HomeAssistant.",
+ "name": "Home Assistant",
+ "version": "0.09",
+ "description": "Integrates your Bangle.js into Home Assistant.",
"icon": "ha.png",
"type": "app",
- "tags": "tool,clkinfo",
+ "tags": "tool,clkinfo,bluetooth",
"readme": "README.md",
"supports": ["BANGLEJS2"],
- "custom": "custom.html",
+ "interface": "interface.html",
"screenshots": [
{"url":"screenshot.png"},
{"url":"screenshot_2.png"},
diff --git a/apps/health/ChangeLog b/apps/health/ChangeLog
index 7ea528ca6..921b2b682 100644
--- a/apps/health/ChangeLog
+++ b/apps/health/ChangeLog
@@ -20,3 +20,4 @@
0.19: Can show notification when daily step goal is reached
0.20: Fix the settings page, it would not update settings correctly.
0.21: Update boot.min.js.
+0.22: Fix timeout for heartrate sensor on 3 minute setting (#2435)
\ No newline at end of file
diff --git a/apps/health/boot.js b/apps/health/boot.js
index 74ac7c894..ae9a7cdc9 100644
--- a/apps/health/boot.js
+++ b/apps/health/boot.js
@@ -11,7 +11,7 @@
Bangle.setHRMPower(1, "health");
setTimeout(()=>{
Bangle.setHRMPower(0, "health");
- }, (i * 200000) + 60000);
+ }, 60000);
}, (i * 200000));
}
}
diff --git a/apps/health/boot.min.js b/apps/health/boot.min.js
index f255f271e..e3e45c400 100644
--- a/apps/health/boot.min.js
+++ b/apps/health/boot.min.js
@@ -1,5 +1,5 @@
function l(){var a=require("Storage").readJSON("health.json",1)||{},d=Bangle.getHealthStatus("day").steps;a.stepGoalNotification&&0=a.stepGoal&&(d=(new Date(Date.now())).toISOString().split("T")[0],!a.stepGoalNotificationDate||a.stepGoalNotificationDate=b;b++)setTimeout(function(){Bangle.setHRMPower(1,"health");setTimeout(function(){Bangle.setHRMPower(0,"health")},2E5*b+6E4)},2E5*b)};Bangle.on("health",d);Bangle.on("HRM",function(b){80>8,c.steps&255,c.bpm,Math.min(c.movement/8,255))}var b=new Date(Date.now()-59E4);a&&0k;k++)e=g.substr(h,4),"\u00ff\u00ff\u00ff\u00ff"!=e&&(a.steps+=(e.charCodeAt(0)<<8)+e.charCodeAt(1),a.movement+=e.charCodeAt(2),a.movCnt++,e=e.charCodeAt(2),a.bpm+=e,e&&a.bpmCnt++),h-=4;a.bpmCnt&&(a.bpm/=
-a.bpmCnt);a.movCnt&&(a.movement/=a.movCnt);require("Storage").write(b,d(a),f,17988)}})
+a))}(function(){var a=0|(require("Storage").readJSON("health.json",1)||{}).hrm;if(1==a||2==a){function d(){Bangle.setHRMPower(1,"health");setTimeout(()=>Bangle.setHRMPower(0,"health"),6E4*a);if(1==a)for(var b=1;2>=b;b++)setTimeout(()=>{Bangle.setHRMPower(1,"health");setTimeout(()=>{Bangle.setHRMPower(0,"health")},6E4)},2E5*b)}Bangle.on("health",d);Bangle.on("HRM",b=>{80{function d(c){return String.fromCharCode(c.steps>>8,c.steps&255,c.bpm,Math.min(c.movement/8,255))}var b=new Date(Date.now()-59E4);a&&0k;k++)e=g.substr(h,4),"\u00ff\u00ff\u00ff\u00ff"!=e&&(a.steps+=(e.charCodeAt(0)<<8)+e.charCodeAt(1),a.movement+=e.charCodeAt(2),a.movCnt++,e=e.charCodeAt(2),a.bpm+=e,e&&a.bpmCnt++),h-=4;a.bpmCnt&&(a.bpm/=a.bpmCnt);a.movCnt&&(a.movement/=a.movCnt);
+require("Storage").write(b,d(a),f,17988)}})
\ No newline at end of file
diff --git a/apps/health/metadata.json b/apps/health/metadata.json
index 482d72ec4..d80585200 100644
--- a/apps/health/metadata.json
+++ b/apps/health/metadata.json
@@ -2,7 +2,7 @@
"id": "health",
"name": "Health Tracking",
"shortName": "Health",
- "version": "0.21",
+ "version": "0.22",
"description": "Logs health data and provides an app to view it",
"icon": "app.png",
"tags": "tool,system,health",
diff --git a/apps/inspire/ChangeLog b/apps/inspire/ChangeLog
new file mode 100644
index 000000000..267ee22c2
--- /dev/null
+++ b/apps/inspire/ChangeLog
@@ -0,0 +1 @@
+0.01: First public version
diff --git a/apps/inspire/README.md b/apps/inspire/README.md
new file mode 100644
index 000000000..f5f8e3aa9
--- /dev/null
+++ b/apps/inspire/README.md
@@ -0,0 +1,17 @@
+# Inspire
+
+A minimalistic app that will help you practive breathing.
+
+Author: Written by pancake in 2022, powered by insomnia
+
+## Features
+
+* [x] Practice breathing 3 times
+* [x] Tap to start
+* [x] Subtle vibrations
+* [x] Drag to pause breathing
+* [ ] Automatic buzz every hour during day
+
+## Screenshots
+
+
diff --git a/apps/inspire/app-icon.js b/apps/inspire/app-icon.js
new file mode 100644
index 000000000..e40d74718
--- /dev/null
+++ b/apps/inspire/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AH4ACxIAIFlgyjFp4xdEI9lsteAAQFBGLosHFYYAHGQ4uYFpgxKFyotQGJIuTr4uTAANfGCIREFqoADGB4ueGCAufGAouMXazDMF5VlDptlCIRBNCIQvHRp4aC2fX6+zIhxgJLxwuBFoQADGIIWNF4xeNVAOtFooAD1rWLMA5eNLg5iHMCJeMspdKMIhKLF4iOMIYIuNAAJ7KSAqOMRpqROSAovLdgIuPMATyIF5BBJLyBgCSBgvNLyRgCF/6Pwd95BKMCGzPpQvHCRZeQRxgvCYBgwB1ouN1ouJXwqQOSJyNKRwyQOeQRhK1rsJRxBgPI4RiGLgIWNFwxgODIgxCFoIuMLxJgQSgQyCsqKKLxhgFDpoAQawIvKSKAARFxgvEGDggEF5IwfFx4wGYay7EFxowGsouTsouTGAwxRFoouRGA4xNFowuTGJIyBGYgFBB44tVGJYALFrIxTFroyOFkQAfA"))
diff --git a/apps/inspire/app-icon.png b/apps/inspire/app-icon.png
new file mode 100644
index 000000000..9b851c860
Binary files /dev/null and b/apps/inspire/app-icon.png differ
diff --git a/apps/inspire/app.js b/apps/inspire/app.js
new file mode 100644
index 000000000..92b2c4ef2
--- /dev/null
+++ b/apps/inspire/app.js
@@ -0,0 +1,125 @@
+// inspire breathing app -- by pancake
+
+var w = g.getWidth();
+var h = g.getHeight();
+var w2 = w/2;
+var h2 = h/ 2;
+var fs = 24;
+var tx = (w/3)-10;
+var ty = (h)-fs;
+var radius = (w/2)-6;
+var breathing = false;
+var count = 0;
+var mode = 0;
+var sin = 0;
+var dragged = 0;
+var lastTime = Date.now();
+function breath(t) {
+ var r = Math.abs(Math.sin(t / 100)) * w2;
+ g.fillCircle(w/2,h/2, r);
+ return r;
+}
+
+// subtle vibration
+Bangle.buzz(100);
+setTimeout(()=>{Bangle.buzz(60);}, 500);
+
+function showTouchScreen() {
+ g.setColor(1,1,1);
+ g.fillCircle (w2, h2, h2-5);
+ g.setColor(0,0,0);
+ g.setFont("Vector", 32);
+ g.drawString("Tap to", w/6, h2-fs);
+ g.drawString("breath", w/4, h2);
+}
+
+g.setBgColor(0,0,0);
+g.setColor(0);
+g.clear();
+
+function animateCircle() {
+ g.clear();
+ g.setColor(1,1,1);
+ g.fillCircle (w2, h2, radius);
+ radius-=2;
+ if (radius < 40) {
+ breathing = true;
+ startBreathing();
+ return;
+ }
+ setTimeout(animateCircle, 50);
+}
+
+Bangle.on("drag", function(pos) {
+ if (breathing) {
+ dragged = 1;
+ if (pos.dx == -pos.dy) {
+ count += pos.dx;
+ } else {
+ count+=(pos.dx + pos.dy);
+ }
+ }
+});
+
+function main() {
+ var started = false;
+ function onTouch() {
+ if (started) {
+ return;
+ }
+ started = true;
+ animateCircle();
+ Bangle.buzz(40);
+ }
+ Bangle.on("touch", onTouch);
+ showTouchScreen();
+}
+
+main();
+
+function startBreathing() {
+var cicles = 3;
+g.setFont("Vector", fs);
+
+var interval = setInterval(function() {
+if (lastTime + 10 > Date.now()) {
+ return;
+}
+ lastTime = Date.now();
+ g.setColor(0, 0, 0);
+ g.clear();
+
+ g.setColor(0, 0.5, 1);
+ var b = breath(count);
+ g.setColor(0.5, 0.5, 1);
+ var c = breath(count + 50);
+ count++;
+ g.setColor(1, 1, 1);
+ if (b < c) {
+ g.drawString("inspire",8,ty);
+ if (mode) {
+ mode = 0;
+ Bangle.buzz(20);
+ if (!dragged ) {
+ cicles--;
+ }
+ }
+ } else {
+ g.drawString("expire",8,ty);
+ if (!mode) {
+ mode = 1;
+ Bangle.buzz(20);
+ }
+ }
+ g.drawString(cicles, w-fs, ty);
+ if (cicles < 1) {
+ clearInterval(interval);
+ g.clear();
+ g.drawString("Thanks for",20,h/3);
+ g.drawString(" breathing!",20,(h/3) + 16);
+ Bangle.showClock();
+ }
+ dragged = 0;
+
+}, 4);
+}
diff --git a/apps/inspire/metadata.json b/apps/inspire/metadata.json
new file mode 100644
index 000000000..7944bda42
--- /dev/null
+++ b/apps/inspire/metadata.json
@@ -0,0 +1,16 @@
+{
+ "id": "inspire",
+ "name": "Inspire Breathing",
+ "shortName": "Inspire",
+ "version": "0.01",
+ "description": "exercise breathing every now and then",
+ "icon": "app-icon.png",
+ "tags": "tools,health",
+ "screenshots": [{"url":"screenshot.png"}],
+ "supports": ["BANGLEJS"],
+ "readme": "README.md",
+ "storage": [
+ {"name":"inspire.app.js","url":"app.js"},
+ {"name":"inspire.img","url":"app-icon.js","evaluate":true}
+ ]
+}
diff --git a/apps/inspire/screenshot.png b/apps/inspire/screenshot.png
new file mode 100644
index 000000000..69fbe7d26
Binary files /dev/null and b/apps/inspire/screenshot.png differ
diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog
index 31ce16903..7deef5a4b 100644
--- a/apps/lcars/ChangeLog
+++ b/apps/lcars/ChangeLog
@@ -23,3 +23,4 @@
0.23: Add warning for low flash memory.
0.24: Add ability to disable alarm functionality.
0.25: Add more colors to the settings and add the ability to disable the data charts+Markup.
+0.26: Use widget_utils.
diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js
index e796e84a7..4a5539c7a 100644
--- a/apps/lcars/lcars.app.js
+++ b/apps/lcars/lcars.app.js
@@ -2,6 +2,7 @@ const TIMER_IDX = "lcars";
const SETTINGS_FILE = "lcars.setting.json";
const locale = require('locale');
const storage = require('Storage')
+const widget_utils = require('widget_utils');
let settings = {
alarm: -1,
dataRow1: "Steps",
@@ -552,7 +553,7 @@ function draw(){
// After drawing the watch face, we can draw the widgets
if(settings.fullscreen){
- for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
+ widget_utils.hide();
} else {
Bangle.drawWidgets();
}
diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json
index 577621df0..787ca9046 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.25",
+ "version":"0.26",
"readme": "README.md",
"supports": ["BANGLEJS2"],
"description": "Library Computer Access Retrieval System (LCARS) clock.",
diff --git a/apps/limelight/ChangeLog b/apps/limelight/ChangeLog
index 8fe3a0b2c..de8caf9c4 100644
--- a/apps/limelight/ChangeLog
+++ b/apps/limelight/ChangeLog
@@ -1,2 +1,4 @@
0.01: first release
0.02: Tell clock widgets to hide.
+0.03: Use widget_utils.
+
diff --git a/apps/limelight/limelight.app.js b/apps/limelight/limelight.app.js
index 84ded1039..dbc784e23 100644
--- a/apps/limelight/limelight.app.js
+++ b/apps/limelight/limelight.app.js
@@ -14,6 +14,7 @@ Bangle.setUI('clock');
g.clear();
+const widget_utils = require('widget_utils');
const SETTINGS_FILE = "limelight.json";
var UPDATE_PERIOD;
var drawTimeout;
@@ -84,10 +85,8 @@ if (settings.fullscreen) {
/*
* We load the widgets as some like widpedom accumualte the step count.
* we are not drawing the widgets as we are taking over the whole screen
- * so we will blank out the draw() functions of each widget and change the
- * widgets area to the top bar doesn't get cleared.
*/
- for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
+ widget_utils.hide();
}
function debug(o) {
diff --git a/apps/limelight/metadata.json b/apps/limelight/metadata.json
index e484a2825..0e5dfd565 100644
--- a/apps/limelight/metadata.json
+++ b/apps/limelight/metadata.json
@@ -1,7 +1,7 @@
{
"id": "limelight",
"name": "Limelight",
- "version": "0.02",
+ "version": "0.03",
"description": "Simple analogue clock (with configurable fonts) based on the work of @Andreas_Rozek (Simple_Clock)",
"icon": "limelight.png",
"readme":"README.md",
diff --git a/apps/messagegui/ChangeLog b/apps/messagegui/ChangeLog
index 228a952de..d061e6642 100644
--- a/apps/messagegui/ChangeLog
+++ b/apps/messagegui/ChangeLog
@@ -86,3 +86,4 @@
0.61: Fix regression where loading into messages app stops back from working (#2398)
0.62: Remove '.show' field, tidyup and fix .open if fast load not enabled
0.63: Fix messages app loading on clock without fast load
+0.64: Ensure we don't get 'undefined' as the message body
diff --git a/apps/messagegui/app.js b/apps/messagegui/app.js
index b158310a1..e944aff3c 100644
--- a/apps/messagegui/app.js
+++ b/apps/messagegui/app.js
@@ -263,6 +263,12 @@ function showMessage(msgid) {
active = "message";
// Normal text message display
var title=msg.title, titleFont = fontLarge, lines;
+ var body=msg.body, bodyFont = fontLarge;
+ // If no body, use the title text instead...
+ if (body===undefined) {
+ body = title;
+ title = undefined;
+ }
if (title) {
var w = g.getWidth()-48;
if (g.setFont(titleFont).stringWidth(title) > w) {
@@ -276,7 +282,7 @@ function showMessage(msgid) {
}
}
// If body of message is only two lines long w/ large font, use large font.
- var body=msg.body, bodyFont = fontLarge;
+
if (body) {
var w = g.getWidth()-10;
if (g.setFont(bodyFont).stringWidth(body) > w * 2) {
diff --git a/apps/messagegui/metadata.json b/apps/messagegui/metadata.json
index 1a7a6c750..3504122f9 100644
--- a/apps/messagegui/metadata.json
+++ b/apps/messagegui/metadata.json
@@ -2,7 +2,7 @@
"id": "messagegui",
"name": "Message UI",
"shortName": "Messages",
- "version": "0.63",
+ "version": "0.64",
"description": "Default app to display notifications from iOS and Gadgetbridge/Android",
"icon": "app.png",
"type": "app",
diff --git a/apps/messageicons/ChangeLog b/apps/messageicons/ChangeLog
index c923b169f..1dd1f3d9e 100644
--- a/apps/messageicons/ChangeLog
+++ b/apps/messageicons/ChangeLog
@@ -2,4 +2,4 @@
0.02: Added several new icons and colors
0.03: Fix icons broken in 0v02 (#2386)
Store all icons in a separate binary file (much faster lookup)
-
+0.04: Add message icon for 'clock'
diff --git a/apps/messageicons/icons/icon_names.json b/apps/messageicons/icons/icon_names.json
index 0085731cc..f7a743e85 100644
--- a/apps/messageicons/icons/icon_names.json
+++ b/apps/messageicons/icons/icon_names.json
@@ -12,8 +12,9 @@
{ "app":"bring", "icon":"bring.png" },
{ "app":"calendar", "icon":"etar.png" },
{ "app":"etar", "icon":"etar.png" },
- { "app":"chat", "icon":"google chat.png" },
+ { "app":"chat", "icon":"google chat.png" },
{ "app":"chrome", "icon":"chrome.png" },
+ { "app":"clock", "icon":"alarm.png" },
{ "app":"corona-warn", "icon":"coronavirus.png" },
{ "app":"bmo", "icon":"bank.png" },
{ "app":"desjardins", "icon":"bank.png" },
diff --git a/apps/messageicons/lib.js b/apps/messageicons/lib.js
index c5be21bb0..314840c13 100644
--- a/apps/messageicons/lib.js
+++ b/apps/messageicons/lib.js
@@ -2,7 +2,7 @@ exports.getImage = function(msg) {
if (msg.img) return atob(msg.img);
let s = (("string"=== typeof msg) ? msg : (msg.src || "")).toLowerCase();
if (msg.id=="music") s="music";
- let match = ",default|0,airbnb|1,alarm|2,alarmclockreceiver|2,amazon shopping|3,bibel|4,bitwarden|5,1password|5,lastpass|5,dashlane|5,bring|6,calendar|7,etar|7,chat|8,chrome|9,corona-warn|10,bmo|11,desjardins|11,rbc mobile|11,nbc|11,rabobank|11,scotiabank|11,td (canada)|11,discord|12,drive|13,element|14,facebook|15,messenger|16,firefox|17,firefox beta|17,firefox nightly|17,f-droid|5,neo store|5,aurora droid|5,github|18,gitlab|19,gmx|20,google|21,google home|22,google play store|23,home assistant|24,instagram|25,kalender|26,keep notes|27,lieferando|28,linkedin|29,maps|30,organic maps|30,osmand|30,mastodon|31,fedilab|31,tooot|31,tusky|31,mattermost|32,n26|33,netflix|34,news|35,cbc news|35,rc info|35,reuters|35,ap news|35,la presse|35,nbc news|35,nextbike|36,nina|37,outlook mail|38,paypal|39,phone|40,plex|41,pocket|42,post & dhl|43,proton mail|44,reddit|45,sync pro|45,sync dev|45,boost|45,infinity|45,slide|45,signal|46,skype|47,slack|48,snapchat|49,starbucks|50,steam|51,teams|52,telegram|53,telegram foss|53,threema|54,tiktok|55,to do|56,opentasks|56,tasks|56,transit|57,twitch|58,twitter|59,uber|60,lyft|60,vlc|61,warnapp|62,whatsapp|63,wordfeud|64,youtube|65,newpipe|65,zoom|66,meet|66,music|67,sms message|0,mail|0,gmail|0,".match(new RegExp(`,${s}\\|(\\d+)`))
+ let match = ",default|0,airbnb|1,alarm|2,alarmclockreceiver|2,amazon shopping|3,bibel|4,bitwarden|5,1password|5,lastpass|5,dashlane|5,bring|6,calendar|7,etar|7,chat|8,chrome|9,clock|2,corona-warn|10,bmo|11,desjardins|11,rbc mobile|11,nbc|11,rabobank|11,scotiabank|11,td (canada)|11,discord|12,drive|13,element|14,facebook|15,messenger|16,firefox|17,firefox beta|17,firefox nightly|17,f-droid|5,neo store|5,aurora droid|5,github|18,gitlab|19,gmx|20,google|21,google home|22,google play store|23,home assistant|24,instagram|25,kalender|26,keep notes|27,lieferando|28,linkedin|29,maps|30,organic maps|30,osmand|30,mastodon|31,fedilab|31,tooot|31,tusky|31,mattermost|32,n26|33,netflix|34,news|35,cbc news|35,rc info|35,reuters|35,ap news|35,la presse|35,nbc news|35,nextbike|36,nina|37,outlook mail|38,paypal|39,phone|40,plex|41,pocket|42,post & dhl|43,proton mail|44,reddit|45,sync pro|45,sync dev|45,boost|45,infinity|45,slide|45,signal|46,skype|47,slack|48,snapchat|49,starbucks|50,steam|51,teams|52,telegram|53,telegram foss|53,threema|54,tiktok|55,to do|56,opentasks|56,tasks|56,transit|57,twitch|58,twitter|59,uber|60,lyft|60,vlc|61,warnapp|62,whatsapp|63,wordfeud|64,youtube|65,newpipe|65,zoom|66,meet|66,music|67,sms message|0,mail|0,gmail|0,".match(new RegExp(`,${s}\\|(\\d+)`))
return require("Storage").read("messageicons.img", (match===null)?0:match[1]*76, 76);
};
diff --git a/apps/messageicons/metadata.json b/apps/messageicons/metadata.json
index 079835a0b..0d1db227b 100644
--- a/apps/messageicons/metadata.json
+++ b/apps/messageicons/metadata.json
@@ -1,7 +1,7 @@
{
"id": "messageicons",
"name": "Message Icons",
- "version": "0.03",
+ "version": "0.04",
"description": "Library containing a list of icons and colors for apps",
"icon": "app.png",
"type": "module",
diff --git a/apps/mosaic/ChangeLog b/apps/mosaic/ChangeLog
index f26a9df0a..acebd4321 100644
--- a/apps/mosaic/ChangeLog
+++ b/apps/mosaic/ChangeLog
@@ -1,2 +1,3 @@
0.01: First release
0.02: Use locale time
+0.03: Change for fast loading, use widget_utils to hide widgets
\ No newline at end of file
diff --git a/apps/mosaic/README.md b/apps/mosaic/README.md
index b2f31aef2..05a39c556 100644
--- a/apps/mosaic/README.md
+++ b/apps/mosaic/README.md
@@ -4,7 +4,7 @@ A fabulously colourful clock!
* Clearly shows the time on a colourful background that changes every minute.
* Dark and Light theme compatible, with a setting to override the digit colour scheme.
-* Show or hide widgets with a setting (default shows widgets).
+* Show or hide widgets with a setting (default hides widgets, swipe down to show them thanks to `widget_utils`).


diff --git a/apps/mosaic/metadata.json b/apps/mosaic/metadata.json
index 92548ce9c..d6eff12a7 100644
--- a/apps/mosaic/metadata.json
+++ b/apps/mosaic/metadata.json
@@ -2,7 +2,7 @@
"id":"mosaic",
"name":"Mosaic Clock",
"shortName": "Mosaic Clock",
- "version": "0.02",
+ "version": "0.03",
"description": "A fabulously colourful clock",
"readme": "README.md",
"icon":"mosaic.png",
@@ -15,5 +15,8 @@
{"name":"mosaic.app.js","url":"mosaic.app.js"},
{"name":"mosaic.settings.js","url":"mosaic.settings.js"},
{"name":"mosaic.img","url":"mosaic.icon.js","evaluate":true}
+ ],
+ "data": [
+ {"name":"mosaic.settings.json"}
]
}
diff --git a/apps/mosaic/mosaic.app.js b/apps/mosaic/mosaic.app.js
index 03eb417fd..7fcb631f1 100644
--- a/apps/mosaic/mosaic.app.js
+++ b/apps/mosaic/mosaic.app.js
@@ -2,6 +2,7 @@ Array.prototype.sample = function(){
return this[Math.floor(Math.random()*this.length)];
};
+{
const SETTINGS_FILE = "mosaic.settings.json";
let settings;
let theme;
@@ -24,11 +25,11 @@ let digits = [
E.toArrayBuffer(atob("BQcB/Gsex+A="))
];
-function loadSettings() {
+let loadSettings = function() {
settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'showWidgets': false, 'theme':'System'};
}
-function loadThemeColors() {
+let loadThemeColors = function() {
theme = {fg: g.theme.fg, bg: g.theme.bg};
if (settings.theme === "Dark") {
theme.fg = g.toColor(1,1,1);
@@ -40,7 +41,7 @@ function loadThemeColors() {
}
}
-function queueDraw(seconds) {
+let queueDraw = function(seconds) {
let millisecs = seconds * 1000;
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
@@ -49,7 +50,7 @@ function queueDraw(seconds) {
}, millisecs - (Date.now() % millisecs));
}
-function draw() {
+let draw = function() {
// draw colourful grid
for (let i_x = 0; i_x < num_squares_w; i_x++) {
for (let i_y = 0; i_y < num_squares_h; i_y++) {
@@ -87,8 +88,6 @@ let o_h = Math.floor((g.getHeight() - num_squares_h * s+offset_widgets)/2);
let mid_x = Math.floor(num_squares_w/2);
let mid_y = Math.floor((num_squares_h-1)/2);
-draw();
-
Bangle.on('lcdPower',on=>{
if (on) {
draw(); // draw immediately, queue redraw
@@ -98,8 +97,23 @@ Bangle.on('lcdPower',on=>{
}
});
-Bangle.setUI('clock');
+Bangle.setUI({
+ mode : 'clock',
+ remove : function() {
+ // Called to unload all of the clock app
+ if (drawTimeout) clearTimeout(drawTimeout);
+ drawTimeout = undefined;
+ delete Array.prototype.sample;
+ require('widget_utils').show(); // re-show widgets
+ }
+});
+
+Bangle.loadWidgets();
if (settings.showWidgets) {
- Bangle.loadWidgets();
Bangle.drawWidgets();
+} else {
+ require("widget_utils").swipeOn(); // hide widgets, make them visible with a swipe
}
+
+draw();
+}
\ No newline at end of file
diff --git a/apps/neonx/ChangeLog b/apps/neonx/ChangeLog
index c1a50ecd7..e78686a00 100644
--- a/apps/neonx/ChangeLog
+++ b/apps/neonx/ChangeLog
@@ -2,4 +2,5 @@
0.02: Optional fullscreen mode
0.03: Optional show lock status via color
0.04: Ensure that widgets are always hidden in fullscreen mode
-0.05: Better lock/unlock animation
\ No newline at end of file
+0.05: Better lock/unlock animation
+0.06: Use widget_utils.
diff --git a/apps/neonx/metadata.json b/apps/neonx/metadata.json
index ee99f98b8..c273cb05a 100644
--- a/apps/neonx/metadata.json
+++ b/apps/neonx/metadata.json
@@ -2,7 +2,7 @@
"id": "neonx",
"name": "Neon X & IO X Clock",
"shortName": "Neon X Clock",
- "version": "0.05",
+ "version": "0.06",
"description": "Pebble Neon X & Neon IO X for Bangle.js",
"icon": "neonx.png",
"type": "clock",
diff --git a/apps/neonx/neonx.app.js b/apps/neonx/neonx.app.js
index fd30fa30f..7fcf01bde 100644
--- a/apps/neonx/neonx.app.js
+++ b/apps/neonx/neonx.app.js
@@ -19,6 +19,7 @@ let saved_settings = require('Storage').readJSON('neonx.json', 1) || settings;
for (const key in saved_settings) {
settings[key] = saved_settings[key]
}
+let widget_utils = require('widget_utils');
const digits = {
@@ -133,7 +134,7 @@ function drawAnimated(){
function _draw(date, xc){
// Depending on the settings, we clear all widgets or draw those.
if(settings.fullscreen){
- for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
+ widget_utils.hide();
} else {
Bangle.drawWidgets();
}
@@ -210,4 +211,4 @@ g.clear(1);
Bangle.setUI("clock");
Bangle.loadWidgets();
-draw();
\ No newline at end of file
+draw();
diff --git a/apps/notanalog/ChangeLog b/apps/notanalog/ChangeLog
index 07430406a..094125f52 100644
--- a/apps/notanalog/ChangeLog
+++ b/apps/notanalog/ChangeLog
@@ -2,4 +2,5 @@
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 alarm for timer instead of own alarm implementation.
-0.05: Use internal step counter if no widget is available.
\ No newline at end of file
+0.05: Use internal step counter if no widget is available.
+0.06: Use widget_utils.
diff --git a/apps/notanalog/metadata.json b/apps/notanalog/metadata.json
index 81d79f4f2..319d396a9 100644
--- a/apps/notanalog/metadata.json
+++ b/apps/notanalog/metadata.json
@@ -3,7 +3,7 @@
"name": "Not Analog",
"shortName":"Not Analog",
"icon": "notanalog.png",
- "version":"0.05",
+ "version":"0.06",
"readme": "README.md",
"supports": ["BANGLEJS2"],
"description": "An analog watch face for people that can not read analog watch faces.",
diff --git a/apps/notanalog/notanalog.app.js b/apps/notanalog/notanalog.app.js
index 3c01a921e..29fb1730f 100644
--- a/apps/notanalog/notanalog.app.js
+++ b/apps/notanalog/notanalog.app.js
@@ -4,6 +4,7 @@
const TIMER_IDX = "notanalog";
const locale = require('locale');
const storage = require('Storage')
+const widget_utils = require('widget_utils');
const SETTINGS_FILE = "notanalog.setting.json";
let settings = {
alarm: -1,
@@ -460,10 +461,8 @@ Bangle.setUI("clock");
Bangle.loadWidgets();
/*
* we are not drawing the widgets as we are taking over the whole screen
- * so we will blank out the draw() functions of each widget and change the
- * area to the top bar doesn't get cleared.
*/
-for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
+widget_utils.hide();
// Clear the screen once, at startup and draw clock
// g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear();
diff --git a/apps/pinsafe/ChangeLog b/apps/pinsafe/ChangeLog
new file mode 100644
index 000000000..ec66c5568
--- /dev/null
+++ b/apps/pinsafe/ChangeLog
@@ -0,0 +1 @@
+0.01: Initial version
diff --git a/apps/pinsafe/README.md b/apps/pinsafe/README.md
new file mode 100644
index 000000000..bebeaeeb3
--- /dev/null
+++ b/apps/pinsafe/README.md
@@ -0,0 +1,8 @@
+# PIN safe
+Stores several encrypted PINs on your watch. You can use one key to decode them all.
+This is safe, as long as:
+- None of the PINs can be guessed by a brute force attack.
+- All of the PINs are random.
+- Your key is long enough (preferably as long as your PINs).
+
+This app requires a keyboard!
diff --git a/apps/pinsafe/app-icon.js b/apps/pinsafe/app-icon.js
new file mode 100644
index 000000000..03a88f805
--- /dev/null
+++ b/apps/pinsafe/app-icon.js
@@ -0,0 +1 @@
+atob("MDCBAAAAB+AAAAAAH/gAAAAAfD4AAAAB8A+AAAAHwAPgAAAfAAD4AAD4AAAfAA/gAAAH8B8AAAAA+BgAAAAAGBgAAAAAGBgAAAAAGBgAAAAAGBgAAAAAGBgAAAAAGBgAAAOAGAwAAAMAMAwAAAYAMAwAAAYAMAwAAAwAMAwAABwAMAwAABgAYAYAQDAAYAYAYHAAYAYAcGAAYAMAGMAAwAMAD8AAwAMAB4ABgAGAAwABgAGAAAABgADAAAADAADAAAAHAABgAAAGAABgAAAMAAAwAAAMAAAYAAAYAAAcAAAwAAAMAABwAAAGAABgAAADAADAAAADgAGAAAABwAMAAAAA4A4AAAAAOBwAAAAAHDgAAAAAD/AAAAAAA8AAAAAAAYAAAA==")
diff --git a/apps/pinsafe/app.js b/apps/pinsafe/app.js
new file mode 100644
index 000000000..873eb5c57
--- /dev/null
+++ b/apps/pinsafe/app.js
@@ -0,0 +1,163 @@
+var Layout = require("Layout");
+var myTimeout;
+var pins = Object.assign(require('Storage').readJSON("pinsafe.json", true) || {});
+function mainMenu() {
+ if (myTimeout) clearTimeout(myTimeout);
+ var menu = {
+ "" : {title : "Decode:"},
+ "< Back" : Bangle.load
+ };
+ if (Object.keys(pins).length==0) Object.assign(menu, {"NO CARDS":""});
+ else for (let id in pins) {
+ let p=pins[id];
+ menu[id]=()=>{decode(p);};
+ }
+ menu["Add Card"]=addCard;
+ menu["Remove Card"]=removeCard;
+ g.clear();
+ E.showMenu(menu);
+}
+function decode(pin) {
+ showNumpad("Key:", function() {
+ if (key.length==0) mainMenu();
+ else {
+ var pinDecrypted="";
+ for (let n=0;n{mainMenu();}}
+ ], lazy:true});
+ g.clear();
+ showPin.render();
+ myTimeout = setTimeout(Bangle.load, 10000);
+ }
+ });
+}
+function showNumpad(text, callback) {
+ E.showMenu();
+ key="";
+ function addDigit(digit) {
+ key+=digit;
+ Bangle.buzz(20);
+ update();
+ }
+ function update() {
+ g.reset();
+ g.clearRect(0,0,g.getWidth(),23);
+ g.setFont("Vector:24").setFontAlign(1,0).drawString(text+key,g.getWidth(),12);
+ }
+ ds="12%";
+ var numPad = new Layout ({
+ type:"v", c: [{
+ type:"v", c: [
+ {type:"", height:24},
+ {type:"h",filly:1, c: [
+ {type:"btn", font:ds, width:58, label:"7", cb:l=>{addDigit("7");}},
+ {type:"btn", font:ds, width:58, label:"8", cb:l=>{addDigit("8");}},
+ {type:"btn", font:ds, width:58, label:"9", cb:l=>{addDigit("9");}}
+ ]},
+ {type:"h",filly:1, c: [
+ {type:"btn", font:ds, width:58, label:"4", cb:l=>{addDigit("4");}},
+ {type:"btn", font:ds, width:58, label:"5", cb:l=>{addDigit("5");}},
+ {type:"btn", font:ds, width:58, label:"6", cb:l=>{addDigit("6");}}
+ ]},
+ {type:"h",filly:1, c: [
+ {type:"btn", font:ds, width:58, label:"1", cb:l=>{addDigit("1");}},
+ {type:"btn", font:ds, width:58, label:"2", cb:l=>{addDigit("2");}},
+ {type:"btn", font:ds, width:58, label:"3", cb:l=>{addDigit("3");}}
+ ]},
+ {type:"h",filly:1, c: [
+ {type:"btn", font:ds, width:58, label:"0", cb:l=>{addDigit("0");}},
+ {type:"btn", font:ds, width:58, label:"C", cb:l=>{key=key.slice(0,-1); update();}},
+ {type:"btn", font:ds, width:58, id:"OK", label:"OK", cb:callback}
+ ]}
+ ]}
+ ], lazy:true});
+ g.clear();
+ numPad.render();
+ update();
+}
+function removeCard() {
+ var menu = {
+ "" : {title : "select card"},
+ "< Back" : mainMenu
+ };
+ if (Object.keys(pins).length==0) Object.assign(menu, {"NO CARDS":""});
+ else for (let c in pins) {
+ let card=c;
+ menu[c]=()=>{
+ E.showMenu();
+ var confirmRemove = new Layout (
+ {type:"v", c: [
+ {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Delete"},
+ {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:card+"?"},
+ {type:"h", c: [
+ {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "YES", cb:l=>{
+ delete pins[card];
+ require('Storage').writeJSON("pinsafe.json", pins);
+ mainMenu();
+ }},
+ {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: " NO", cb:l=>{mainMenu();}}
+ ]}
+ ], lazy:true});
+ g.clear();
+ confirmRemove.render();
+ };
+ }
+ E.showMenu(menu);
+}
+function addCard() {
+ var infoScreen = new Layout({
+ type:"v", c: [
+ {type:"txt", font:"10%", label:"Enter a name, PIN\nand key for your\ncard. The PIN will\nbe stored on your\ndevice in encrypted\nform.\nTap to continue!", cb:l=>{
+ require("textinput").input({text:""}).then(result => {
+ if (pins[result]!=undefined) {
+ E.showMenu();
+ var alreadyExists = new Layout (
+ {type:"v", c: [
+ {type:"txt", font:Math.min(15,100/result.length)+"%", pad:1, fillx:1, filly:1, label:result},
+ {type:"txt", font:"12%", pad:1, fillx:1, filly:1, label:"already exists."},
+ {type:"h", c: [
+ {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label: "REPLACE", cb:l=>{encodeCard(result);}},
+ {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label: "CANCEL", cb:l=>{mainMenu();}}
+ ]}
+ ], lazy:true});
+ g.clear();
+ alreadyExists.render();
+ } else
+ encodeCard(result);
+ });
+ }}
+ ]
+ });
+ g.clear();
+ infoScreen.render();
+}
+function encodeCard(name) {
+ showNumpad("PIN:", function() {
+ if (key.length==0) mainMenu();
+ else {
+ var pin=key;
+ showNumpad("Key:", function() {
+ if (key.length==0) mainMenu();
+ else {
+ var pinEncrypted="";
+ for (let n=0;ne);
log_debug("Loading "+lines.length+" slides");
slides = lines.map(line=>{let s=line.split(";");return [+s[0],s[1]];});
+ //all numbers and always strictly increasing
+ if(slides.filter(s=>isNaN(+s[1])).length == 0 &&
+ slides.map((p,i,a)=>p[1]-(a[i-1]?a[i-1][1]:undefined)).filter(p=>p<=0).length == 0) {
+ slides = fillBlanks(slides);
+ }
}
@@ -147,6 +191,7 @@ function stopStart() {
} else {
draw();
}
+ saveState();
}
function setButtonImages() {
@@ -171,6 +216,7 @@ function lapReset() {
g.clearRect(0,24,w,h);
draw();
}
+ saveState();
}
// simple on screen button class
@@ -268,5 +314,10 @@ g.fillRect(0,0,w,h);
Bangle.loadWidgets();
Bangle.drawWidgets();
readSlides();
-draw();
+setButtonImages();
+if (running) {
+ startTimer();
+} else {
+ draw();
+}
setWatch(() => load(), BTN, { repeat: false, edge: "falling" });
diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog
index a4d0b7e88..c4d1fa8c1 100644
--- a/apps/recorder/ChangeLog
+++ b/apps/recorder/ChangeLog
@@ -24,3 +24,4 @@
0.18: Improve widget load speed, allow currently recording track to be plotted in openstmap
0.19: Fix track plotting code
0.20: Automatic translation of some more strings.
+0.21: Speed report now uses speed units from locale
diff --git a/apps/recorder/app.js b/apps/recorder/app.js
index 8dcc4c3ed..8ac3ff627 100644
--- a/apps/recorder/app.js
+++ b/apps/recorder/app.js
@@ -348,7 +348,12 @@ function viewTrack(filename, info) {
infc[i]++;
}
} else if (style=="Speed") {
- title = /*LANG*/"Speed (m/s)";
+ // use locate to work out units
+ var localeStr = require("locale").speed(1,5); // get what 1kph equates to
+ let units = localeStr.replace(/[0-9.]*/,"");
+ var factor = parseFloat(localeStr)*3.6; // m/sec to whatever out units are
+ // title
+ title = /*LANG*/"Speed"+` (${units})`;
var latIdx = info.fields.indexOf("Latitude");
var lonIdx = info.fields.indexOf("Longitude");
// skip until we find our first data
@@ -381,7 +386,7 @@ function viewTrack(filename, info) {
} else throw new Error("Unknown type "+style);
var min=100000,max=-100000;
for (var i=0;i0) infn[i]/=infc[i];
+ if (infc[i]>0) infn[i]=factor*infn[i]/infc[i];
var n = infn[i];
if (n>max) max=n;
if (n load(), BTN, { repeat: false, edge: "falling" });
diff --git a/apps/thering/ChangeLog b/apps/thering/ChangeLog
new file mode 100644
index 000000000..25c572560
--- /dev/null
+++ b/apps/thering/ChangeLog
@@ -0,0 +1,2 @@
+0.01: Initial release.
+0.02: Use widget_utils.
diff --git a/apps/thering/app.js b/apps/thering/app.js
index f7cfaa015..8767941b2 100644
--- a/apps/thering/app.js
+++ b/apps/thering/app.js
@@ -1,5 +1,6 @@
const h = g.getHeight();
const w = g.getWidth();
+const widget_utils = require('widget_utils');
// palette for 0-40%
const pal1 = new Uint16Array([g.theme.bg, g.toColor("#020"), g.toColor("#0f0"), g.toColor("#00f")]);
// palette for 50-100%
@@ -215,10 +216,8 @@ Bangle.setUI("clock");
Bangle.loadWidgets();
/*
* we are not drawing the widgets as we are taking over the whole screen
- * so we will blank out the draw() functions of each widget and change the
- * area to the top bar doesn't get cleared.
*/
-for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
+widget_utils.hide();
draw();
setInterval(draw, 60000);
diff --git a/apps/thering/metadata.json b/apps/thering/metadata.json
index 32b1dae4b..6118a90f9 100644
--- a/apps/thering/metadata.json
+++ b/apps/thering/metadata.json
@@ -1,6 +1,6 @@
{ "id": "thering",
"name": "The Ring",
- "version":"0.01",
+ "version":"0.02",
"description": "A proof of concept clock with large ring guage for steps using pre-set images, acts as a tutorial piece for discussion",
"icon": "app.png",
"tags": "clock",
diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog
index 4b70d3531..0010a58fd 100644
--- a/apps/weather/ChangeLog
+++ b/apps/weather/ChangeLog
@@ -20,3 +20,4 @@
0.21: Updated clkinfo icon.
0.22: Automatic translation of strings, some left untranslated.
0.23: Update clock_info to avoid a redraw
+0.24: Redraw clock_info on update and provide color field for condition
diff --git a/apps/weather/clkinfo.js b/apps/weather/clkinfo.js
index f40924e06..ef3b7d139 100644
--- a/apps/weather/clkinfo.js
+++ b/apps/weather/clkinfo.js
@@ -1,28 +1,36 @@
(function() {
- var weather = {
- temp: "?",
- hum: "?",
- wind: "?",
- txt: "?",
- };
+ var weather;
+ var weatherLib = require("weather");
- var weatherJson = require("Storage").readJSON('weather.json');
- if(weatherJson !== undefined && weatherJson.weather !== undefined){
- weather = weatherJson.weather;
+ function updateWeather() {
+ weather = weatherLib.get();
+ if(weather){
weather.temp = require("locale").temp(weather.temp-273.15);
weather.hum = weather.hum + "%";
weather.wind = require("locale").speed(weather.wind).match(/^(\D*\d*)(.*)$/);
weather.wind = Math.round(weather.wind[1]) + "kph";
+ } else {
+ weather = {
+ temp: "?",
+ hum: "?",
+ wind: "?",
+ txt: "?",
+ };
+ }
}
+ updateWeather();
function weatherIcon(code) {
var ovr = Graphics.createArrayBuffer(24,24,1,{msb:true});
- require("weather").drawIcon({code:code},12,12,12,ovr);
+ weatherLib.drawIcon({code:code},12,12,12,ovr);
var img = ovr.asImage();
img.transparent = 0;
- //for (var i=0;i ({ text: weather.temp, img: weatherIcon(weather.code),
+ color: weatherLib.getColor(weather.code),
v: parseInt(weather.temp), min: -30, max: 55}),
- show: function() {},
- hide: function () {}
+ show: function() {
+ this.updater = _updater.bind(this);
+ weatherLib.on("update", this.updater);
+ },
+ hide: function () { weatherLib.removeListener("update", this.updater); }
},
{
name: "condition",
get: () => ({ text: weather.txt, img: weatherIcon(weather.code),
+ color: weatherLib.getColor(weather.code),
v: weather.code}),
- show: function() {},
- hide: function () {}
+ show: function() {
+ this.updater = _updater.bind(this);
+ weatherLib.on("update", this.updater);
+ },
+ hide: function () { weatherLib.removeListener("update", this.updater); }
},
{
name: "temperature",
hasRange : true,
get: () => ({ text: weather.temp, img: atob("GBiBAAA8AAB+AADnAADDAADDAADDAADDAADDAADbAADbAADbAADbAADbAADbAAHbgAGZgAM8wAN+wAN+wAM8wAGZgAHDgAD/AAA8AA=="),
v: parseInt(weather.temp), min: -30, max: 55}),
- show: function() {},
- hide: function () {}
+ show: function() {
+ this.updater = _updater.bind(this);
+ weatherLib.on("update", this.updater);
+ },
+ hide: function () { weatherLib.removeListener("update", this.updater); }
},
{
name: "humidity",
hasRange : true,
get: () => ({ text: weather.hum, img: atob("GBiBAAAEAAAMAAAOAAAfAAAfAAA/gAA/gAI/gAY/AAcfAA+AQA+A4B/A4D/B8D/h+D/j+H/n/D/n/D/n/B/H/A+H/AAH/AAD+AAA8A=="),
v: parseInt(weather.hum), min: 0, max: 100}),
- show: function() {},
- hide: function () {}
+ show: function() {
+ this.updater = _updater.bind(this);
+ weatherLib.on("update", this.updater);
+ },
+ hide: function () { weatherLib.removeListener("update", this.updater); }
},
{
name: "wind",
hasRange : true,
get: () => ({ text: weather.wind, img: atob("GBiBAAHgAAPwAAYYAAwYAAwMfAAY/gAZh3/xg//hgwAAAwAABg///g//+AAAAAAAAP//wH//4AAAMAAAMAAYMAAYMAAMcAAP4AADwA=="),
v: parseInt(weather.wind), min: 0, max: 118}),
- show: function() {},
- hide: function () {}
+ show: function() {
+ this.updater = _updater.bind(this);
+ weatherLib.on("update", this.updater);
+ },
+ hide: function () { weatherLib.removeListener("update", this.updater); }
},
]
};
diff --git a/apps/weather/lib.js b/apps/weather/lib.js
index 8c59fd3e3..14ca77ec6 100644
--- a/apps/weather/lib.js
+++ b/apps/weather/lib.js
@@ -53,6 +53,98 @@ exports.get = function() {
scheduleExpiry(storage.readJSON('weather.json')||{});
+function getPalette(monochrome, ovr) {
+ var palette;
+ if(monochrome) {
+ palette = {
+ sun: '#FFF',
+ cloud: '#FFF',
+ bgCloud: '#FFF',
+ rain: '#FFF',
+ lightning: '#FFF',
+ snow: '#FFF',
+ mist: '#FFF',
+ background: '#000'
+ };
+ } else {
+ if (B2) {
+ if (ovr.theme.dark) {
+ palette = {
+ sun: '#FF0',
+ cloud: '#FFF',
+ bgCloud: '#777', // dithers on B2, but that's ok
+ rain: '#0FF',
+ lightning: '#FF0',
+ snow: '#FFF',
+ mist: '#FFF'
+ };
+ } else {
+ palette = {
+ sun: '#FF0',
+ cloud: '#777', // dithers on B2, but that's ok
+ bgCloud: '#000',
+ rain: '#00F',
+ lightning: '#FF0',
+ snow: '#0FF',
+ mist: '#0FF'
+ };
+ }
+ } else {
+ if (ovr.theme.dark) {
+ palette = {
+ sun: '#FE0',
+ cloud: '#BBB',
+ bgCloud: '#777',
+ rain: '#0CF',
+ lightning: '#FE0',
+ snow: '#FFF',
+ mist: '#FFF'
+ };
+ } else {
+ palette = {
+ sun: '#FC0',
+ cloud: '#000',
+ bgCloud: '#777',
+ rain: '#07F',
+ lightning: '#FC0',
+ snow: '#CCC',
+ mist: '#CCC'
+ };
+ }
+ }
+ }
+ return palette;
+}
+
+exports.getColor = function(code) {
+ const codeGroup = Math.round(code / 100);
+ const palette = getPalette(0, g);
+ const cloud = g.blendColor(palette.cloud, palette.bgCloud, .5); //theme independent
+ switch (codeGroup) {
+ case 2: return g.blendColor(cloud, palette.lightning, .5);
+ case 3: return palette.rain;
+ case 5:
+ switch (code) {
+ case 511: return palette.snow;
+ case 520: return g.blendColor(palette.rain, palette.sun, .5);
+ case 521: return g.blendColor(palette.rain, palette.sun, .5);
+ case 522: return g.blendColor(palette.rain, palette.sun, .5);
+ case 531: return g.blendColor(palette.rain, palette.sun, .5);
+ default: return palette.rain;
+ }
+ case 6: return palette.snow;
+ case 7: return palette.mist;
+ case 8:
+ switch (code) {
+ case 800: return palette.sun;
+ case 801: return palette.sun;
+ case 802: return cloud;
+ default: return cloud;
+ }
+ default: return cloud;
+ }
+}
+
/**
*
* @param cond Weather condition, as one of:
@@ -71,63 +163,8 @@ exports.drawIcon = function(cond, x, y, r, ovr) {
ovr = g;
monochrome=0;
}
- if(monochrome) {
- palette = {
- sun: '#FFF',
- cloud: '#FFF',
- bgCloud: '#FFF',
- rain: '#FFF',
- lightning: '#FFF',
- snow: '#FFF',
- mist: '#FFF',
- background: '#000'
- };
- } else
- if (B2) {
- if (ovr.theme.dark) {
- palette = {
- sun: '#FF0',
- cloud: '#FFF',
- bgCloud: '#777', // dithers on B2, but that's ok
- rain: '#0FF',
- lightning: '#FF0',
- snow: '#FFF',
- mist: '#FFF'
- };
- } else {
- palette = {
- sun: '#FF0',
- cloud: '#777', // dithers on B2, but that's ok
- bgCloud: '#000',
- rain: '#00F',
- lightning: '#FF0',
- snow: '#0FF',
- mist: '#0FF'
- };
- }
- } else {
- if (ovr.theme.dark) {
- palette = {
- sun: '#FE0',
- cloud: '#BBB',
- bgCloud: '#777',
- rain: '#0CF',
- lightning: '#FE0',
- snow: '#FFF',
- mist: '#FFF'
- };
- } else {
- palette = {
- sun: '#FC0',
- cloud: '#000',
- bgCloud: '#777',
- rain: '#07F',
- lightning: '#FC0',
- snow: '#CCC',
- mist: '#CCC'
- };
- }
- }
+
+ palette = getPalette(monochrome, ovr);
function drawSun(x, y, r) {
ovr.setColor(palette.sun);
diff --git a/apps/weather/metadata.json b/apps/weather/metadata.json
index 77ca37721..bcb2fe109 100644
--- a/apps/weather/metadata.json
+++ b/apps/weather/metadata.json
@@ -1,7 +1,7 @@
{
"id": "weather",
"name": "Weather",
- "version": "0.23",
+ "version": "0.24",
"description": "Show Gadgetbridge weather report",
"icon": "icon.png",
"screenshots": [{"url":"screenshot.png"}],
diff --git a/apps/widbgjs/ChangeLog b/apps/widbgjs/ChangeLog
new file mode 100644
index 000000000..7b83706bf
--- /dev/null
+++ b/apps/widbgjs/ChangeLog
@@ -0,0 +1 @@
+0.01: First release
diff --git a/apps/widbgjs/README.md b/apps/widbgjs/README.md
new file mode 100644
index 000000000..dbb8cd9e4
--- /dev/null
+++ b/apps/widbgjs/README.md
@@ -0,0 +1,29 @@
+# Prerequisites
+For this widget to work and to get data from the phone, you need:
+- An Android phone
+ - with xDrip and the helper app installed.
+ - the Gadgetbridge app (bangle version) for the Android phone
+- A BangleJS
+ - With this widget installed
+
+# Widget
+
+## How to use it
+Make sure you have all the prerequisites from above.
+
+The watch should automatically start displaying values, if there is an arrow visible behind the value, the value is within the not-expired-yet time range changeable in the settings standard is 15 minutes. (I will probably change this in the future, to strike through the text to make expired values clearer).
+
+## Settings
+In the settings, you can:
+- Disable/hide the widget
+- Change the unit from mmol/L to mg/dL
+- Set a time at which old BG values expire
+
+
+# Developer
+Developed by Phil Roggenbuck (phrogg)
+
+
+# Disclaimer
+As well as xdrip you should not use this app to make medical decisions!
+
diff --git a/apps/widbgjs/metadata.json b/apps/widbgjs/metadata.json
new file mode 100644
index 000000000..0639b5a51
--- /dev/null
+++ b/apps/widbgjs/metadata.json
@@ -0,0 +1,22 @@
+{
+ "id": "widbgjs",
+ "name": "Blood Glucose Widget (xdrip)",
+ "shortName":"BG Widget",
+ "icon": "screenshot.png",
+ "screenshots": [{"url":"screenshot.png"}],
+ "version":"0.01",
+ "type": "widget",
+ "supports": ["BANGLEJS", "BANGLEJS2"],
+ "readme": "README.md",
+ "allow_emulator":true,
+ "description": "Displays the current blood glucose received from xdrip and send over via a helper app on the watch.",
+ "tags": "widget",
+ "storage": [
+ {"name":"widbgjs.wid.js","url":"widget.js"},
+ {"name":"widbgjs.settings.js","url":"settings.js"}
+ ],
+ "data": [
+ {"name":"widbgjs.json"},
+ {"name":"widbgjs.settings.json"}
+ ]
+ }
diff --git a/apps/widbgjs/screenshot.png b/apps/widbgjs/screenshot.png
new file mode 100644
index 000000000..b6e092af2
Binary files /dev/null and b/apps/widbgjs/screenshot.png differ
diff --git a/apps/widbgjs/settings.js b/apps/widbgjs/settings.js
new file mode 100644
index 000000000..f2eb190bc
--- /dev/null
+++ b/apps/widbgjs/settings.js
@@ -0,0 +1,54 @@
+(function (back) {
+ const SAVEFILE = "wpbgjs.settings.json";
+
+ // initialize with default settings...
+ let s = {
+ 'unitIsMmol': true,
+ 'expireThreshold': 600000,
+ 'hide': false
+ };
+ // ...and overwrite them with any saved values
+ // This way saved values are preserved if a new version adds more settings
+ const storage = require('Storage');
+ const d = storage.readJSON(SAVEFILE, 1) || {};
+ const saved = d.settings || {};
+ for (const key in saved) {
+ s[key] = saved[key];
+ }
+
+ function save() {
+ d.settings = s;
+ storage.write(SAVEFILE, d);
+ WIDGETS['widbgjs'].draw();
+ }
+
+ E.showMenu({
+ '': { 'title': 'BG widget' },
+ 'Unit': {
+ value: s.unitIsMmol,
+ format: () => (s.unitIsMmol ? 'mmol/L' : 'mg/dL'),
+ onchange: () => {
+ s.unitIsMmol = !s.unitIsMmol;
+ save();
+ },
+ },
+ 'Exp. BG': {
+ value: s.expireThreshold,
+ min: 18000, step: 60000,
+ format: s => (s ? s / 60000 + ' min' : '0'),
+ onchange: (g) => {
+ s.expireThreshold = g;
+ save();
+ },
+ },
+ 'Hide Widget': {
+ value: s.hide,
+ format: () => (s.hide ? 'Yes' : 'No'),
+ onchange: () => {
+ s.hide = !s.hide;
+ save();
+ },
+ },
+ '< Back': back,
+ });
+});
\ No newline at end of file
diff --git a/apps/widbgjs/widget.js b/apps/widbgjs/widget.js
new file mode 100644
index 000000000..1a1df002d
--- /dev/null
+++ b/apps/widbgjs/widget.js
@@ -0,0 +1,143 @@
+//WIDGETS = {}; // <-- for development only
+
+(() => {
+ // persistant vals
+ let storedData;
+ let settings;
+
+ function loadSettings() { // stolen from https://github.com/espruino/BangleApps/blob/master/apps/widpedom/widget.js
+ const d = require('Storage').readJSON("widbgjs.settings.json", 1) || {};
+ settings = Object.assign({
+ 'unitIsMmol': true,
+ 'expireThreshold': 600000,
+ 'reloadInterval': 5 * 60000,
+ 'hide': false
+ }, d || {});
+ return d;
+ }
+
+ function loadVals() {
+ try {
+ const d = require('Storage').readJSON("widbgjs.json", 1) || {};
+ storedData = Object.assign({
+ 'bg': null,
+ 'bgTimeStamp': null,
+ 'bgDirection': null
+ }, d || {});
+ return d;
+ } catch(e) {
+ Bangle.removeFile("widbgjs.json");
+ }
+ return null;
+ }
+
+ function calculateRotation(bgDirection) {
+ var a = 90;
+ // get the arrow right (https://github.com/StephenBlackWasAlreadyTaken/NightWatch/blob/6de1d3775c6e447177c12f387f647628cc8e24ce/mobile/src/main/java/com/dexdrip/stephenblack/nightwatch/Bg.java)
+ switch (bgDirection) {
+ case ("DoubleDown"):
+ g.setColor("#f00");
+ a = 180;
+ break;
+ case ("SingleDown"):
+ a = 180;
+ break;
+ case ("DoubleUp"):
+ g.setColor("#f00");
+ a = 0;
+ break;
+ case ("SingleUp"):
+ a = 0;
+ break;
+ case ("FortyFiveUp"):
+ a = 45;
+ break;
+ case ("FortyFiveDown"):
+ a = 135;
+ break;
+ case ("Flat"):
+ a = 90;
+ break;
+ }
+ // turn the arrow thanks to (https://forum.espruino.com/conversations/344607/)
+ const p180 = Math.PI / 180;
+ // a is defined above
+ var r = 21;
+ var x = r * Math.sin(a * p180);
+ var y = r * Math.cos(a * p180);
+
+ return a * p180;
+ }
+
+ function getBG(bg) {
+ var tmp = null;
+
+ try {
+ if (storedData.bg !== null) {
+ tmp = bg;
+
+ if (settings.unitIsMmol) {
+ tmp /= 18;
+ tmp = tmp.toFixed(1);
+ }
+ }
+
+ } catch (e) { }
+ return tmp;
+ }
+
+ function isBgTooOld(bgTimeStamp) {
+ var currTimeInMilli = new Date().valueOf();
+
+ try {
+ if (bgTimeStamp === null) {
+ return true;
+ }
+
+ if (currTimeInMilli - settings.expireThreshold <= bgTimeStamp) {
+ return false;
+ }
+ } catch (e) { }
+ return true;
+ }
+
+ function draw() {
+ loadSettings();
+ try {
+ if (settings.hide) return;
+ } catch (e) { }
+ loadVals();
+
+ outpt = getBG(storedData.bg);
+
+ if (outpt === null) { // this means no value has been received yet
+ outpt = "BG";
+ bgTimeStamp = "0";
+ }
+
+ // prepare to write on the screen
+ g.reset().clearRect(this.x, this.y, this.x + this.width, this.y + 23); // erase background
+ g.setFont('Vector', 22);
+ g.setColor(g.theme.fg);
+
+ // check if the value is too old
+ if (!isBgTooOld(storedData.bgTimeStamp)) {
+ g.drawImage(atob("FBQBAGAADwAB+AA/wAduAGZgAGAABgAAYAAGAABgAAYAAGAABgAAYAAGAABgAAYAAGAABgA="), this.x + 60, this.y + 9, { rotate: calculateRotation(storedData.bgDirection) });
+ }
+ g.setColor(g.theme.fg).drawString(outpt, this.x + 5, this.y);
+ }
+
+ setInterval(function () {
+ WIDGETS["widbgjs"].draw(WIDGETS["widbgjs"]);
+ }, 5 * 60000); // update every 5 minutes (%* 60000
+
+
+ // add your widget
+ WIDGETS["widbgjs"] = {
+ area: "tl",
+ width: 72,
+ draw: draw
+ };
+})();
+
+//Bangle.drawWidgets(); // <-- for development only
diff --git a/apps/widviz/ChangeLog b/apps/widviz/ChangeLog
index 9785f4d84..5df89e719 100644
--- a/apps/widviz/ChangeLog
+++ b/apps/widviz/ChangeLog
@@ -1,3 +1,4 @@
0.01: New Widget
0.02: swipe left,right update
0.03: Fix widget visibility code to the top bar isn't cleared by drawWidgets
+0.04: Use widget_utils.
diff --git a/apps/widviz/metadata.json b/apps/widviz/metadata.json
index ba9cf793b..4d88c4d5f 100644
--- a/apps/widviz/metadata.json
+++ b/apps/widviz/metadata.json
@@ -2,7 +2,7 @@
"id": "widviz",
"name": "Widget Visibility Widget",
"shortName": "Viz Widget",
- "version": "0.03",
+ "version": "0.04",
"description": "Swipe left to hide top bar widgets, swipe right to redisplay.",
"icon": "eye.png",
"type": "widget",
diff --git a/apps/widviz/widget.js b/apps/widviz/widget.js
index 1490cf11a..7b9f55053 100644
--- a/apps/widviz/widget.js
+++ b/apps/widviz/widget.js
@@ -1,28 +1,20 @@
(() => {
+ let widget_utils = require('widget_utils');
- var saved = null;
+ var saved = false;
function hide(){
if (!Bangle.isLCDOn() || saved) return;
- saved = [];
- for (var wd of WIDGETS) {
- saved.push({d:wd.draw,a:wd.area});
- wd.draw=()=>{};
- wd.area="";
- }
+ saved = true;
+ widget_utils.hide();
g.setColor(0,0,0);
g.fillRect(0,0,g.getWidth(),23);
}
function reveal(){
if (!Bangle.isLCDOn() || !saved) return;
- for (var wd of WIDGETS) {
- var o = saved.shift();
- wd.draw = o.d;
- wd.area = o.a;
- }
- Bangle.drawWidgets();
- saved=null;
+ widget_utils.show();
+ saved = false;
}
function draw(){
diff --git a/apps/widviztime/ChangeLog b/apps/widviztime/ChangeLog
index 287061d0c..be95ed81c 100644
--- a/apps/widviztime/ChangeLog
+++ b/apps/widviztime/ChangeLog
@@ -1 +1,2 @@
0.01: New Widget, forked from widviz
+0.02: Use widget_utils.
diff --git a/apps/widviztime/metadata.json b/apps/widviztime/metadata.json
index b364bbd74..669c8fc12 100644
--- a/apps/widviztime/metadata.json
+++ b/apps/widviztime/metadata.json
@@ -2,7 +2,7 @@
"id": "widviztime",
"name": "Widget Autohide Widget",
"shortName": "Viz Time Widget",
- "version": "0.01",
+ "version": "0.02",
"description": "The widgets will be shown for four seconds after the device is unlocked.",
"icon": "eye.png",
"type": "widget",
diff --git a/apps/widviztime/widget.js b/apps/widviztime/widget.js
index 5e81af611..8422a3842 100644
--- a/apps/widviztime/widget.js
+++ b/apps/widviztime/widget.js
@@ -1,32 +1,21 @@
(() => {
+ let widget_utils = require('widget_utils');
- var saved = null;
+ var saved = false;
function hide() {
if (!Bangle.isLCDOn() || saved) return;
- saved = [];
- for (var wd of WIDGETS) {
- saved.push({
- d: wd.draw,
- a: wd.area
- });
- wd.draw = () => {};
- wd.area = "";
- }
+ saved = true;
+ widget_utils.hide();
g.setColor(0, 0, 0);
g.fillRect(0, 0, g.getWidth(), 23);
}
function reveal() {
if (!Bangle.isLCDOn() || !saved) return;
- for (var wd of WIDGETS) {
- var o = saved.shift();
- wd.draw = o.d;
- wd.area = o.a;
- }
- Bangle.drawWidgets();
- saved = null;
+ widget_utils.show();
+ saved = false;
}
function draw() {
diff --git a/bin/lib/apploader.js b/bin/lib/apploader.js
index 6bf74eb7e..329ece7b7 100644
--- a/bin/lib/apploader.js
+++ b/bin/lib/apploader.js
@@ -22,6 +22,7 @@ global.Const = {
};
var apps = [];
+var device = { id : DEVICEID, appsInstalled : [] };
// call with {DEVICEID:"BANGLEJS/BANGLEJS2"}
exports.init = function(options) {
@@ -67,10 +68,28 @@ function fileGetter(url) {
}
exports.getAppFiles = function(app) {
- return AppInfo.getFiles(app, {
+ var allFiles = [];
+ var uploadOptions = {
+ apps : apps,
+ needsApp : app => {
+ if (app.provides_modules) {
+ if (!app.files) app.files="";
+ app.files = app.files.split(",").concat(app.provides_modules).join(",");
+ }
+ return AppInfo.getFiles(app, {
+ fileGetter:fileGetter,
+ settings : SETTINGS,
+ device : { id : DEVICEID }
+ }).then(files => { allFiles = allFiles.concat(files); return app; });
+ }
+ };
+ return AppInfo.checkDependencies(app, device, uploadOptions).then(() => AppInfo.getFiles(app, {
fileGetter:fileGetter,
settings : SETTINGS,
- device : { id : DEVICEID }
+ device : device
+ })).then(files => {
+ allFiles = allFiles.concat(files);
+ return allFiles;
});
};
diff --git a/bin/runapptests.js b/bin/runapptests.js
index 8a415b109..b50a7e15c 100755
--- a/bin/runapptests.js
+++ b/bin/runapptests.js
@@ -20,17 +20,31 @@ TODO:
*/
-// A si
-var TEST = {
+// A simpletest
+/*var TEST = {
app : "android",
tests : [ {
- load : "messagesgui.app.js",
steps : [
+ {t:"load", fn:"messagesgui.app.js"},
{t:"gb", "obj":{"t":"notify","id":1234,"src":"Twitter","title":"A Name","body":"message contents"}},
{t:"cmd", "js":"X='hello';"},
{t:"eval", "js":"X", eq:"hello"}
]
}]
+};*/
+var TEST = {
+ app : "antonclk",
+ tests : [ {
+ steps : [
+ {t:"cmd", "js": "Bangle.loadWidgets()"},
+ {t:"cmd", "js": "eval(require('Storage').read('antonclk.app.js'))"},
+ {t:"cmd", "js":"Bangle.setUI()"}, // load and free
+ {t:"saveMemoryUsage"},
+ {t:"cmd", "js": "eval(require('Storage').read('antonclk.app.js'))"},
+ {t:"cmd", "js":"Bangle.setUI()"}, // load and free
+ {t:"checkMemoryUsage"}, // check memory usage is the same
+ ]
+ }]
};
var EMULATOR = "banglejs2";
@@ -73,34 +87,57 @@ function runTest(test) {
console.log(`"${test.app}" Test ${subtestIdx}`);
console.log(`==============================`);
emu.factoryReset();
- console.log("Sending app "+test.app);
+ console.log("> Sending app "+test.app);
emu.tx(command);
- console.log("Sent app");
- emu.tx(test.load ? `load(${JSON.stringify(test.load)})\n` : "load()\n");
- console.log("App Loaded.");
+ console.log("> Sent app");
+ emu.tx("reset()\n");
+ console.log("> Reset.");
var ok = true;
subtest.steps.forEach(step => {
if (ok) switch(step.t) {
- case "cmd" : emu.tx(`${step.js}\n`); break;
+ case "load" :
+ console.log(`> Loading file "${step.fn}"`);
+ emu.tx(`load(${JSON.stringify(step.fn)})\n`);
+ break;
+ case "cmd" :
+ console.log(`> Sending JS "${step.js}"`);
+ emu.tx(`${step.js}\n`);
+ break;
case "gb" : emu.tx(`GB(${JSON.stringify(step.obj)})\n`); break;
case "tap" : emu.tx(`Bangle.emit(...)\n`); break;
case "eval" :
+ console.log(`> Evaluate "${step.js}"`);
emu.tx(`\x10print(JSON.stringify(${step.js}))\n`);
var result = emu.getLastLine();
var expected = JSON.stringify(step.eq);
- console.log("GOT "+result);
+ console.log("> GOT "+result);
if (result!=expected) {
- console.log("EXPECTED "+expected);
+ console.log("> FAIL: EXPECTED "+expected);
ok = false;
}
break;
// tap/touch/drag/button press
// delay X milliseconds?
case "screenshot" :
- console.log("Compare screenshots");
+ console.log(`> Compare screenshots - UNIMPLEMENTED`);
+ break;
+ case "saveMemoryUsage" :
+ emu.tx(`\x10print(process.memory().usage)\n`);
+ subtest.memUsage = parseInt( emu.getLastLine());
+ console.log("> CURRENT MEMORY USAGE", subtest.memUsage);
+ break;
+ case "checkMemoryUsage" :
+ emu.tx(`\x10print(process.memory().usage)\n`);
+ var memUsage = emu.getLastLine();
+ console.log("> CURRENT MEMORY USAGE", memUsage);
+ if (subtest.memUsage != memUsage ) {
+ console.log("> FAIL: EXPECTED MEMORY USAGE OF "+subtest.memUsage);
+ ok = false;
+ }
break;
default: ERROR("Unknown step type "+step.t);
}
+ emu.idle();
});
});
emu.stopIdle();
diff --git a/core b/core
index 376824068..893c2dbbe 160000
--- a/core
+++ b/core
@@ -1 +1 @@
-Subproject commit 376824068d90986c245b46970fd80ccdca44e431
+Subproject commit 893c2dbbe5a93fbb80d035a695663b4f4cca8875
diff --git a/loader.js b/loader.js
index a6e51192e..2aaad0350 100644
--- a/loader.js
+++ b/loader.js
@@ -72,6 +72,7 @@ var submittedUsageInfo = "";
function sendUsageStats() {
if (!SETTINGS.sendUsageStats) return; // not allowed!
if (device.uid === undefined) return; // no data yet!
+ if (!device.appsInstalled.length) return; // no installed apps or disconnected
/* Work out what we'll send:
* A suitably garbled UID so we can avoid too many duplicates
* firmware version
diff --git a/modules/clock_info.js b/modules/clock_info.js
index 7a938bec8..0a6035ccf 100644
--- a/modules/clock_info.js
+++ b/modules/clock_info.js
@@ -15,8 +15,9 @@ Note that each item is an object with:
{
'text' // the text to display for this item
- 'short' : (optional) a shorter text to display for this item (at most 6 characters)
+ 'short' // optional: a shorter text to display for this item (at most 6 characters)
'img' // optional: a 24x24px image to display for this item
+ 'color' // optional: a color string (like "#ffffff") to color the icon in compatible clocks
'v' // (if hasRange==true) a numerical value
'min','max' // (if hasRange==true) a minimum and maximum numerical value (if this were to be displayed as a guage)
}
@@ -278,9 +279,12 @@ exports.addInteractive = function(menu, options) {
if (!options.focus) {
options.focus=true; // if not focussed, set focus
options.redraw();
- } else if (menu[options.menuA].items[options.menuB].run)
+ } else if (menu[options.menuA].items[options.menuB].run) {
+ Bangle.buzz(100, 0.7);
menu[options.menuA].items[options.menuB].run(); // allow tap on an item to run it (eg home assistant)
- else options.focus=true;
+ } else {
+ options.focus=true;
+ }
};
Bangle.on("touch",touchHandler);
}
diff --git a/modules/widget_utils.js b/modules/widget_utils.js
index 154a95f68..2a6a407be 100644
--- a/modules/widget_utils.js
+++ b/modules/widget_utils.js
@@ -145,4 +145,5 @@ exports.swipeOn = function(autohide) {
};
Bangle.on("swipe", exports.swipeHandler);
+ Bangle.drawWidgets();
};