Page MenuHomeDevCentral

No OneTemporary

diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png
new file mode 100644
index 0000000..218289d
Binary files /dev/null and b/public/android-chrome-192x192.png differ
diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png
new file mode 100644
index 0000000..4729c37
Binary files /dev/null and b/public/android-chrome-512x512.png differ
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
new file mode 100644
index 0000000..07f191d
Binary files /dev/null and b/public/apple-touch-icon.png differ
diff --git a/public/browserconfig.xml b/public/browserconfig.xml
new file mode 100644
index 0000000..52dd0d6
--- /dev/null
+++ b/public/browserconfig.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+ <msapplication>
+ <tile>
+ <square150x150logo src="/mstile-150x150.png"/>
+ <TileColor>#00aba9</TileColor>
+ </tile>
+ </msapplication>
+</browserconfig>
diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png
new file mode 100644
index 0000000..04af8a8
Binary files /dev/null and b/public/favicon-16x16.png differ
diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png
new file mode 100644
index 0000000..1f367e6
Binary files /dev/null and b/public/favicon-32x32.png differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..0a1290d
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/mstile-144x144.png b/public/mstile-144x144.png
new file mode 100644
index 0000000..44bcd51
Binary files /dev/null and b/public/mstile-144x144.png differ
diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png
new file mode 100644
index 0000000..b304456
Binary files /dev/null and b/public/mstile-150x150.png differ
diff --git a/public/mstile-310x150.png b/public/mstile-310x150.png
new file mode 100644
index 0000000..92311d8
Binary files /dev/null and b/public/mstile-310x150.png differ
diff --git a/public/mstile-310x310.png b/public/mstile-310x310.png
new file mode 100644
index 0000000..18b844c
Binary files /dev/null and b/public/mstile-310x310.png differ
diff --git a/public/mstile-70x70.png b/public/mstile-70x70.png
new file mode 100644
index 0000000..cc8caf1
Binary files /dev/null and b/public/mstile-70x70.png differ
diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg
new file mode 100644
index 0000000..40d723b
--- /dev/null
+++ b/public/safari-pinned-tab.svg
@@ -0,0 +1,280 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+</metadata>
+<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M525 6800 c-17 -4 -43 -14 -57 -24 -15 -10 -32 -15 -37 -12 -20 13
+-93 -28 -136 -76 -66 -74 -88 -140 -88 -269 0 -94 2 -110 22 -138 26 -36 76
+-66 106 -63 11 1 2 -5 -20 -13 -53 -21 -91 -59 -102 -103 -13 -51 -8 -351 5
+-382 17 -39 34 -55 77 -77 l39 -21 -31 -6 c-37 -9 -71 -43 -87 -89 -11 -33
+-14 -334 -4 -377 12 -48 74 -100 120 -100 17 0 15 -4 -9 -24 -52 -44 -63 -126
+-25 -184 24 -38 49 -58 107 -87 63 -31 86 -35 211 -36 77 -1 109 3 138 16 40
+19 76 63 79 95 2 30 14 24 21 -11 7 -35 44 -75 85 -91 14 -5 101 -10 192 -10
+205 1 248 14 279 90 l13 34 12 -29 c18 -40 64 -80 105 -88 50 -11 343 -7 371
+4 54 23 104 95 91 130 -3 9 8 5 29 -10 26 -18 46 -24 91 -24 52 0 61 4 93 35
+54 52 76 123 79 254 2 127 -6 186 -31 220 -23 31 -64 56 -95 57 -17 1 -14 4
+13 11 48 13 96 63 106 113 5 22 8 108 8 191 -2 174 -14 214 -78 249 -38 21
+-47 35 -23 35 21 0 65 39 83 73 24 47 24 367 0 414 -23 43 -62 72 -108 79
+l-38 6 13 32 c29 71 -4 148 -79 186 -44 22 -65 25 -175 28 -183 4 -221 -2
+-264 -43 -20 -19 -39 -48 -43 -65 l-6 -32 -13 37 c-17 51 -48 81 -97 94 -56
+15 -364 9 -394 -7 -34 -19 -73 -76 -74 -108 l-1 -29 -10 34 c-28 100 -78 121
+-283 119 -82 -1 -164 -4 -180 -8z m1094 -234 c40 -43 64 -48 221 -51 80 -1
+155 -5 167 -9 20 -6 21 -9 8 -40 -10 -25 -14 -78 -12 -207 2 -201 10 -224 87
+-264 34 -18 40 -24 23 -25 -31 0 -90 -54 -102 -93 -11 -35 -14 -273 -5 -350 7
+-58 54 -114 104 -123 l32 -7 -37 -12 c-81 -29 -102 -71 -103 -216 0 -70 -6
+-123 -17 -157 l-17 -51 -30 22 c-27 20 -43 22 -186 25 -203 4 -237 -1 -279
+-43 -18 -18 -36 -47 -40 -65 l-6 -32 -13 37 c-32 94 -75 108 -305 104 -165 -4
+-176 -5 -206 -28 -17 -13 -37 -37 -44 -52 -12 -30 -29 -39 -29 -16 0 19 -50
+71 -83 85 -15 7 -68 12 -116 12 -76 0 -95 4 -132 25 -24 14 -52 25 -62 25 -15
+0 -13 4 9 25 44 41 50 75 47 260 -1 94 -3 176 -4 184 -4 25 -75 91 -98 91 -12
+0 -19 4 -16 10 3 6 14 10 24 10 20 0 73 54 88 90 6 15 9 99 8 202 -1 169 -2
+178 -26 212 -13 19 -41 43 -63 53 l-39 17 29 9 c37 12 73 45 86 77 6 14 12 60
+13 104 5 113 0 110 208 112 94 1 183 6 197 12 35 14 69 48 76 77 8 31 20 32
+30 3 11 -34 46 -66 89 -81 63 -21 348 -16 397 7 39 19 77 69 79 102 0 13 4 9
+11 -11 6 -16 22 -43 37 -59z"/>
+<path d="M2800 6798 c-19 -5 -41 -15 -48 -21 -7 -6 -29 -11 -48 -13 -74 -5
+-165 -96 -197 -198 -24 -76 -25 -221 -2 -270 19 -39 77 -83 105 -79 8 1 -1 -5
+-20 -13 -91 -41 -103 -77 -103 -294 0 -133 4 -172 16 -197 18 -34 57 -68 89
+-79 19 -6 18 -8 -12 -20 -46 -20 -78 -57 -86 -102 -9 -48 -9 -306 0 -352 11
+-55 70 -110 117 -110 21 0 21 -1 -5 -25 -93 -86 -50 -216 92 -276 59 -26 81
+-29 198 -30 137 0 176 17 216 95 l15 30 8 -25 c4 -13 17 -35 29 -47 43 -48 68
+-54 236 -54 87 1 174 4 193 7 43 8 94 56 105 99 l9 31 12 -36 c14 -42 44 -73
+86 -89 18 -7 94 -12 197 -12 191 0 226 10 262 71 21 37 23 40 25 67 1 12 8 10
+34 -10 25 -19 43 -24 83 -23 66 3 104 33 140 112 26 57 27 68 28 205 0 119 -3
+151 -18 178 -19 38 -69 72 -106 73 -19 0 -15 3 16 13 97 30 112 70 109 291 -1
+136 -5 176 -18 202 -20 38 -67 73 -99 73 -18 0 -15 4 17 19 47 22 78 54 92 96
+6 17 9 107 8 202 -1 164 -3 173 -26 207 -23 35 -80 66 -119 66 -18 0 -18 2 -4
+35 36 88 -17 177 -123 202 -22 6 -108 10 -190 9 -136 -1 -151 -3 -185 -24 -23
+-14 -42 -36 -50 -58 -12 -35 -28 -46 -28 -20 0 23 -50 76 -86 91 -26 10 -78
+13 -211 12 l-178 -2 -36 -28 c-35 -26 -52 -54 -62 -102 -4 -16 -5 -15 -6 5 -2
+42 -38 90 -84 110 -35 15 -69 18 -197 18 -85 0 -171 -5 -190 -10z m1097 -230
+c45 -50 60 -52 396 -59 20 0 20 3 4 -45 -10 -28 -13 -89 -12 -209 1 -161 3
+-172 26 -207 13 -20 40 -44 59 -54 l35 -17 -26 -11 c-83 -35 -96 -73 -94 -286
+1 -154 3 -179 20 -208 20 -34 73 -71 103 -73 9 0 0 -7 -20 -14 -81 -30 -100
+-70 -104 -220 -2 -60 -9 -131 -15 -156 l-13 -46 -43 25 c-42 23 -48 23 -225
+20 -174 -3 -185 -4 -217 -27 -18 -13 -40 -40 -49 -60 l-15 -36 -11 27 c-16 38
+-46 69 -83 84 -39 17 -328 19 -385 4 -43 -12 -97 -72 -99 -110 -1 -22 -3 -21
+-13 10 -26 82 -79 110 -205 110 -73 0 -92 4 -130 25 -23 14 -52 25 -63 25 -17
+0 -16 3 10 25 45 38 54 88 50 277 -3 156 -4 166 -28 201 -25 37 -64 62 -89 58
+-7 -1 -10 2 -6 8 3 6 14 11 24 11 27 0 79 55 91 97 8 24 11 100 8 208 -3 160
+-4 172 -26 200 -28 36 -56 56 -81 58 -22 1 -18 17 4 17 33 0 110 94 104 126
+-1 5 -1 36 0 70 2 99 0 98 203 99 154 1 180 4 214 22 39 20 71 63 74 98 1 13
+6 7 16 -19 17 -47 55 -81 103 -93 38 -9 321 -9 358 0 57 15 102 68 104 124 0
+24 2 22 14 -15 7 -24 22 -53 32 -64z"/>
+<path d="M5069 6800 c-14 -4 -36 -13 -50 -21 -13 -7 -39 -14 -58 -16 -83 -7
+-175 -110 -201 -225 -7 -32 -11 -93 -8 -144 4 -99 25 -142 79 -165 30 -12 39
+-29 15 -29 -23 0 -68 -42 -82 -77 -22 -52 -20 -362 2 -409 19 -40 78 -85 103
+-78 9 3 0 -3 -19 -13 -44 -23 -78 -55 -90 -88 -6 -14 -10 -105 -11 -201 0
+-161 2 -177 22 -213 20 -37 71 -71 106 -71 12 0 9 -6 -11 -25 -73 -67 -61
+-172 28 -240 63 -48 137 -66 263 -66 145 1 181 18 217 101 12 27 15 30 16 13
+0 -12 12 -35 26 -53 48 -56 67 -60 259 -61 161 0 178 1 213 21 44 25 72 65 73
+107 0 24 2 22 14 -16 31 -98 72 -114 292 -113 130 1 170 4 198 18 41 19 73 59
+81 103 l6 30 32 -23 c58 -42 136 -31 187 27 50 56 63 115 64 273 0 136 -1 142
+-27 181 -17 26 -40 46 -63 54 l-35 13 42 21 c31 14 49 32 64 62 20 39 22 57
+20 221 -1 167 -3 180 -24 210 -30 41 -60 62 -92 63 -21 0 -19 2 15 16 43 18
+79 54 93 93 5 14 9 104 8 200 -1 155 -4 179 -21 208 -22 37 -80 72 -120 72
+-25 0 -25 1 -11 28 28 55 14 123 -37 170 -42 40 -99 50 -268 48 -148 -1 -157
+-2 -191 -26 -38 -26 -73 -84 -62 -102 4 -7 2 -8 -4 -4 -7 4 -12 16 -12 26 0
+26 -47 78 -85 94 -24 10 -79 14 -206 13 -165 -2 -176 -3 -213 -26 -23 -15 -45
+-40 -56 -63 -17 -38 -18 -39 -24 -15 -10 40 -52 83 -93 95 -41 12 -322 14
+-364 2z m523 -249 c43 -31 84 -37 248 -36 192 1 217 9 259 85 l25 44 7 -28 c4
+-15 16 -37 26 -48 39 -43 71 -51 223 -54 144 -3 175 -6 184 -15 3 -3 -1 -21
+-7 -41 -9 -24 -12 -94 -12 -206 2 -169 2 -171 29 -206 28 -37 79 -70 90 -59 3
+4 6 1 6 -5 0 -6 -13 -13 -30 -17 -33 -7 -77 -53 -87 -93 -4 -15 -7 -101 -7
+-192 0 -195 10 -226 82 -265 l43 -23 -28 -10 c-75 -26 -94 -70 -99 -217 -1
+-60 -9 -132 -17 -159 -12 -43 -15 -46 -29 -33 -30 31 -90 39 -263 35 -159 -3
+-172 -4 -203 -26 -18 -13 -41 -40 -51 -60 -18 -35 -19 -36 -26 -11 -10 34 -44
+69 -82 85 -46 20 -350 20 -397 0 -42 -18 -86 -74 -87 -112 0 -26 -2 -24 -14
+14 -26 85 -74 112 -202 112 -70 0 -91 4 -131 25 -26 14 -53 25 -61 25 -10 0
+-6 9 11 28 15 15 32 40 37 55 14 36 14 330 1 378 -13 45 -53 87 -94 97 l-31 8
+35 12 c43 15 77 53 91 102 7 22 10 101 7 206 -4 192 -10 209 -81 246 l-41 20
+30 13 c66 28 94 83 94 186 0 103 1 104 208 104 195 1 231 11 267 82 l20 39 17
+-34 c10 -19 28 -42 40 -51z"/>
+<path d="M507 4459 c-16 -4 -35 -13 -42 -19 -8 -7 -29 -14 -47 -15 -18 -2 -45
+-8 -59 -13 -40 -16 -106 -89 -136 -151 -23 -48 -27 -72 -30 -165 -2 -96 0
+-113 18 -146 12 -21 37 -46 55 -56 36 -20 44 -34 19 -34 -25 0 -72 -53 -85
+-95 -8 -27 -11 -97 -8 -210 3 -194 11 -214 90 -254 31 -15 37 -21 21 -21 -29
+0 -83 -47 -99 -87 -17 -39 -19 -328 -4 -385 13 -44 73 -98 109 -98 l25 0 -26
+-27 c-56 -61 -64 -125 -23 -186 53 -78 154 -118 295 -119 152 -1 194 14 228
+83 17 35 21 38 27 21 10 -32 44 -71 78 -89 48 -24 358 -23 411 2 41 20 87 78
+80 104 -2 9 5 -3 16 -26 21 -43 57 -75 100 -88 13 -4 100 -8 192 -8 147 1 171
+3 200 20 40 23 78 77 78 110 l0 24 31 -23 c23 -17 44 -23 82 -23 69 0 111 30
+146 104 25 53 26 65 26 211 0 146 -1 157 -23 188 -13 18 -40 41 -60 51 -35 18
+-36 19 -11 26 34 10 68 44 85 84 17 40 20 326 4 381 -14 48 -43 80 -86 95
+l-36 12 29 10 c16 6 41 21 54 34 46 44 51 74 47 266 -3 169 -4 180 -26 208
+-28 35 -77 64 -111 65 -18 0 -22 4 -16 18 27 67 9 148 -42 186 -51 37 -166 48
+-400 37 -39 -1 -113 -69 -113 -102 0 -27 -16 -16 -24 16 -4 14 -16 35 -27 46
+-39 39 -84 46 -265 44 -147 -1 -175 -4 -203 -21 -34 -20 -76 -85 -63 -99 4 -5
+1 -5 -5 -1 -7 4 -13 13 -13 21 0 20 -50 75 -79 87 -30 13 -343 18 -384 7z
+m517 -243 c25 -32 99 -43 266 -41 186 3 218 13 253 81 9 17 14 34 11 37 -3 3
+0 8 6 12 6 3 9 3 8 -2 -4 -14 14 -57 31 -77 36 -41 70 -49 226 -53 213 -5 195
+0 178 -42 -11 -25 -14 -77 -14 -204 1 -152 3 -173 22 -212 16 -31 33 -48 62
+-61 l40 -18 -29 -10 c-34 -11 -71 -47 -84 -81 -6 -15 -10 -103 -10 -197 0
+-151 2 -177 20 -212 20 -42 65 -75 103 -77 15 -1 11 -4 -13 -11 -19 -5 -46
+-19 -58 -31 -44 -40 -53 -71 -53 -180 0 -118 -26 -230 -47 -204 -26 31 -85 39
+-263 36 -165 -4 -176 -5 -206 -28 -30 -23 -56 -67 -56 -97 0 -14 -5 -15 -6 -1
+0 4 -10 25 -22 47 -38 68 -78 80 -261 80 -85 0 -169 -3 -186 -6 -43 -9 -91
+-52 -106 -97 l-13 -39 -7 33 c-15 75 -79 109 -205 109 -74 1 -92 4 -126 25
+-22 14 -49 25 -59 25 -18 0 -17 2 6 28 14 15 31 37 38 50 13 26 17 300 6 367
+-9 50 -40 89 -86 109 l-35 14 30 12 c42 16 72 47 86 88 13 39 16 309 4 363
+-14 61 -66 115 -109 111 -24 -1 -18 4 35 31 59 30 81 76 81 167 0 114 0 114
+209 115 141 1 180 5 206 18 38 20 73 66 74 99 0 19 4 16 19 -17 11 -22 26 -48
+34 -59z"/>
+<path d="M2803 4460 c-18 -4 -40 -13 -48 -20 -9 -7 -28 -14 -44 -15 -78 -6
+-161 -85 -201 -192 -17 -45 -22 -79 -22 -151 1 -111 19 -156 75 -187 38 -21
+47 -35 23 -35 -27 0 -74 -50 -88 -93 -9 -29 -13 -90 -12 -204 2 -140 5 -167
+21 -195 21 -36 80 -81 94 -72 5 3 9 2 9 -3 -1 -4 -20 -17 -43 -29 -68 -33 -79
+-67 -80 -253 -1 -171 5 -216 31 -246 27 -33 64 -55 91 -55 l24 0 -27 -25 c-26
+-24 -54 -79 -51 -100 11 -99 75 -163 194 -195 58 -15 228 -16 274 -1 38 13 81
+55 93 93 6 20 7 20 20 -8 37 -83 71 -96 253 -97 190 -1 232 6 271 44 16 17 33
+42 36 56 6 24 7 24 28 -13 28 -51 79 -84 130 -85 222 -5 318 0 354 19 45 23
+76 72 81 127 1 6 4 5 9 -1 12 -19 70 -44 101 -44 61 0 106 31 140 96 30 57 38
+116 36 252 -2 102 -5 125 -23 154 -22 35 -68 68 -99 69 -10 0 -1 7 19 14 92
+34 105 71 104 295 -2 166 -3 178 -25 208 -12 18 -39 41 -59 51 -34 18 -35 20
+-16 28 38 15 79 58 90 93 5 19 10 112 9 206 0 165 -1 172 -25 207 -28 41 -68
+63 -120 66 -19 1 -20 3 -5 31 21 40 13 103 -19 144 -44 58 -96 71 -281 71
+-183 0 -212 -10 -243 -77 -17 -38 -32 -49 -32 -24 0 23 -49 75 -84 90 -23 9
+-82 13 -206 12 -166 -1 -177 -2 -214 -25 -24 -15 -45 -39 -56 -65 l-19 -40 -7
+29 c-8 37 -29 62 -69 83 -24 13 -64 17 -195 17 -91 1 -180 -2 -197 -5z m516
+-239 c40 -40 77 -47 251 -46 197 1 231 12 267 83 18 37 22 40 28 22 10 -31 55
+-80 84 -92 14 -6 96 -12 181 -15 158 -4 180 -5 180 -8 0 -2 -6 -20 -13 -41
+-10 -28 -13 -88 -12 -204 2 -158 8 -195 37 -231 17 -21 74 -50 82 -42 3 4 6 2
+6 -3 -1 -5 -20 -18 -43 -29 -29 -14 -48 -32 -62 -60 -19 -37 -21 -58 -20 -217
+1 -175 1 -177 28 -216 29 -40 61 -61 100 -63 14 -1 8 -5 -16 -11 -85 -23 -113
+-79 -112 -223 0 -73 -4 -113 -17 -147 -10 -27 -15 -48 -11 -48 3 0 4 -3 0 -6
+-3 -3 -20 5 -37 18 -31 22 -38 23 -223 23 -187 0 -193 -1 -226 -24 -18 -13
+-41 -42 -51 -63 l-17 -39 -7 28 c-10 36 -42 71 -85 89 -40 17 -325 20 -383 4
+-41 -12 -97 -72 -99 -105 0 -14 -5 -10 -16 15 -33 78 -78 100 -203 100 -75 0
+-94 4 -131 25 -24 14 -52 25 -62 25 -15 0 -13 5 10 24 48 40 56 82 51 272 -3
+142 -6 174 -21 199 -20 32 -67 64 -95 66 -9 0 -1 7 18 16 44 19 77 56 91 103
+7 22 10 101 8 206 -4 192 -10 208 -92 251 -32 17 -37 22 -20 23 29 0 83 47 99
+87 8 18 14 63 14 101 0 108 -4 106 201 107 145 1 180 4 211 19 39 19 77 69 79
+102 0 11 6 3 14 -18 7 -20 23 -46 34 -57z"/>
+<path d="M5085 4460 c-17 -4 -43 -14 -57 -24 -15 -10 -32 -15 -37 -12 -21 13
+-93 -28 -139 -80 -67 -75 -86 -133 -87 -265 0 -96 2 -109 25 -142 13 -20 34
+-39 45 -43 11 -4 29 -10 40 -13 17 -6 15 -9 -15 -21 -86 -36 -101 -80 -97
+-300 3 -189 12 -216 81 -252 l40 -20 -30 -13 c-33 -14 -65 -48 -81 -86 -7 -16
+-10 -93 -9 -205 1 -170 3 -181 24 -212 25 -34 69 -62 98 -62 15 0 13 -5 -8
+-27 -89 -94 -46 -216 97 -275 58 -24 92 -29 204 -30 74 0 108 5 136 18 39 18
+74 65 76 99 0 14 5 10 16 -15 20 -48 50 -77 91 -91 46 -15 347 -15 387 1 42
+16 72 47 86 88 l12 35 12 -35 c29 -85 72 -101 266 -100 170 0 216 6 244 30 31
+26 55 69 55 96 l0 25 36 -24 c65 -44 148 -29 197 37 44 59 57 117 57 259 0
+173 -17 213 -107 245 -34 12 -35 13 -11 14 34 0 87 44 104 87 10 23 14 82 14
+204 0 155 -2 175 -21 209 -24 43 -73 75 -109 72 -15 -1 -6 5 20 14 58 20 87
+48 100 93 5 20 10 110 10 199 0 131 -3 171 -16 198 -20 42 -62 73 -109 81 -29
+5 -35 9 -29 22 4 9 9 35 12 59 8 78 -44 140 -134 160 -22 5 -105 9 -185 8
+-168 -1 -199 -12 -235 -84 l-22 -42 -10 27 c-5 16 -19 38 -29 50 -39 45 -76
+51 -263 49 -150 -2 -180 -5 -207 -21 -33 -20 -77 -87 -65 -100 4 -5 1 -5 -5
+-1 -7 4 -13 13 -13 21 0 20 -50 75 -79 88 -29 12 -327 18 -376 7z m1090 -237
+c35 -37 74 -45 237 -48 86 -2 161 -6 167 -9 6 -4 4 -18 -6 -36 -12 -24 -14
+-66 -11 -213 3 -168 5 -184 25 -212 23 -33 76 -68 87 -58 3 3 6 2 6 -3 0 -5
+-18 -17 -40 -27 -28 -13 -45 -30 -59 -61 -19 -37 -21 -61 -21 -202 0 -87 5
+-175 10 -195 12 -43 46 -76 95 -94 l38 -12 -35 -7 c-38 -7 -81 -46 -97 -89 -6
+-16 -11 -79 -11 -142 0 -63 -4 -116 -9 -119 -5 -3 -12 -22 -16 -42 -6 -32 -8
+-35 -23 -22 -40 34 -78 40 -254 36 -194 -3 -220 -11 -255 -75 -18 -34 -33 -43
+-33 -19 0 25 -55 74 -95 86 -26 8 -101 11 -210 8 -192 -3 -200 -6 -246 -78
+-16 -25 -29 -38 -29 -28 0 25 -50 79 -87 94 -19 8 -69 14 -120 14 -76 1 -94 4
+-128 25 -22 14 -48 25 -59 25 -15 0 -13 5 13 32 17 17 34 48 38 67 8 42 8 314
+0 353 -12 56 -66 108 -114 108 -10 0 0 9 22 19 51 23 81 56 92 101 8 33 8 323
+0 362 -9 48 -92 118 -119 102 -6 -4 -8 -3 -4 4 3 6 19 13 35 17 61 13 91 69
+95 175 4 117 -1 115 209 115 155 1 177 3 207 21 39 22 83 80 74 98 -3 6 2 2
+10 -8 9 -11 16 -25 16 -31 0 -18 41 -52 80 -68 42 -16 350 -16 390 0 38 16 78
+61 86 96 l8 32 10 -35 c6 -20 20 -46 31 -57z m-188 -1695 c-3 -8 -6 -5 -6 6
+-1 11 2 17 5 13 3 -3 4 -12 1 -19z"/>
+<path d="M508 2177 c-18 -5 -40 -15 -49 -23 -8 -8 -27 -14 -42 -14 -68 0 -150
+-69 -193 -163 -26 -56 -29 -72 -29 -173 0 -129 9 -154 73 -195 41 -26 42 -28
+20 -34 -33 -10 -68 -45 -84 -82 -17 -39 -19 -328 -4 -385 13 -44 73 -98 110
+-98 21 -1 18 -3 -13 -15 -96 -34 -110 -75 -106 -306 4 -165 5 -176 28 -206 13
+-18 42 -39 64 -48 l40 -16 -21 -22 c-61 -65 -55 -154 15 -218 78 -73 176 -93
+401 -80 33 2 102 75 102 109 0 23 4 20 24 -24 19 -41 32 -55 67 -71 40 -18 62
+-20 220 -19 176 2 177 2 213 30 39 29 65 72 60 96 -3 8 4 -3 15 -25 20 -43 52
+-75 91 -92 15 -6 95 -10 200 -9 154 2 179 4 208 21 36 22 72 75 72 107 0 20 1
+20 26 3 65 -43 135 -36 191 18 54 51 68 110 68 282 0 142 -1 152 -23 180 -27
+34 -72 63 -90 57 -29 -9 -9 8 32 28 34 16 50 32 66 66 20 41 22 56 18 222 -3
+168 -4 179 -27 211 -13 18 -42 41 -64 51 l-39 18 29 6 c17 4 41 19 55 34 45
+49 50 77 46 264 -3 148 -6 177 -22 204 -22 36 -65 64 -104 68 -21 1 -26 7 -24
+21 13 91 13 103 -2 132 -39 76 -97 95 -297 95 -175 1 -210 -10 -246 -81 l-22
+-43 -14 34 c-17 40 -40 61 -87 80 -46 18 -355 17 -391 -2 -40 -21 -68 -51 -80
+-89 l-12 -36 -10 35 c-11 45 -57 87 -104 96 -53 10 -317 10 -355 1z m469 -159
+c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m642 -91 c39 -32 60 -36
+238 -39 78 -2 145 -6 149 -10 4 -5 2 -20 -5 -35 -13 -29 -17 -315 -6 -376 10
+-50 68 -106 112 -108 11 0 6 -5 -12 -11 -37 -13 -72 -44 -91 -81 -23 -43 -21
+-364 2 -412 18 -38 62 -75 93 -78 25 -2 16 -17 -9 -17 -28 0 -77 -46 -90 -85
+-6 -18 -11 -79 -12 -134 0 -69 -6 -119 -19 -158 -10 -32 -18 -53 -18 -47 -1 7
+-19 20 -42 31 -35 17 -62 19 -219 18 -177 -1 -178 -1 -213 -28 -19 -15 -41
+-40 -49 -57 -14 -32 -28 -40 -28 -15 0 27 -59 82 -97 92 -21 5 -113 9 -204 8
+-150 -1 -169 -3 -200 -22 -33 -21 -63 -66 -72 -108 -4 -16 -5 -15 -6 5 -2 37
+-36 87 -73 106 -23 12 -61 18 -128 20 -80 2 -103 6 -144 28 -27 14 -52 23 -57
+20 -5 -3 -9 -1 -9 3 0 5 9 14 21 21 41 26 50 73 50 252 1 214 -14 253 -107
+285 l-37 12 34 7 c42 8 80 41 98 82 14 34 19 299 7 370 -11 62 -63 113 -118
+115 -17 0 -13 4 17 15 79 29 106 77 107 189 1 105 -3 103 212 107 204 3 217 7
+261 76 24 37 31 39 41 10 4 -13 16 -33 28 -44 37 -38 90 -46 272 -43 158 4
+171 6 199 27 17 12 39 38 50 58 l19 35 11 -29 c7 -15 27 -40 44 -55z"/>
+<path d="M2801 2173 c-25 -6 -47 -16 -49 -22 -2 -6 -17 -11 -33 -11 -88 0
+-187 -99 -219 -219 -6 -24 -12 -82 -12 -130 -2 -116 22 -160 102 -195 25 -11
+29 -15 15 -16 -36 0 -92 -47 -105 -86 -14 -40 -18 -314 -7 -374 9 -46 57 -99
+98 -107 l31 -6 -33 -14 c-42 -18 -67 -40 -86 -78 -20 -38 -23 -340 -4 -398 13
+-38 65 -87 94 -87 27 0 28 -16 2 -40 -41 -38 -49 -118 -17 -173 20 -34 102
+-90 157 -108 23 -7 91 -13 160 -13 107 0 124 2 156 21 33 21 53 49 70 98 l7
+20 1 -20 c2 -36 41 -86 81 -104 34 -15 67 -18 213 -17 163 1 174 2 211 25 23
+15 45 40 56 64 l18 39 11 -34 c11 -34 44 -65 90 -84 30 -12 355 -12 386 1 36
+15 75 58 85 97 l11 37 32 -19 c47 -27 89 -30 134 -10 88 39 118 118 117 316 0
+133 -1 143 -24 177 -13 19 -40 43 -59 52 l-36 17 30 13 c37 16 69 51 82 90 6
+17 9 107 9 200 -2 156 -4 174 -23 205 -24 39 -69 70 -105 71 -25 1 -19 4 24
+13 37 8 84 56 96 97 8 31 8 333 0 370 -12 50 -60 89 -131 104 -27 5 -27 6 -12
+34 31 61 -3 154 -68 184 -49 24 -132 33 -270 31 -94 -2 -124 -6 -150 -21 -36
+-22 -79 -80 -71 -97 3 -6 -2 -2 -10 8 -9 11 -16 25 -16 31 0 20 -61 64 -98 71
+-48 9 -307 9 -352 0 -57 -11 -109 -69 -111 -123 -1 -24 -2 -22 -12 13 -29 101
+-66 117 -266 118 -87 1 -175 -4 -200 -11z m1104 -240 c32 -33 80 -42 242 -45
+83 -2 154 -6 158 -10 4 -3 1 -17 -6 -30 -15 -27 -20 -334 -7 -385 11 -41 62
+-92 101 -100 l31 -6 -37 -13 c-88 -31 -104 -77 -102 -299 1 -128 5 -166 18
+-192 17 -31 65 -73 86 -73 6 0 11 -4 11 -10 0 -5 -7 -10 -15 -10 -25 0 -83
+-59 -91 -93 -4 -18 -8 -75 -9 -127 -1 -52 -8 -115 -15 -140 -7 -25 -12 -51
+-11 -59 2 -9 -6 -7 -24 8 -42 33 -78 38 -256 36 -138 -1 -171 -4 -192 -18 -41
+-27 -65 -57 -73 -91 l-7 -31 -9 35 c-6 19 -20 45 -32 57 -44 43 -79 50 -262
+48 -160 -1 -173 -3 -208 -25 -23 -14 -45 -39 -56 -62 l-17 -40 -11 29 c-13 36
+-46 71 -80 85 -15 6 -68 12 -118 13 -75 2 -98 7 -135 27 -24 14 -50 23 -56 21
+-21 -7 -15 12 11 35 41 35 48 82 45 268 -4 158 -6 171 -27 202 -13 18 -40 41
+-60 51 -35 18 -36 19 -11 26 34 10 68 44 85 85 17 40 19 343 3 390 -12 32 -42
+62 -83 84 l-29 15 29 13 c68 30 94 80 94 181 0 107 -4 105 215 109 171 3 182
+4 214 27 18 13 41 42 51 65 l19 40 7 -29 c9 -39 40 -73 83 -91 40 -17 325 -20
+383 -4 45 13 98 71 99 108 0 24 2 23 17 -14 9 -22 26 -49 37 -61z"/>
+<path d="M5104 2180 c-23 -4 -53 -14 -67 -23 -15 -9 -38 -17 -52 -17 -66 0
+-149 -72 -193 -170 -23 -49 -26 -68 -26 -170 -1 -130 8 -152 82 -196 l37 -22
+-26 -7 c-35 -9 -74 -51 -87 -95 -7 -20 -10 -106 -9 -205 2 -162 3 -172 26
+-204 13 -18 42 -41 63 -51 l40 -17 -31 -11 c-40 -14 -67 -40 -85 -82 -11 -27
+-14 -78 -13 -211 2 -170 3 -177 27 -212 23 -33 38 -43 92 -61 16 -5 14 -9 -11
+-35 -29 -30 -43 -75 -37 -123 8 -67 103 -143 206 -164 80 -16 237 -11 277 9
+34 18 68 60 75 92 4 17 7 14 20 -15 19 -42 52 -74 93 -87 17 -6 107 -9 202 -8
+163 1 173 2 207 25 32 23 62 65 58 83 -1 4 2 7 8 7 5 0 12 -11 16 -24 8 -32
+51 -71 94 -84 20 -6 105 -10 200 -8 130 2 172 6 197 19 35 19 73 73 73 106 l0
+22 38 -20 c70 -37 122 -33 175 14 56 49 71 104 75 267 3 123 1 152 -14 183
+-19 41 -84 87 -111 80 -10 -3 2 4 27 15 92 43 100 67 100 288 0 159 -2 180
+-20 210 -22 35 -73 71 -105 73 -12 0 -6 5 15 11 46 13 88 53 101 98 6 21 9
+105 7 210 -3 156 -5 178 -23 202 -27 35 -69 59 -106 60 -23 1 -29 5 -23 17 14
+34 16 102 4 131 -17 41 -62 77 -112 90 -48 14 -253 18 -321 8 -74 -11 -125
+-60 -128 -123 l-1 -30 -8 34 c-10 44 -39 81 -80 105 -30 18 -53 20 -211 19
+-164 0 -180 -2 -212 -22 -40 -25 -71 -67 -70 -96 1 -12 -6 -6 -16 17 -24 52
+-47 75 -90 89 -37 13 -273 18 -347 9z m1070 -238 c37 -42 77 -51 224 -53 76 0
+150 -3 164 -6 26 -5 26 -5 11 -40 -11 -28 -14 -74 -11 -213 3 -201 8 -214 83
+-257 l39 -22 -27 -6 c-36 -9 -84 -66 -92 -108 -4 -19 -5 -110 -3 -203 2 -138
+6 -173 20 -192 20 -29 83 -73 92 -65 3 4 6 2 6 -4 0 -6 -12 -14 -27 -18 -32
+-8 -64 -39 -81 -78 -7 -16 -12 -72 -12 -128 0 -62 -6 -122 -16 -155 -15 -51
+-28 -67 -36 -44 -8 26 -81 36 -245 35 -135 -1 -174 -5 -200 -18 -31 -17 -73
+-65 -73 -86 0 -6 -4 -11 -10 -11 -5 0 -10 7 -10 15 0 24 -57 81 -92 91 -34 10
+-335 11 -375 1 -35 -9 -70 -39 -89 -77 l-17 -35 -11 26 c-30 71 -73 92 -196
+95 -79 2 -103 7 -144 28 -27 14 -54 23 -60 19 -6 -3 1 7 15 23 15 16 32 40 39
+53 15 29 20 327 7 381 -14 60 -68 109 -122 111 -19 1 -23 3 -10 6 11 2 29 6
+40 8 11 3 32 15 46 27 47 41 54 77 53 264 -1 160 -2 174 -23 208 -25 39 -66
+66 -103 66 -17 1 -13 4 15 14 78 28 108 77 111 180 3 120 -3 116 198 116 155
+0 176 2 216 22 33 16 49 31 61 59 9 22 18 39 21 39 3 0 13 -18 23 -40 13 -28
+30 -45 61 -59 37 -19 61 -21 207 -21 151 0 168 2 209 23 31 15 50 34 65 63 20
+40 20 40 29 15 5 -14 18 -37 30 -49z"/>
+</g>
+</svg>
diff --git a/tommy.rb b/tommy.rb
index c21e862..ad679dd 100644
--- a/tommy.rb
+++ b/tommy.rb
@@ -1,166 +1,171 @@
# -------------------------------------------------------------
# Tommy - Visualisation dashboard for Jenkins
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Author: Arfon Smitn (Zooniverse)
# Maintainer: Sebastien Santoro aka Dereckson
# Project: Nasqueron
# Created: 2011-09-14
# Dependencies: Sinatra
# -------------------------------------------------------------
require 'sinatra'
require 'rest-client'
require 'active_support/all'
require 'hashie'
require 'erb'
# -------------------------------------------------------------
# Table of contents
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#
# :: Environment
# :: Project class
# :: Controller
# :: Routes
# :: Helpers
#
# -------------------------------------------------------------
# -------------------------------------------------------------
# Environment
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HUDSON_URL = ENV['HUDSON_URL'] || 'http://username:password@my.hudsonurl.com'
# -------------------------------------------------------------
# Project class
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
##
# This class represents a defined or discrete hash for a Jenkins project.
class Project < Hashie::Dash
property :name
property :build_score
property :last_build_number
property :last_build_url
property :last_stable_build
property :health_report
property :last_complete_url
property :last_failed_url
property :colour
##
# Parses a job element of the Jenkins API.
# Returns a Project instance.
def self.parse_project(data)
project = Project.new(
name: data['displayName'].tr('-', ' '),
last_build_number: data['builds'].first['number'],
colour: data['color']
)
if data['healthReport']
project.build_score = data['healthReport'].first['score'].to_i
project.health_report = data['healthReport'].first['description']
end
unless data['lastStableBuild'].blank?
project.last_stable_build = data['lastStableBuild']['number']
end
urls = {
'lastBuild' => 'last_build_url=',
'lastCompletedBuild' => 'last_complete_url=',
'lastFailedBuild' => 'last_failed_url='
}
urls.each do |api_property, local_property|
next if data[api_property].blank?
project.send(local_property, data[api_property]['url'])
end
project
rescue NoMethodError
nil
end
##
# Parses a JSON API reply into an array of Project instances
def self.parse_incoming_json(json)
projects = []
json['jobs'].each do |job|
project = parse_project(job)
projects << project unless project.nil?
end
projects
end
##
# Determines if a build is green
def green?
last_stable_build == last_build_number
end
##
# Determines if a build is still building
def building?
colour.include?('anime')
end
end
# -------------------------------------------------------------
# Controller
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
def prepare_dashboard
json = RestClient::Resource.new("#{HUDSON_URL}/api/json?depth=1")
@projects = Project.parse_incoming_json(JSON.parse(json.get))
erb :index
end
# -------------------------------------------------------------
# Routes
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
get '/' do
prepare_dashboard
end
+get '/manifest.json' do
+ content_type 'application/json'
+ erb :manifest
+end
+
get '/status' do
'ALIVE'
end
# -------------------------------------------------------------
# Helpers
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
helpers do
def css_scores
{
100 => 'best',
80 => 'better',
60 => 'good',
40 => 'bad',
0 => 'worse'
}
end
def css_for_score(score)
css_scores.each do |threshold, css_class|
return css_class if score >= threshold
end
raise 'Specify in scores a value for the lower score you can get.'
end
def css_for_project(project)
if project.green?
css_for_score(project.build_score)
elsif project.building?
'building'
else
'worst'
end
end
end
diff --git a/views/index.erb b/views/index.erb
index 9359c57..8079c2f 100644
--- a/views/index.erb
+++ b/views/index.erb
@@ -1,81 +1,90 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
<meta http-equiv="refresh" content="30" />
<title>Tommy</title>
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
+ <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32" />
+ <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16" />
+ <link rel="manifest" href="/manifest.json" />
+ <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5" />
+ <meta name="apple-mobile-web-app-title" content="Tommy" />
+ <meta name="application-name" content="Tommy" />
+ <meta name="theme-color" content="#ffffff" />
+
<link href="styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="wrapper">
<% @projects.each do |project| %>
<% if project %>
<div class="project <%= css_for_project(project) %>">
<div class="heading">
<span class="name"><%= project.name %></span>
<a href="<%= project.last_build_url %>" target="_blank" class="build-number"><%= project.last_build_number %></a>
</div>
<div class="details">
<div class="health"><%= project.health_report %></div>
<div class="actions">
<a href="<%= project.last_build_url %>" target="_blank">Build</a>
<a href="<%= project.last_complete_url %>" target="_blank">Complete</a>
<a href="<%= project.last_failed_url %>" target="_blank">Failed</a>
</div>
</div>
</div>
<% else %>
<!--No project-->
<% end %>
<% end %>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var DETAILS_CLASS = 'with-details';
var projects = $('.project');
var doc = $(document);
function toggleDetails(e) {
var target = $(this);
var hadDetails = target.hasClass(DETAILS_CLASS);
projects.removeClass(DETAILS_CLASS);
if (!hadDetails) target.addClass(DETAILS_CLASS);
}
doc.on('click', '.project', toggleDetails);
doc.on('touchstart', '.project', toggleDetails);
doc.on('keydown', function(e) {
if (e.keyCode === 27) projects.removeClass(DETAILS_CLASS);
});
// Always take up the full screen.
function adjustProjectHeights() {
var _firstTop = NaN;
for (var howManyAcross = 0; howManyAcross < projects.length; howManyAcross++) {
var offsetTop = $(projects[howManyAcross]).offset().top;
if (isNaN(_firstTop)) _firstTop = offsetTop;
if (offsetTop !== _firstTop) break;
}
projects.height(projects.parent().height() / (projects.length / howManyAcross));
}
$(window).on('resize', adjustProjectHeights);
adjustProjectHeights();
// An iPod driving an HD monitor will stretch the image.
// Compensate by shrinking it a bit.
if (~location.search.indexOf('ipad')) $('html').addClass('ipad-scale');
</script>
</body>
</html>
diff --git a/views/manifest.erb b/views/manifest.erb
new file mode 100644
index 0000000..8f187d3
--- /dev/null
+++ b/views/manifest.erb
@@ -0,0 +1,18 @@
+{
+ "name": "Tommy",
+ "icons": [
+ {
+ "src": "\/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image\/png"
+ },
+ {
+ "src": "\/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image\/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "start_url": "<%= request.base_url %>",
+ "display": "standalone"
+}

File Metadata

Mime Type
image/svg+xml
Expires
Mon, Nov 18, 13:50 (2 d)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2249455
Default Alt Text
(30 KB)

Event Timeline