<html xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml" xmlns:website="http://ogp.me/ns/website" lang="en" itemscope="" itemtype="http://schema.org/WebPage" id="not-found">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width" />
    <title>404 Not Found — James Black</title>
    <style media="screen">
    @import url(http://fonts.googleapis.com/css?family=Inconsolata:400);
@import url(http://fonts.googleapis.com/css?family=Karla:400);
@import url(http://fonts.googleapis.com/css?family=Inconsolata:400);
/* line 1, ../../_sass/_reset.scss */
html, body, body div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, figure, footer, header, menu, nav, section, time, mark, audio, video, details, summary {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}

/* consider resetting the default cursor: https://gist.github.com/murtaugh/5247154 */
/* line 12, ../../_sass/_reset.scss */
article, aside, figure, footer, header, nav, section, details, summary {
display: block;
}

/* Responsive images and other embedded objects
 Note: keeping IMG here will cause problems if you're using foreground images as sprites.
 If this default setting for images is causing issues, you might want to replace it with a .responsive class instead. */
/* line 17, ../../_sass/_reset.scss */
img,
object,
embed {
max-width: 100%;
}

/* force a vertical scrollbar to prevent a jumpy page */
/* line 22, ../../_sass/_reset.scss */
html {
overflow-y: scroll;
}

/* we use a lot of ULs that aren't bulleted. 
don't forget to restore the bullets within content. */
/* line 26, ../../_sass/_reset.scss */
ul {
list-style: none;
}

/* line 28, ../../_sass/_reset.scss */
blockquote, q {
quotes: none;
}

/* line 30, ../../_sass/_reset.scss */
blockquote:before,
blockquote:after,
q:before,
q:after {
content: '';
content: none;
}

/* line 35, ../../_sass/_reset.scss */
a {
margin: 0;
padding: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}

/* line 37, ../../_sass/_reset.scss */
del {
text-decoration: line-through;
}

/* line 39, ../../_sass/_reset.scss */
abbr[title], dfn[title] {
border-bottom: 1px dotted #000;
cursor: help;
}

#not-found, #not-found body {
display: table;
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}

#not-found body {
position: relative;
background-color: #1d2b2a;
background-image: url(/assets/img/404-stripe.png), url(/assets/img/404-noise.png);
background-repeat: repeat-x, repeat;
background-position: 0 0%;
background-attachment: fixed;
font-size: 21px;
font-family: Inconsolata, "Lucida Console", Monaco, Courier, monospace;
font-smooth: never;
line-height: 2em;
color: #d4f8e3;
-webkit-font-smoothing: none;
text-shadow: -2px 0 0px rgba(0, 0, 225, 0.4), -1px 0 3px rgba(103, 171, 236, 0.6), 1px 0 4px rgba(69, 112, 204, 0.5);
-moz-animation: blink 0.1s steps(2, start) infinite, skip 7s linear infinite, flicker 0.1s steps(2, start) infinite;
-webkit-animation: blink 0.1s steps(2, start) infinite, skip 7s linear infinite, flicker 0.1s steps(2, start) infinite;
animation: blink 0.1s steps(2, start) infinite, skip 7s linear infinite, flicker 0.1s steps(2, start) infinite;
}
#not-found body #holder {
display: table-cell;
vertical-align: bottom;
max-width: 800px;
margin: 0 auto;
}
#not-found body #story {
padding: 10px;
max-width: 100%;
display: block;
white-space: pre;
line-height: 1.25em;
}
#not-found body #story:after {
visibility: visible;
content: '';
background-color: #d4f8e3;
display: inline-block;
position: relative;
width: 0.5em;
height: 1em;
top: 5px;
margin-left: 0;
-moz-box-shadow: -2px 0 0px rgba(0, 0, 225, 0.4), -1px 0 3px rgba(103, 171, 236, 0.6), 1px 0 4px rgba(69, 112, 204, 0.5);
-webkit-box-shadow: -2px 0 0px rgba(0, 0, 225, 0.4), -1px 0 3px rgba(103, 171, 236, 0.6), 1px 0 4px rgba(69, 112, 204, 0.5);
box-shadow: -2px 0 0px rgba(0, 0, 225, 0.4), -1px 0 3px rgba(103, 171, 236, 0.6), 1px 0 4px rgba(69, 112, 204, 0.5);
-moz-animation: flicker 0.1s steps(2, start) infinite, ready 1s steps(2, start) 25s infinite;
-webkit-animation: flicker 0.1s steps(2, start) infinite, ready 1s steps(2, start) 25s infinite;
animation: flicker 0.1s steps(2, start) infinite, ready 1s steps(2, start) 25s infinite;
}
#not-found body #kick {
text-shadow: none;
margin: 10px;
}
#not-found body #kick a {
background-color: #d4f8e3;
color: #1d2b2a;
}
#not-found body .typed-cursor {
  display: none;
}
  @-moz-keyframes blink {
  to {
    background-color: #223332;
  }
}
  @-webkit-keyframes blink {
  to {
    background-color: #223332;
  }
}
  @keyframes blink {
  to {
    background-color: #223332;
  }
}
  @-moz-keyframes skip {
  to {
    background-position: 0 100%;
  }
}
  @-webkit-keyframes skip {
  to {
    background-position: 0 100%;
  }
}
  @keyframes skip {
  to {
    background-position: 0 100%;
  }
}
  @-moz-keyframes flicker {
  to {
    color: #bddeca;
  }
}
  @-webkit-keyframes flicker {
  to {
    color: #bddeca;
  }
}
  @keyframes flicker {
  to {
    color: #bddeca;
  }
}
  @-moz-keyframes ready {
  to {
    visibility: hidden;
  }
}
  @-webkit-keyframes ready {
  to {
    visibility: hidden;
  }
}
  @keyframes ready {
  to {
    visibility: hidden;
  }
}
@media screen and (max-width: 400px) {
  #not-found body {
    font-size: 18px;
  }
}
    </style>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script type="text/javascript">
    
    // The MIT License (MIT)

// Typed.js | Copyright (c) 2014 Matt Boldt | www.mattboldt.com

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.




!function($){

    "use strict";

    var Typed = function(el, options){

        // chosen element to manipulate text
        this.el = $(el);
        // options
        this.options = $.extend({}, $.fn.typed.defaults, options);

        // text content of element
        this.text = this.el.text();

        // typing speed
        this.typeSpeed = this.options.typeSpeed;

        // add a delay before typing starts
        this.startDelay = this.options.startDelay;

        // backspacing speed
        this.backSpeed = this.options.backSpeed;

        // amount of time to wait before backspacing
        this.backDelay = this.options.backDelay;

        // input strings of text
        this.strings = this.options.strings;

        // character number position of current string
        this.strPos = 0;

        // current array position
        this.arrayPos = 0;
        
        // number to stop backspacing on.
        // default 0, can change depending on how many chars
        // you want to remove at the time
        this.stopNum = 0;

        // Looping logic
        this.loop = this.options.loop;
        this.loopCount = this.options.loopCount;
        this.curLoop = 0;
        
        // for stopping
        this.stop = false;

        // All systems go!
        this.build();
    };

        Typed.prototype =  {

            constructor: Typed

            , init: function(){
                // begin the loop w/ first current string (global self.string)
                // current string will be passed as an argument each time after this
                var self = this;
                self.timeout = setTimeout(function() {
                    // Start typing
                    self.typewrite(self.strings[self.arrayPos], self.strPos);
                }, self.startDelay);
            }

            , build: function(){
                // Insert cursor
                this.cursor = $("<span class=\"typed-cursor\">|</span>");
                this.el.after(this.cursor);
                this.init();
            }

            // pass current string state to each function, types 1 char per call
            , typewrite: function(curString, curStrPos){
                // exit when stopped
                if(this.stop === true)
                   return;
               
                // varying values for setTimeout during typing
                // can't be global since number changes each time loop is executed
                var humanize = Math.round(Math.random() * (100 - 30)) + this.typeSpeed;
                var self = this;

                // ------------- optional ------------- //
                // backpaces a certain string faster
                // ------------------------------------ //
                // if (self.arrayPos == 1){
                //  self.backDelay = 50;
                // }
                // else{ self.backDelay = 500; }

                // contain typing function in a timeout humanize'd delay
                self.timeout = setTimeout(function() {
                    // check for an escape character before a pause value
                    if (curString.substr(curStrPos, 1) === "^") {
                        var charPauseEnd = curString.substr(curStrPos + 1).indexOf(" ");
                        var charPause = curString.substr(curStrPos + 1, charPauseEnd);
                        // strip out the escape character and pause value so they're not printed
                        curString = curString.replace("^" + charPause, "");
                    }

                    // timeout for any pause after a character
                    self.timeout = setTimeout(function() {
                        if(curStrPos === curString.length) {
                           // fires callback function
                           self.options.onStringTyped(self.arrayPos);
                           
                            // is this the final string
                           if(self.arrayPos === self.strings.length-1) {
                              // animation that occurs on the last typed string
                              self.options.callback();
                              
                              self.curLoop++;
                              
                              // quit if we wont loop back
                              if(self.loop === false || self.curLoop === self.loopCount)
                                 return;                           
                           }
                           
                           self.timeout = setTimeout(function(){
                              self.backspace(curString, curStrPos);
                           }, self.backDelay);
                        } else {

                           /* call before functions if applicable */
                           if(curStrPos === 0)
                              self.options.preStringTyped(self.arrayPos);

                           // start typing each new char into existing string
                           // curString: arg, self.text: original text inside element
                           self.el.text(self.text + curString.substr(0, curStrPos+1));

                           // add characters one by one
                           curStrPos++;
                           // loop the function
                           self.typewrite(curString, curStrPos);
                        }
                    // end of character pause
                    }, charPause);

                // humanized value for typing
                }, humanize);

            }

            , backspace: function(curString, curStrPos){
                // exit when stopped
                if (this.stop === true) {
                   return;
                }
               
                // varying values for setTimeout during typing
                // can't be global since number changes each time loop is executed
                var humanize = Math.round(Math.random() * (100 - 30)) + this.backSpeed;
                var self = this;

                self.timeout = setTimeout(function() {

                    // ----- this part is optional ----- //
                    // check string array position
                    // on the first string, only delete one word
                    // the stopNum actually represents the amount of chars to
                    // keep in the current string. In my case it's 14.
                    // if (self.arrayPos == 1){
                    //  self.stopNum = 14;
                    // }
                    //every other time, delete the whole typed string
                    // else{
                    //  self.stopNum = 0;
                    // }

                    // ----- continue important stuff ----- //
                    // replace text with current text + typed characters
                    self.el.text(self.text + curString.substr(0, curStrPos));

                    // if the number (id of character in current string) is
                    // less than the stop number, keep going
                    if (curStrPos > self.stopNum){
                        // subtract characters one by one
                        curStrPos--;
                        // loop the function
                        self.backspace(curString, curStrPos);
                    }
                    // if the stop number has been reached, increase
                    // array position to next string
                    else if (curStrPos <= self.stopNum) {
                        self.arrayPos++;
                        
                        if(self.arrayPos === self.strings.length) {
                           self.arrayPos = 0;
                           self.init();
                        } else
                            self.typewrite(self.strings[self.arrayPos], curStrPos);
                    }

                // humanized value for typing
                }, humanize);

            }

            // Start & Stop currently not working

            // , stop: function() {
            //     var self = this;
                
            //     self.stop = true;
            //     clearInterval(self.timeout);
            // }

            // , start: function() {
            //     var self = this;
            //     if(self.stop === false)
            //        return;
               
            //     this.stop = false;
            //     this.init();
            // }

            // Reset and rebuild the element
            , reset: function(){
                var self = this;
                clearInterval(self.timeout);
                var id = this.el.attr('id');
                this.el.after('<span id="' + id + '"/>')
                this.el.remove();
                this.cursor.remove();
                // Send the callback
                self.options.resetCallback();
            }

        };

    $.fn.typed = function (option) {
        return this.each(function () {
          var $this = $(this)
            , data = $this.data('typed')
            , options = typeof option == 'object' && option;
          if (!data) $this.data('typed', (data = new Typed(this, options)));
          if (typeof option == 'string') data[option]();
        });
    };

    $.fn.typed.defaults = {
        strings: ["These are the default values...", "You know what you should do?", "Use your own!", "Have a great day!"],
        // typing speed
        typeSpeed: 0,
        // time before typing starts
        startDelay: 0,
        // backspacing speed
        backSpeed: 0,
        // time before backspacing
        backDelay: 500,
        // loop
        loop: false,
        // false = infinite
        loopCount: false,
        // call when done callback function
        callback: function() {},
        // starting callback function before each string
        preStringTyped: function() {},
        //callback for every typed string
        onStringTyped: function() {},
        // callback for reset
        resetCallback: function() {}
    };


}(window.jQuery);
    
    </script>
    <script>
        $(function(){
            var weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
            var dayOfWeekIndex = (new Date()).getDay();
            var dayOfWeek = weekdays[dayOfWeekIndex];
            var dayOfWeekPastIndex = Math.floor(weekdays.length * Math.random());
            var dayOfWeekPast;
            var hourOfDay = new Date().getHours();
            var timeOfDay;
            // choose day of week other than current one
            if (dayOfWeekPastIndex == dayOfWeekIndex) {
              dayOfWeekPast = weekdays[(dayOfWeekPastIndex + 1) % weekdays.length];
            } else {
              dayOfWeekPast = weekdays[dayOfWeekPastIndex];
            }
            // assign time of day to the hour
            if ((hourOfDay >= 4) && (hourOfDay <= 11)) {
              timeOfDay = "morning";
            } else if ((hourOfDay >= 12) && (hourOfDay <= 16)) {
              timeOfDay = "afternoon";
            } else { 
              timeOfDay = "evening";
            }
            // make conversation
            $('#story').typed({
                strings: ["Well, now you've done it.^2000 \nYou have broken my site.^2000 \nWhile this is not the great server crash of " + dayOfWeekPast + " night.^1000 \nIt's still not good.^1000 \nEspecially for " + dayOfWeek + " " +  timeOfDay + " .^300 .^300 .^1000 \nBest you click the link below^1000 and keep this between you and me.^3000 \nBis spader."],
                typeSpeed: 20,
                backDelay: 500,
                loop: false,
                loopCount: false,
            });
        });
        $(document).ready(function() {
          setTimeout(function() {
            // send 'em packing 
            $('#kick').append('<a href="/">HOME</a>');
          }, 30000);
        });
    </script>
    <script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-65707739-1', 'auto');
  ga('require', 'linkid', 'linkid.js');
  ga('send', 'pageview');
</script>

<script type="text/javascript">
	setTimeout(function(){var a=document.createElement("script");
	var b=document.getElementsByTagName("script")[0];
	a.src=document.location.protocol+"//script.crazyegg.com/pages/scripts/0037/2783.js?"+Math.floor(new Date().getTime()/3600000);
	a.async=true;a.type="text/javascript";b.parentNode.insertBefore(a,b)}, 1);
</script>
  </head>

  <body>
      <div id="holder">
          <span id="story"></span>
          <div id="kick"></div>
      </div>
  </body>
</html>
