From 7f476a519a8abeecf6c1e19e4e91635ea324d608 Mon Sep 17 00:00:00 2001 From: Chip Black Date: Tue, 23 Aug 2011 03:36:53 -0500 Subject: [PATCH] Initial commit, v1.0.0 --- COPYING | 22 +++++ HacksSelectorCanvas.js | 79 +++++++++++++++++ Main.css | 29 ++++++ Main.js | 139 +++++++++++++++++++++++++++++ appinfo.json | 11 +++ depends.js | 14 +++ hacks/Hack.js | 14 +++ hacks/Landscape/Landscape.js | 33 +++++++ hacks/Landscape/clouds.png | Bin 0 -> 2501 bytes hacks/Landscape/mountains.png | Bin 0 -> 1862 bytes hacks/Landscape/trees.png | Bin 0 -> 4923 bytes hacks/Munch/Munch.js | 49 ++++++++++ hacks/Nimbus/Nimbus.js | 85 ++++++++++++++++++ hacks/Orbit/Orbit.js | 65 ++++++++++++++ hacks/Orbit/chrome_ball.png | Bin 0 -> 5331 bytes hacks/Pixelfade/Pixelfade.js | 148 +++++++++++++++++++++++++++++++ hacks/Pixelfade/pixelfade0.gif | Bin 0 -> 206 bytes hacks/Pixelfade/pixelfade1.gif | Bin 0 -> 250 bytes hacks/Pixelfade/pixelfade2.gif | Bin 0 -> 221 bytes hacks/Pixelfade/pixelfade3.gif | Bin 0 -> 319 bytes hacks/Pixelfade/pixelfade4.gif | Bin 0 -> 215 bytes hacks/Pixelfade/pixelfade5.gif | Bin 0 -> 319 bytes hacks/Pixelfade/pixelfade6.gif | Bin 0 -> 221 bytes hacks/Pixelfade/pixelfade7.gif | Bin 0 -> 250 bytes hacks/Pixelfade/pixelfade8.gif | Bin 0 -> 206 bytes hacks/Pixelfade/pixelfade9.gif | Bin 0 -> 110 bytes hacks/Swarm/Swarm.js | 137 ++++++++++++++++++++++++++++ hacks/XSpinner/XSpinner.js | 80 +++++++++++++++++ hacks/XSpinnerCGA/XSpinnerCGA.js | 78 ++++++++++++++++ icon.png | Bin 0 -> 1390 bytes icon_48.png | Bin 0 -> 1103 bytes index.html | 14 +++ 32 files changed, 997 insertions(+) create mode 100644 COPYING create mode 100644 HacksSelectorCanvas.js create mode 100644 Main.css create mode 100644 Main.js create mode 100644 appinfo.json create mode 100644 depends.js create mode 100644 hacks/Hack.js create mode 100644 hacks/Landscape/Landscape.js create mode 100644 hacks/Landscape/clouds.png create mode 100644 hacks/Landscape/mountains.png create mode 100644 hacks/Landscape/trees.png create mode 100644 hacks/Munch/Munch.js create mode 100644 hacks/Nimbus/Nimbus.js create mode 100644 hacks/Orbit/Orbit.js create mode 100644 hacks/Orbit/chrome_ball.png create mode 100644 hacks/Pixelfade/Pixelfade.js create mode 100644 hacks/Pixelfade/pixelfade0.gif create mode 100644 hacks/Pixelfade/pixelfade1.gif create mode 100644 hacks/Pixelfade/pixelfade2.gif create mode 100644 hacks/Pixelfade/pixelfade3.gif create mode 100644 hacks/Pixelfade/pixelfade4.gif create mode 100644 hacks/Pixelfade/pixelfade5.gif create mode 100644 hacks/Pixelfade/pixelfade6.gif create mode 100644 hacks/Pixelfade/pixelfade7.gif create mode 100644 hacks/Pixelfade/pixelfade8.gif create mode 100644 hacks/Pixelfade/pixelfade9.gif create mode 100644 hacks/Swarm/Swarm.js create mode 100644 hacks/XSpinner/XSpinner.js create mode 100644 hacks/XSpinnerCGA/XSpinnerCGA.js create mode 100644 icon.png create mode 100644 icon_48.png create mode 100644 index.html diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..840acd4 --- /dev/null +++ b/COPYING @@ -0,0 +1,22 @@ +Copyright (c) 2011, The Dominion of Awesome +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/HacksSelectorCanvas.js b/HacksSelectorCanvas.js new file mode 100644 index 0000000..6eb4405 --- /dev/null +++ b/HacksSelectorCanvas.js @@ -0,0 +1,79 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "HacksSelector", + kind: "Control", + nodeTag: "canvas", + className: "hacks-selector", + style: "opacity: 0", + width: "748px", + height: "192px", + index: 0, + published: { + hacksList: null + }, + hacksThumbs: {}, + rendered: function() { + this.inherited(arguments); + var node = this.hasNode(); + node.width = 748; + node.height = 192; + this.ctx = node.getContext('2d'); + this.ctx.fillStyle = 'white'; + this.fadeGradient = this.ctx.createLinearGradient(0, 0, 0, 128); + this.fadeGradient.addColorStop(0.6, 'rgba(0,0,0,0)'); + this.fadeGradient.addColorStop(1.0, 'rgba(255,255,255,0.5)'); + }, + setHacksList: function(newHacksList) { + this.hacksList = newHacksList; + for (var i = 0; i < this.hacksList.length; i++) { + if (this.hacksThumbs[this.hacksList[i]]) + continue; + var img = new Image(); + img.src = "hacks/" + this.hacksList[i] + "/thumbnail.png"; + img.onload = this.draw.bind(this); + this.hacksThumbs[this.hacksList[i]] = img; + } + }, + show: function() { + if (this.hideTimer) + clearTimeout(this.hideTimer); + this.hideTimer = setTimeout(function() { + this.setStyle('opacity: 0; -webkit-transition: opacity 0.5s linear'); + }.bind(this), 1500); + this.setStyle('opacity: 1.0; -webkit-transition: opacity 0.25s linear'); + }, + draw: function() { + this.ctx.clearRect(0, 0, 750, 256); + if (!this.hacksList) return; + for (var i = -2; i <= 3; i++) { + var frac = this.index - Math.floor(this.index); + var x = 311 + (i - frac) * 146; + var j = Math.floor(this.index) + i; + if (j < 0 || j > this.hacksList.length - 1) + continue; + var h = this.hacksList[j]; + + this.ctx.save(); + this.ctx.translate(x, 0); + this.ctx.drawImage(this.hacksThumbs[h], 0, 0); + this.ctx.scale(1, -1); + this.ctx.translate(0, -256); + this.ctx.beginPath(); + this.ctx.fillStyle = this.fadeGradient; + this.ctx.rect(0, 0, 128, 128); + this.ctx.fill(); + this.ctx.globalCompositeOperation = 'source-in'; + this.ctx.drawImage(this.hacksThumbs[h], 0, 0); + this.ctx.restore(); + + this.ctx.save(); + this.ctx.shadowColor = 'white'; + this.ctx.shadowBlur = '3'; + this.ctx.beginPath(); + this.ctx.arc(374, 160, 5, 0, Math.PI * 2); + this.ctx.fill(); + this.ctx.restore(); + } + } +}); diff --git a/Main.css b/Main.css new file mode 100644 index 0000000..1fe2ca5 --- /dev/null +++ b/Main.css @@ -0,0 +1,29 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +@font-face { + font-family: PCSenior; + src: url(fonts/pcsenior.ttf); +} + +.hacks-selector { + position: absolute; + bottom: 64px; + margin-left: -374px; + left: 50%; +} + +.info { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + padding: 24px; + font-size: 24px; + -webkit-transition-property: opacity; + -webkit-transition-duration: 0.6s; + color: #303030; +} + +.info.dark { + color: #AFAFAf; +} diff --git a/Main.js b/Main.js new file mode 100644 index 0000000..eb02da9 --- /dev/null +++ b/Main.js @@ -0,0 +1,139 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "Main", + kind: "VFlexBox", + style: "background-color: black", + components: [ + {kind: "ApplicationEvents", onWindowActivated: "windowActivated", onWindowDeactivated: "windowDeactivated"}, + {name: "hacksCarousel", kind: "Carousel", flex: 1, onGetLeft: "getLeft", onGetRight: "getRight", onScroll: "scrolling", onScrollStart: "startScroll", onScrollStop: "stopScroll"}, + //{name: "hacksSelector", kind: "HacksSelector"} + {name: "info", kind: "HFlexBox", className: "info", style: "opacity: 0", showing: false, components: [ + {name: "title"}, + {kind: "Spacer"}, + {name: "notice", className: "notice"} + ]} + ], + hacksList: [ + {name: "Nimbus", kind: "Nimbus", dark: false}, + {name: "Landscape", kind: "Landscape", dark: false}, + {name: "Munch", kind: "Munch", dark: true}, + {name: "Orbit", kind: "Orbit", dark: false}, + {name: "Pixelfade", kind: "Pixelfade", dark: true}, + //{name: "Swarm", kind: "Swarm", dark: false}, // crashy + //{name: "Spinner.CGA", kind: "XSpinnerCGA", dark: true}, // no webfont support + {name: "Spinner", kind: "XSpinner", dark: true} + ], + create: function() { + this.inherited(arguments); + /* + this.index = localStorage.getItem('hack.index'); + if (!this.index) + this.index = 0; + */ + this.index = 0; + this.lastScrollPos = 0; + this.$.hacksCarousel.setCenterView(this.getHack(this.index)); + //this.$.hacksSelector.setHacksList(this.hacksList); + }, + ready: function() { + this.startHack(); + window.addEventListener('resize', this.resizeHack.bind(this), false); + this.setNotice('Swipe for more...'); + this.setTitle(this.hacksList[this.index].name); + }, + setTitle: function(title) { + this.$.title.setContent(title); + this.infoFade(); + }, + setNotice: function(notice) { + this.$.notice.setContent(notice); + this.infoFade(); + }, + infoFade: function() { + this.$.info.setStyle('opacity: 1'); + this.$.info.show(); + + clearTimeout(this.noticeTimer); + this.noticeTimer = setTimeout(function() { + this.$.info.setStyle('opacity: 0'); + setTimeout(function() { + this.$.info.hide(); + this.setNotice(''); + this.setTitle(''); + }.bind(this), 600); + }.bind(this), 5000); + }, + windowActivated: function() { + this.startHack(); + }, + windowDeactivated: function() { + this.stopHack(); + }, + startHack: function(direction) { + var view = this.$.hacksCarousel.fetchView(direction || 'center'); + //enyo.log('starting view ' + view); + if (view) + view.start(); + //localStorage.setItem('hack.index', this.index); + }, + stopHack: function(direction) { + var view = this.$.hacksCarousel.fetchView(direction || 'center'); + //enyo.log('stopping view ' + view); + if (view) + view.stop(); + }, + resizeHack: function() { + var view = this.$.hacksCarousel.fetchView('center'); + + //enyo.log('resizing view ' + view); + if (view) + view.resize(window.innerWidth, window.innerHeight); + }, + hackHidden: function(direction) { + var view = this.$.hacksCarousel.fetchView(direction); + //enyo.log('view ' + view + ' hidden'); + if (view) + view.hidden(); + }, + getHack: function(index) { + return {kind: this.hacksList[index].kind}; + }, + getLeft: function(inSender, inSnap) { + if (inSnap && this.index > 0) { + this.index--; + this.hackHidden('right'); + this.setTitle(this.hacksList[this.index].name); + this.$.info.addRemoveClass('dark', this.hacksList[this.index].dark); + } + if (this.index == 0) + return null; + else + return this.getHack(this.index - 1); + }, + getRight: function(inSender, inSnap) { + if (inSnap && this.index < this.hacksList.length) { + this.index++; + this.hackHidden('left'); + this.setTitle(this.hacksList[this.index].name); + this.$.info.addRemoveClass('dark', this.hacksList[this.index].dark); + } + if (this.index == this.hacksList.length - 1) + return null; + else + return this.getHack(this.index + 1); + }, + scrolling: function(inSender) { + if (inSender.scrollLeft == 0 || inSender.scrollLeft == inSender.getBoundaries().right) + this.startHack(); + //this.$.hacksSelector.index = this.index + ((inSender.scrollLeft - this.lastScrollPos) / window.innerWidth); + //this.$.hacksSelector.draw(); + }, + startScroll: function(inSender) { + this.stopHack(); + }, + stopScroll: function(inSender) { + this.lastScrollPos = this.$.hacksCarousel.scrollLeft; + this.startHack(); + } +}); diff --git a/appinfo.json b/appinfo.json new file mode 100644 index 0000000..7c95063 --- /dev/null +++ b/appinfo.json @@ -0,0 +1,11 @@ +{ + "id": "com.dominionofawesome.hacks", + "version": "1.0.0", + "vendor": "The Dominion of Awesome", + "type": "web", + "main": "index.html", + "title": "Hacks!", + "icon": "icon.png", + "uiRevision": 2, + "dockMode": true +} diff --git a/depends.js b/depends.js new file mode 100644 index 0000000..6e775a3 --- /dev/null +++ b/depends.js @@ -0,0 +1,14 @@ +enyo.depends( + "Main.js", + "Main.css", + //"HacksSelector.js", + "hacks/Hack.js", + "hacks/Nimbus/Nimbus.js", + "hacks/Landscape/Landscape.js", + "hacks/Munch/Munch.js", + "hacks/Orbit/Orbit.js", + "hacks/Pixelfade/Pixelfade.js", + //"hacks/Swarm/Swarm.js", + //"hacks/XSpinnerCGA/XSpinnerCGA.js", + "hacks/XSpinner/XSpinner.js" +); diff --git a/hacks/Hack.js b/hacks/Hack.js new file mode 100644 index 0000000..28cfad7 --- /dev/null +++ b/hacks/Hack.js @@ -0,0 +1,14 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "Hack", + kind: "VFlexBox", + stop: function() { + }, + start: function() { + }, + resize: function() { + }, + hidden: function() { + } +}); diff --git a/hacks/Landscape/Landscape.js b/hacks/Landscape/Landscape.js new file mode 100644 index 0000000..590cb2c --- /dev/null +++ b/hacks/Landscape/Landscape.js @@ -0,0 +1,33 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "Landscape", + kind: "Hack", + style: "background-color: #2ab40f", + components: [ + {name: "clouds", style: "height: 200px; background-image: url(hacks/landscape/clouds.png)"}, + {name: "mountains", style: "height: 200px; background-image: url(hacks/landscape/mountains.png)"}, + {name: "trees", style: "height: 200px; background-image: url(hacks/landscape/trees.png)"} + ], + create: function() { + this.inherited(arguments); + this.n = 0; + }, + start: function() { + if (!this.timer) + this.timer = setInterval(this.draw.bind(this), 33); + }, + stop: function() { + clearInterval(this.timer); + this.timer = null; + }, + draw: function() { + this.n--; + if (this.n == -1600) + this.n = 0; + + this.$.clouds.applyStyle("background-position", (this.n * 1.5) + "px top"); + this.$.mountains.applyStyle("background-position", (this.n * 2.5) + "px top"); + this.$.trees.applyStyle("background-position", (this.n * 7.5) + "px top"); + } +}); diff --git a/hacks/Landscape/clouds.png b/hacks/Landscape/clouds.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7fe857bcc91e63c3f2233f4fd9f445f6112f12 GIT binary patch literal 2501 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 literal 0 HcmV?d00001 diff --git a/hacks/Landscape/mountains.png b/hacks/Landscape/mountains.png new file mode 100644 index 0000000000000000000000000000000000000000..99a5a51cfc20487032f5ceb1a749ba3e91814b47 GIT binary patch literal 1862 zcmb7_X;72b8pi{Hn6M^cF#!=0g1CkdYZweqDU155y1rz4I&DWdos5(y?5sJL%*DJp5J-?=h;4- z(-GlZTPqhU1Oj0j%Hu>K5J(Sj)|n&0didet(_k|@8pUNJ>IT<61qLR9zb_cUk)KweQ&7+0wAV2_9CAyv5tLICJQJ?POmVTWis$NS z{kUV>^du)B=%&+ljZxe@GziF(LNDYfzagx!MUDuh8ZmyYs;Vmxr zTb|vE?wYHAZ%K+RKeuE_Qrv#}fe&TLnOr&4CLR9-E)O@b^V3OLr9^z5txQSkx`QQ} z_2y)<<2fNre2!$vg`CN&8=>-bZZaB0pWqU1~V$=K9ehN>2^~Ll#9sxgNZlsl^ zI*}uJr45~1v}vl_umveqZ?48RDq}qH;)+eyZS4M(__I80(Y1mXU;oap#+_!}l)p5| zY&mRcHk8Kz_edF*l0Y1@Z&VI5DHgr$1#^DifqSxpsQ894qpYvVnS2Vv&_5Ar2B3Ir zS*O??%4UpC(Q73EAd+7-VqYJ3EFzH?#EDQEgVVlVB81U_4`Ye< z?32}NNJKJw?@~g@;;xbBzB~)^j5rq(GQ{oc|G^=%!!@zLT<@;GBareq<(Th`^al5d z1NJO3E_1`yRi%+$2h2j|W$ab&t^Yj9QjWc7Ict5oY?!4jueU*>AW=tO09Cwww)q_F zpG-vA=vPFCw2}-}w6_cHXgA%4P||GtZD$u+-KvUiR-A%&04JEP9&>7UD41{gJYJr= zA0{}IB%j=9c$W|ZVBDIz)aW^gbdVqSmD%O~=U+Tn2&bjE9W%)#urHA7=#`0vk!1_P z@F@Y%E8!=YJ{nX0yYX(%18+j3-MXQw(Y_GQ9-y!4pSu&Z7{r2-L-^HMKCU=Z_$&0* z#ATqDONhR;`t~%=Eipv6)YmV%FHk$|b57}O+WaO9D>Ee(new`ou^0gKD3jhEXNpgN zVmg-pbbW=z{iSOh6w=WnP*>@@C-(sTTG>MoDyihD=+~Zay{~NLKLDX#;fSVEQE+)8B^Z#JW|3be8G_sApsxmOE8)*AM^QvK8>nR)LC}2k!p!NpP`&gnZ79^yB z-tUhnylGAGk+n>Qr zwrsfgNWcJQMN{F{DKSAbrxdkX%Le6Fe%UPg^rqc7UpcI6Cy;VE*iHAdOC6RnL*IPD zG%<8YY2fuU(O^hZo&$wpF3MPaQ_S2?-+N%Lb5~W3W0$dt@iFkIJU3H1b1)b*w4VAe zujN@Ky;hkUDNQ@5zR~e?UF0`FS)4jBdM01!RP!=DfJvgJ3hAn!j;a#~_=#=r{4NIW z&ctjSy4!q*YJ=&LpBVDLz$vQ;{<-N zDYjsk^l7My*$_zR3Yg>Ofp6v$Hb29nKUR&6AD<%s;~GJAa^j z=FDp|U&_Sns70zg=;lT8E!wkTI-ijN3MrB|I{mQ6YqWj?iG7$==QgSlH@y(ub@e|I zq;&+w3d^4_m=ttmWjw-X-Qwnb46piF`caby7`UQK(u7c$sQB&tx9HFa-H#M)LD;$K z-fPBZ?rj?Jd;hmoN-*iQM(8gsmh5{}^q3jt990-rVvo^igm0xM&zO!uNrqr%zI}f- zPCAaHCR$LIv^)g@6O{bQiku(@Q(WT&P~B0_`1Id$x${C@++utEj^ literal 0 HcmV?d00001 diff --git a/hacks/Landscape/trees.png b/hacks/Landscape/trees.png new file mode 100644 index 0000000000000000000000000000000000000000..c395192554742b9011403b7df7a8c6aa8cbbf544 GIT binary patch literal 4923 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 0.3) { + this.drops[this.drop_c].start(this.w, this.h, this.perspective); + this.drop_c = (this.drop_c + 1) % 100; + } + var now = (new Date()).getTime(); + this.ctx.fillRect(0, 0, this.w, this.h); + this.ctx.save(); + this.ctx.scale(1.0, this.perspective); + for (var i = 0; i < this.drops.length; i++) + if (this.drops[i].live) + this.drops[i].draw(this.ctx, now); + this.ctx.restore(); + } +}); diff --git a/hacks/Orbit/Orbit.js b/hacks/Orbit/Orbit.js new file mode 100644 index 0000000..0bc7fac --- /dev/null +++ b/hacks/Orbit/Orbit.js @@ -0,0 +1,65 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "Orbit", + kind: "Hack", + pack: "center", + align: "center", + style: "background-color: lightgray", + components: [ + {kind: "Control", nodeTag: "canvas", name: "canvas", width: "250px", height: "250px"} + ], + rendered: function() { + var canvas = this.$.canvas.hasNode(); + canvas.width = 250; + canvas.height = 250; + this.context = canvas.getContext('2d'); + + this.center_x = canvas.width / 2; + this.center_y = canvas.height / 2; + this.radius = 100; + this.zr = 0; + this.xr = 0; + + this.chromeball = new Image(); + this.chromeball.onload = this.setReady.bind(this); + this.chromeball.src = "hacks/orbit/chrome_ball.png"; + }, + setReady: function() { + this.ready = true; + this.engine(); + }, + start: function() { + if (this.ready && !this.timer) + this.timer = setInterval(this.engine.bind(this), 20); + }, + stop: function() { + clearInterval(this.timer); + this.timer = null; + }, + engine: function() { + this.context.clearRect(this.center_x - this.radius - 25, this.center_y - this.radius - 25, this.radius * 2 + 50, this.radius * 2 + 50); + this.zr += 0.1; + this.xr += 0.05; + var objects = []; + for (var i = 0; i < 8; i++) { + var czr = this.zr + i * Math.PI/4; + var cxr = this.xr + Math.PI + i * Math.PI/4; + var cx = this.center_x + this.radius * Math.sin(czr); + var cy = this.center_y + this.radius * Math.cos(czr) * Math.cos(this.xr); + var r = 20 + 10 * Math.cos(czr) * Math.cos(this.xr + Math.PI/2); + + objects.push({ + x: cx - r, + y: cy - r, + s: r * 2 + }); + } + // Sort by size to simulate z-ordering + objects.sort(function(a,b) { + return a.s - b.s; + }); + for (var i = 0; i < 8; i++) + this.context.drawImage(this.chromeball, objects[i].x, objects[i].y, objects[i].s, objects[i].s); + } +}); diff --git a/hacks/Orbit/chrome_ball.png b/hacks/Orbit/chrome_ball.png new file mode 100644 index 0000000000000000000000000000000000000000..6614330e9070798c8c193603e341aa44dbe8b15d GIT binary patch literal 5331 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 literal 0 HcmV?d00001 diff --git a/hacks/Pixelfade/Pixelfade.js b/hacks/Pixelfade/Pixelfade.js new file mode 100644 index 0000000..b91d5d2 --- /dev/null +++ b/hacks/Pixelfade/Pixelfade.js @@ -0,0 +1,148 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "Pixelfade", + kind: "Hack", + style: "background-color: yellow; background-position: center center", + components: [ + {name: "canvas", nodeTag: "canvas", onclick: "canvasClick"}, + {name: "wallpaperService", kind: "PalmService", + service: 'palm://com.palm.systemservice', + method: 'getPreferences', + onSuccess: "gotWallpaper"} + ], + create: function() { + this.inherited(arguments); + this.$.wallpaperService.call({ + keys: ['wallpaper'], + subscribe: false + }); + }, + rendered: function() { + this.canvas = this.$.canvas.hasNode(); + this.context = this.canvas.getContext('2d'); + this.resize(window.innerWidth, window.innerHeight); + this.context.fillRect(0, 0, this.canvas.width, this.canvas.height); + + this.faders = []; + for (var i = 0; i < 10; i++) { + var img = new Image(); + img.src = "hacks/Pixelfade/pixelfade" + i + ".gif"; + this.faders.push(img); + } + }, + start: function() { + this.resize(window.innerWidth, window.innerHeight); + + if (this.timer) + clearInterval(this.timer); + this.fade_val = 9; + this.fade_dir = -1; + this.fade_end = -1; + this.timer = setInterval(this.fade_all.bind(this), 50); + + if (!this.spotTimer) + this.spotTimer = setInterval(this.do_fade_spot.bind(this), 3000); + }, + stop: function() { + clearInterval(this.timer); + this.timer = null; + clearInterval(this.spotTimer); + this.spotTimer = null; + clearTimeout(this.fadeInTimer); + this.fadeInTimer = null; + }, + resize: function(w, h) { + this.canvas.style.width = w + 'px'; + this.canvas.style.height = h + 'px'; + this.canvas.width = w; + this.canvas.height = h; + this.context.fillColor = 'black'; + this.context.fillRect(0, 0, w, h); + }, + hidden: function() { + this.context.fillRect(0, 0, this.canvas.width, this.canvas.height); + }, + canvasClick: function(inSender, inEvent) { + clearTimeout(this.fadeInTimer); + clearInterval(this.spotTimer); + this.spotTimer = setInterval(this.do_fade_spot.bind(this), 3000); + this.fader_go(inEvent.clientX, inEvent.clientY); + }, + gotWallpaper: function(inSender, inResponse) { + enyo.log("got background: " + JSON.stringify(inResponse)); + this.setStyle('background-image: url(' + inResponse.wallpaper.wallpaperFile + '); background-alignment: center center'); + }, + do_fade_spot: function() { + var x = Math.floor(Math.random() * this.canvas.width); + var y = Math.floor(Math.random() * this.canvas.height); + this.fader_go(x, y); + }, + fade_all: function() { + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); + if (this.fade_val == this.fade_end) { + clearInterval(this.timer); + this.timer = null; + if (this.fade_dir == -1) + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); + else + this.context.fillRect(0, 0, this.canvas.width, this.canvas.height); + } else { + for (var x = 0; x < this.canvas.width; x += 64) { + for (var y = 0; y < this.canvas.height; y += 64) { + this.context.drawImage(this.faders[this.fade_val], x, y); + } + } + } + this.fade_val += this.fade_dir; + }, + fader_go: function(x, y) { + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.fader_count = 0; + this.time_faders(x, y); + this.faderptr = new Array(10); + for (var i=0; i < 10; i++) + this.faderptr[i] = 0; + this.t0 = (new Date()).getTime(); + this.faderRunning = true; + clearInterval(this.timer); + this.timer = setInterval(this.fader.bind(this), 50); + }, + time_faders: function(xpos, ypos) { + this.fadertimes = []; + for (var y = 0; y < this.canvas.height; y += 64) { + for (var x = 0; x < this.canvas.width; x += 64) { + var xd = x - xpos; + var yd = y - ypos; + this.fadertimes.push({ + t: 125 - Math.sqrt(xd*xd + yd*yd) / 8, + x: x, + y: y + }); + } + } + this.fadertimes.sort(function(a, b) { return a.t - b.t }); + }, + fader: function() { + var tnow = (new Date()).getTime(); + var td = (tnow - this.t0) / 8.0; + for (var i = 0; i < 10; i++) { + while (this.faderptr[i] < this.fadertimes.length && this.fadertimes[this.faderptr[i]].t < td - i * 10) { + var xpos = this.fadertimes[this.faderptr[i]].x; + var ypos = this.fadertimes[this.faderptr[i]].y; + this.context.clearRect(xpos, ypos, 64, 64); + this.context.drawImage(this.faders[i], xpos, ypos); + this.faderptr[i]++; + } + } + if (this.faderptr[9] >= this.fadertimes.length) { + clearTimeout(this.timer); + this.fadeInTimer = setTimeout(function() { + this.fade_val = 9; + this.fade_dir = -1; + this.fade_end = -1; + this.timer = setInterval(this.fade_all.bind(this), 50); + }.bind(this), 750); + } + } +}); diff --git a/hacks/Pixelfade/pixelfade0.gif b/hacks/Pixelfade/pixelfade0.gif new file mode 100644 index 0000000000000000000000000000000000000000..552170055c96a1bf83ee40ca1012df7618e8120d GIT binary patch literal 206 zcmV;<05ShZNk%w1VL$*t0Pp|+0002Y%*-MA1OWg50RSuj0000$06+i$0;L3kX{pDt zUSzX9=xDZbqxyN+1&-H=rs~SJ?hD8AOxN~}=lZUfzW5^nhr(jVs6ld)yr%OBjY_A~ zs3n_zoxGEicYK7?6&(|CI`o7dDa}S>+}2){0|r?I7qlNhj(Zf)_12! z$5f@I!an<>WKKcnY!rNs(KnLJ4<`z%BgzGiu<})`wJW_ I>{0*#JG@b0+5i9m literal 0 HcmV?d00001 diff --git a/hacks/Pixelfade/pixelfade1.gif b/hacks/Pixelfade/pixelfade1.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4dda0e16b827b933d0f42818ab01eb3fd177eb5 GIT binary patch literal 250 zcmV-Smr-H!(-DECL0$A_4RG)Tu7 z_88Y_s7P6f;ur}zr&%aTX9*hW$r)&fxtW)hx8H;PGJBvzY`@5CP z`${VdI|-buCVV_>TpX(`O~een+l-Aiy?s>OOZ@#D4#-{3;tifIu8wZ*-ckSnJA=D( A!2kdN literal 0 HcmV?d00001 diff --git a/hacks/Pixelfade/pixelfade2.gif b/hacks/Pixelfade/pixelfade2.gif new file mode 100644 index 0000000000000000000000000000000000000000..20ef3ed3727b5792167f950c3c09673387563348 GIT binary patch literal 221 zcmV<303!cKNk%w1VL$*t0Pp|+0002Y%*-MA1OWg50RSuj0000$06+i$0<;7YhML#w zn2Z$Khv(I~_U&;TLYC%}3-R+a`tKK5=fGEJ7$b<62sns$ z_y|d|IN8Xk=o6V4NqO06`I)6Ds>cahS*kXwN_yJriCVcTdj`5BaHsEK;2dYLvV>iG)lI@@K+x@wz?8VdKO+zZ^y{47~pjC?$8eaai{tPQ=mJeFJ?PEBs(y?x$I%FUiG{$4(Q-I48X zzkXkjpA-*2-|r;fFLn9~4)iB4A;M|~zX^1>PoF}7|0;%ih%Vwm7mNg3O|-a>B94X` RNp^(TUQT0XQSr~cib+=-s$=N5)a51n6p>tC)k8&ICvP- z_{bO-sR&8ANI7|#S$P@P$qDMUIf_~KNqYK)8d`dk`pP=AI@_uPOM7dA8_Nrk``e4L RJ6!7<3`|RmT-;Cq06R*BWjg=> literal 0 HcmV?d00001 diff --git a/hacks/Pixelfade/pixelfade5.gif b/hacks/Pixelfade/pixelfade5.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7f2eed1b292fd0191d08a2d798a5901e40ac56e GIT binary patch literal 319 zcmV-F0l@x8Nk%w1VL$*t0Pp|+0002Y%*-MA1OWg50RSuj0000$06+i$0{(;%ahGfD z;F3&5J8^YLKi_fGCxR4&S}7T}tE`5BaHsEK;2dYLvV>iG)lI@@K+x@wz?8VdKO+zZ^y{47~pjC?$8eaai{tPQ=mJeFJ?PEBs(y?x$I%FUiG{$4(Q-I48X zzkXkjpA-*2-|r;fFLn9~4)iB4A;M|~zX^1>PoF}7|0;%ih%Vwm7mNg3O|-a>B94X` RNp^(T}3-R+a`tKK5=fGEJ7$b<62sns$ z_y|d|IN8Xk=o6V4NqO06`I)6Ds>cahS*kXwN_yJriCVcTdj-Smr-H!(-DECL0$A_4RG)Tu7 z_88Y_s7P6f;ur}zr&%aTX9*hW$r)&fxtW)hx8H;PGJBvzY`@5CP z`${VdI|-buCVV_>TpX(`O~een+l-Aiy?s>OOZ@#D4#-{3;tifIu8wZ*-ckSnJBe^} A$N&HU literal 0 HcmV?d00001 diff --git a/hacks/Pixelfade/pixelfade8.gif b/hacks/Pixelfade/pixelfade8.gif new file mode 100644 index 0000000000000000000000000000000000000000..93cef7616aa0f0faa0c2e3042eb9dcd7f477fa37 GIT binary patch literal 206 zcmV;<05ShZNk%w1VL$*t0Pp|+0002Y%*-MA1OWg50RSuj0000$06+i$0;NoVX{pDs zUSzX9=xDZbqxyN+1&-H=rs~SJ?hD8AOxN~}=lZUfzW5^nhr(jVs6ld)yr%OBjY_A~ zs3n_zoxGEicYK7?6&(|CI`o7dDa}S>+}2){0|r?I7qlNhj(Zf)_12! z$5f@I!an<>WKKcnY!rNs(KnLJ4<`z%BgzGiu<})`wJW_ I>{0*#JLy|u9{>OV literal 0 HcmV?d00001 diff --git a/hacks/Pixelfade/pixelfade9.gif b/hacks/Pixelfade/pixelfade9.gif new file mode 100644 index 0000000000000000000000000000000000000000..f72f9f9cb11090e010a3b1ad42127dd6c1609228 GIT binary patch literal 110 zcmZ?wbhEHbbYO5`_`m=HXU?2a{K>+|z`)3$1LA{Z7?@mJ`d6NQ%fEQemRsGM@9p`` z-}cC3+Oy7OuTE`y$9?>h&-HJ;&wri!{*RxBtNqBLj~zZ*)6XpX%-QR;{K~4YU1zhl M-&rRfz`$S)04;7Z9smFU literal 0 HcmV?d00001 diff --git a/hacks/Swarm/Swarm.js b/hacks/Swarm/Swarm.js new file mode 100644 index 0000000..cfe7f32 --- /dev/null +++ b/hacks/Swarm/Swarm.js @@ -0,0 +1,137 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "Pixel", + constructor: function(canvas) { + this.x = Math.random() * canvas.width; + this.y = Math.random() * canvas.height; + this.vx = Math.random() * 20.0 - 10.0; + this.vy = Math.random() * 20.0 - 10.0; + this.lastupdate = (new Date()).getTime(); + }, + accel: function(x, y) { + this.vx += x; + if (this.vx > 200.0) + this.vx = 200.0; + else if (this.vx < -200.0) + this.vx = -200.0; + this.vy += y; + if (this.vy > 200.0) + this.vy = 200.0; + else if (this.vy < -200.0) + this.vy = -200.0; + }, + update: function() { + var now = (new Date()).getTime(); + var dt = (now - this.lastupdate) / 75.0; + this.x += this.vx * dt; + this.y += this.vy * dt; + this.lastupdate = now; + }, + draw: function(ctx) { + ctx.beginPath(); + ctx.moveTo(this.x,this.y); + ctx.lineTo(this.x - this.vx / 4.0, this.y - this.vy / 4.0); + ctx.stroke(); + ctx.closePath(); + } +}); + +enyo.kind({ + name: "Swarm", + kind: "Hack", + align: "stretch", + pack: "stretch", + components: [ + {name: "canvas", nodeTag: "canvas", style: "background-color: gray", + onmousemove: "mouseMove", onmousedown: "mouseDown"} + ], + npixels: 100, + pixels: [], + rendered: function() { + this.canvas = this.$.canvas.hasNode(); + this.resize(); + this.mx = this.canvas.width / 2; + this.my = this.canvas.width / 2; + for (var x = 0; x < this.npixels; x++) + this.pixels.push(new Pixel(this.canvas)); + //this.stopTime = (new Date()).getTime(); + this.engine(); + }, + start: function() { + if (this.stopTime) { + var delta = (new Date()).getTime() - this.stopTime; + for (var i = 0; i < this.npixels; i++) + this.pixels[i].lastupdate += delta; + this.stopTime = null; + } + if (!this.timer) + this.timer = setInterval(this.engine.bind(this), 20); + }, + stop: function() { + this.stopTime = (new Date()).getTime(); + clearInterval(this.timer); + this.timer = null; + }, + resize: function(w, h) { + this.canvas.width = w; + this.canvas.height = h; + //this.canvas.style.width = w + 'px'; + //this.canvas.style.height = h + 'px'; + this.context = this.canvas.getContext('2d'); + this.context.strokeStyle = '#000000'; + this.context.lineCap = 'round'; + this.context.lineWidth = 1.5; + }, + mouseMove: function(inSender, inEvent) { + this.mx = inEvent.clientX; + this.my = inEvent.clientY; + }, + mouseDown: function(inSender, inEvent) { + this.mouseMove(inSender, inEvent); + // Apply force to each pixel outwards from the mouse + for (var i = 0; i < this.npixels; i++) { + // Get the direction + var dx = this.pixels[i].x - inEvent.clientX; + var dy = this.pixels[i].y - inEvent.clientY; + var mag = Math.sqrt(dx*dx + dy*dy); + dx /= mag; + dy /= mag; + + // Apply force. + this.pixels[i].accel(dx * 40.0, dy * 40.0); + } + }, + engine: function() { + // Clear the canvas + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); + // Update all pixel objects + for (var i = 0; i < this.npixels; i++) { + // Get distance + var dx = this.mx - this.pixels[i].x; + var dy = this.my - this.pixels[i].y; + var d = Math.sqrt(dx*dx + dy*dy); + + // Apply acceleration to pixels towards the mouse cursor + var ax = dx / 50.0; + var ay = dy / 50.0; + + // Apply a drag proportional to the distance from the cursor + if (d > 100.0) { + ax += -this.pixels[i].vx * (d - 100.0) / 2000.0; + ay += -this.pixels[i].vy * (d - 100.0) / 2000.0; + } + + // And a "chaotic" acceleration inversely proportional + // to the distance from the cursor + ax += (Math.random() * 160.0 - 80.0) / d; + ay += (Math.random() * 160.0 - 80.0) / d; + + this.pixels[i].accel(ax,ay); + this.pixels[i].update(); + this.pixels[i].draw(this.context); + } + + this.context.strokeRect(this.mx - 10, this.my - 10, 20, 20); + } +}); diff --git a/hacks/XSpinner/XSpinner.js b/hacks/XSpinner/XSpinner.js new file mode 100644 index 0000000..9fd0a33 --- /dev/null +++ b/hacks/XSpinner/XSpinner.js @@ -0,0 +1,80 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "XSpinner", + kind: "Hack", + style: "background-color: black; color: #00FF00; font-family: Courier, sans-serif; font-size: 12px", + pack: "center", + align: "center", + components: [ + {style: "border: 2px solid green; padding: 4px", components: [ + {name: "terminal", nodeTag: "pre", style: "margin: 0"}, + {nodeTag: "pre", style: "margin: 0", +content: "SESSION 1 80x24 CAPS NUM SCR RAVE"} + ]} + ], + create: function() { + this.inherited(arguments); + this.w = 80; + this.h = 24; + this.delay = 20; + this.rate = 360.0 / 1000.0; + this.cw = this.w / 2; + this.ch = this.h / 2; + }, + rendered: function() { + this.terminal = this.$.terminal.hasNode(); + this.blinker = document.getElementById('spinner_blinker'); + this.blink_active = true; + this.spinner(); + }, + start: function() { + if (!this.timer) { + this.timer = setInterval(this.spinner.bind(this), this.delay); + this.blinkerTimer = setInterval(this.blink.bind(this), 500); + } + }, + stop: function() { + clearInterval(this.timer); + clearInterval(this.blinkerTimer); + this.timer = null; + this.blinkerTimer = null; + }, + spinner: function() { + // Get date + var ms = (new Date()).getMilliseconds(); + var r = ms * this.rate; + var a = Math.tan((r / 180.0) * Math.PI); + var b = Math.tan(((r+90) / 180.0) * Math.PI); + + var t = ''; + for (var j=0; j < this.h; j++) { + for (var i=0; i < this.w; i++) { + if ((r > 90 && r <= 180) || (r > 270 && r < 360) || r == 0) { + if ((j-this.ch) * 2 > a * (i-this.cw) && (j-this.ch) * 2 < b * (i-this.cw) || + (j-this.ch) * 2 < a * (i-this.cw) && (j-this.ch) * 2 > b * (i-this.cw) ) { + t += '*'; + } else { + t += ' '; + } + } else { + if ((j-this.ch) * 2 > a * (i-this.cw) && (j-this.ch) * 2 > b * (i-this.cw) || + (j-this.ch) * 2 < a * (i-this.cw) && (j-this.ch) * 2 < b * (i-this.cw) ) { + t += '*'; + } else { + t += ' '; + } + } + } + t += "\n"; + } + this.terminal.innerHTML = t; + }, + blink: function() { + if (this.blink_active) + this.blinker.style.color = '#00FF00'; + else + this.blinker.style.color = 'black'; + this.blink_active = !this.blink_active; + } +}); diff --git a/hacks/XSpinnerCGA/XSpinnerCGA.js b/hacks/XSpinnerCGA/XSpinnerCGA.js new file mode 100644 index 0000000..9ff7634 --- /dev/null +++ b/hacks/XSpinnerCGA/XSpinnerCGA.js @@ -0,0 +1,78 @@ +/* Copyright 2011 The Dominion of Awesome + * See COPYING for licensing information */ +enyo.kind({ + name: "XSpinnerCGA", + kind: "Hack", + style: "background-color: black", + pack: "center", + align: "center", + components: [ + {style: "border: 2px solid green; padding: 4px", components: [ + {name: "terminal", nodeTag: "pre", style: "margin: 0; font-family: PCSenior; font-size: 16px"} + ]} + ], + create: function() { + this.inherited(arguments); + this.w = 40; + this.h = 24; + this.delay = 20; + this.rate = 360.0 / 1000.0; + this.cw = this.w / 2; + this.ch = this.h / 2; + }, + rendered: function() { + this.terminal = this.$.terminal.hasNode(); + this.blinker = document.getElementById('spinner_blinker'); + this.blink_active = true; + this.spinner(); + }, + start: function() { + if (!this.timer) { + this.timer = setInterval(this.spinner.bind(this), this.delay); + this.blinkerTimer = setInterval(this.blink.bind(this), 500); + } + }, + stop: function() { + clearInterval(this.timer); + clearInterval(this.blinkerTimer); + this.timer = null; + this.blinkerTimer = null; + }, + spinner: function() { + // Get date + var ms = (new Date()).getMilliseconds(); + var r = ms * this.rate; + var a = Math.tan((r / 180.0) * Math.PI); + var b = Math.tan(((r+90) / 180.0) * Math.PI); + + var t = ''; + for (var j=0; j < this.h; j++) { + for (var i=0; i < this.w; i++) { + if ((r > 90 && r <= 180) || (r > 270 && r < 360) || r == 0) { + if ((j-this.ch) * 2 > a * (i-this.cw) && (j-this.ch) * 2 < b * (i-this.cw) || + (j-this.ch) * 2 < a * (i-this.cw) && (j-this.ch) * 2 > b * (i-this.cw) ) { + t += '*'; + } else { + t += ' '; + } + } else { + if ((j-this.ch) * 2 > a * (i-this.cw) && (j-this.ch) * 2 > b * (i-this.cw) || + (j-this.ch) * 2 < a * (i-this.cw) && (j-this.ch) * 2 < b * (i-this.cw) ) { + t += '*'; + } else { + t += ' '; + } + } + } + t += "\n"; + } + this.terminal.innerHTML = t; + }, + blink: function() { + if (this.blink_active) + this.blinker.style.color = '#00FF00'; + else + this.blinker.style.color = 'black'; + this.blink_active = !this.blink_active; + } +}); diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d77e60a92b1777e1dc0f1a160ebb23970d753a GIT binary patch literal 1390 zcmW+y3pA7o7`-!wnOJ68LWO_ykk(eRdloB?87vyLNDs-b9tf3f(@SfH?2>nnS+&|S z*`$t53WpqzVX)iuV2aXO!>By+2+UH3Q%i zzzARfp8_VpBES?d1I&TNz!G37U;$VHRsaDo0c&6xupC$ctORU;Re&w<8DIyj0oDQb zfCKOa@Fm~~I04SU*MJMK0dNJ}0QZkyumCpT1!(<#1NZ>GfFH0C-~gL|03Z<90t5qF zfo(t-@E!0yuou_|L;$fs9Pk5h7>Eas0>^;kz-b@_NCnOS89*kG1>^v^z**oN@GI~e zkPireYd|6J2XGxI0?L63pb`)QjX)Fd4Cny*02$B^yaKerj|1;uwAxJ@r_NnJFIMml zQDWpt$c6j>jLOq?}LOr{$I;{6(?bSWFFk|^SCs|uupN-hC+K8hJ zk}96pjFvkVw79;uyhd)EOlKI&X7|N}@sH6R6z^lb>+UpvK9R=sb?7S|zQuTGbAr`n z65)J#wfcVGp-v)q4Wo92Y{66Y`c%VBt8}>`=Ud|IFFm+bmBDTfWuCqM7l*2oOmlfm zd(d1J=3E!{D2mrxB7PI~LN4~93F-^y^Rgpr$-b9jK5;MTD4Kne<^P zEjLmqg5kUH&Zbn#j|4`>jMtuZappI7vV8i7S#|e+WF@7qw%M7eDPEYNpCyruES-@> zONMtYDiU4TB|8AJf8qRvdX|*-KZ$;X^`+rE>Ae@ zj?Bw$tyUC8u*y7>vM;JHmZ%)ZJntEhJ7yY!#~PvuQx|Jtjzr_|mS^5eE!82LtM2?+ z9ixhxObqX~7D_mpv=SBll~UNn^a#^z>Fl*W{Z6!RDaFa|b z74$q)+N~OOoc=)K{^WoWjUqadcbv0}v-0HHrk`zEQ@G;o-Bi`ygXNXSB0`=8h*Pcxy|Ppz#Tpfd#2391!&nym(DZbI!i>q#L`6EaoY1eInV{9nXF|_69 Lz1gdj9e(;hwn8g4 literal 0 HcmV?d00001 diff --git a/icon_48.png b/icon_48.png new file mode 100644 index 0000000000000000000000000000000000000000..6a77b6a10fb871a950990286f18484ef1f2bfb40 GIT binary patch literal 1103 zcmW-d4NwyV9L0Z|s6#*y!B3=__<=J;lt9sKz$Q#Y2Leku*H9=+Cy?L=IL9G&I&|O% zrbeNNcNys_MeiVVM1XmjaO8QSfq>LOGw`Fyfl8})_y50l|NGy&ckiHjb)?&vDPsUP zRg@ym!2$n`XoO?y9y(V#NU%LFGMr1l`t&&T7WJxlrQ?VIgy48{f{`!^MuP~P!Qtit zt}qrnz!SW{8z#U+m;{qy3QPqbmETCZHK01SsT;^`up=t zzsyfHi4tN@p84GB)LrkX9vJvb@2ta(_gK($i63x;eO(quExC&oCVEU>-XHr$@n^`>Un=iTbA$RTla!*D@6nO_GC>{ zV&=prn?l2r?)rGh%M6oT^-A|9X;)xt??zu?xnYivUTJQU)|GCqSQP4HD>EDjx>B4r z^-0T(uq5xT9@dN=zlgN@gE6JimZ@$-UsPxJl*q1x%k2X{#23GAu70Q}5%(wpYwoNQ zKib?`C>}ib%oG%1J!LD*eRWWxT{ufr^!kW>a*;_>K2A7)_M2TwW2Z@zFA$zSTya5m zyfY!*UGTBd)1*o6ACc889dDFMwEN{c@v7JUGrcVV9w!Iu{w(;YULq51J!eQU4j76x z=_CD&>njU3b_CP~dW}1r|1Hl}F3sN8oO1O&y?u9MS&PK@A~$XK&)?~;-Cj5EgJaF& zcCVT-x>{pzLWEs^LaVyoqrETL+xbBKvRCWv*FM-}sJW`qbm!TUMhn}P_1!hwl3awY zt=bqvMMSQuMN*vR(QmiZcpCO``Krd0=AkpRNzNKH<8zAl=PuD(-gVv>-J38<_&8?D zf}D|p=W2^s7uH=^rSWnKneS~}T$9I#YoA88NcxArdKLR}u29gnE~j$o7E7MoA{@S^ c2_H(eykYSKe{=qmd!ONeO1WBbDO{KLFSCGq0ssI2 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..95db2f1 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + +Hacks! + + + + + + -- 2.25.1