[
  {
    "path": ".gitattributes",
    "content": "* text\n\n# Binary Files.\n*.png binary\n*.jpg binary\n*.gif binary\n*.svg binary\n*.ttf binary\n"
  },
  {
    "path": ".gitignore",
    "content": "*~\njavascript/*.js\n.sass-cache\nnode_modules\n*.sublime-project\n*.sublime-workspace\n\ncodekit-config.json\nlibpeerconnection.log\n\n# Becuase mh0 needs to compress for the debian packaging\n*.nw\npublic/application.css\npublic/application.js\n\nsrc/*.js\napp/views/*.js\n\n.srclib-cache\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"app/lib/socket.io-client\"]\n\tpath = app/lib/socket.io-client\n\turl = https://github.com/LearnBoost/socket.io-client.git\n"
  },
  {
    "path": "Cakefile",
    "content": "\nScrunch = require 'coffee-scrunch'\nuglify  = require 'uglify-js'\nserver  = require 'node-static'\nhttp    = require 'http'\nfs      = require 'fs'\nsass    = require 'node-sass'\nwatch   = require 'node-watch'\n\n# Configuration\nconfig =\n  port: 9294\n  public: 'public'\n  js:\n    folder: 'app/'\n    input:  'app/init.coffee'\n    output: 'public/application.js'\n    min:    'public/application.js'\n  sass:\n    input:  'css/new.scss'\n    output: 'public/application.css'\n\n# Options\noption '-p', '--port [port]', 'Set port for cake server'\noption '-w', '--watch', 'Watch the folder for changes'\n\ncompile =\n\n  sass: (options) ->\n    sasscompile = ->\n      console.log 'Compiling SASS'\n      sass.render {\n          file: config.sass.input\n          success: (css) ->\n            fs.writeFile config.sass.output, css, (err) ->\n              console.warn err if err\n          error: (err) ->\n            console.warn err if err\n          outputStyle: 'compressed'\n        }\n\n    if options.watch\n      watch config.sass.input, sasscompile\n\n    sasscompile()\n\n  coffee: (options) ->\n\n    if options.watch\n      watch config.js.folder, ->\n        process.stdout.write 'Compiling CoffeeScript: '\n        Scrunch(config.js).then ->\n          process.stdout.write 'Done!\\n'\n\n    process.stdout.write 'Compiling CoffeeScript: '\n    Scrunch(config.js).then ->\n      process.stdout.write 'Done!\\n'\n\n  minify: ->\n    js = uglify.minify(config.js.output).code\n    fs.writeFile config.js.min, js\n\n\n# ===============================================================\n# Tasks\n# ===============================================================\n\ntask 'server', 'Start server', (options) ->\n\n  # Start Server\n  port = options.port or config.port\n  file= new(server.Server)(config.public)\n  server = http.createServer (req, res) ->\n    req.addListener( 'end', ->\n      file.serve(req, res)\n    ).resume()\n  server.listen(port)\n\n  console.log \"Server started on :#{port}\"\n\n  # Compile files\n  compile.sass(options)\n  compile.coffee(options)\n\ntask 'build',  'Compile CoffeeScript', compile.coffee\ntask 'minify', 'Minify application.js', compile.minify\ntask 'style',  'Compile Stylesheets', compile.sass\n\n"
  },
  {
    "path": "Gemfile",
    "content": "source 'https://rubygems.org'\n\n# Automatically run `make` everytime a file is changed, see Guardfile for internals.\ngem 'guard'\ngem 'guard-shell'\ngem 'sass'\n"
  },
  {
    "path": "Guardfile",
    "content": "# Only used for development!\n# Always run using bundle! (`bundle exec guard`)\n\n\nguard :shell do\n  watch(/.*\\.coffee$/) do\n    p `make clean` # clean everything.\n    p `make` # recompile everything.\n    `pkill -f ~/atom-shell/atom` # Kill all Springseed processes automatically, quite crude, just matches all processes using a `~/atom-shell` ¯\\_(ツ)_/¯\n    p `~/atom-shell/atom ~/springseed` # restart springseed, again, crude, but does the job.\n  end\nend\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-2014 Jono Cooper\nCopyright (c) 2013-2014 Micheal Harker\nCopyright (c) 2013-2014 Caffeinated Code <http://caffeinatedco.de>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "node_bin = ./node_modules/.bin\n\nspsd = app/init.coffee\natom = $(wildcard src/*.coffee)\ncss = css/new.scss\n\nspsd_out = public/application.js\natom_out = $(atom:%.coffee=%.js)\ncss_out = public/application.css\n\nall: npm build-atom handlebars style build-app\n\nbuild-atom: $(atom_out)\n\nsrc/%.js: src/%.coffee\n\t@$(node_bin)/coffee -bc $<\n\nbuild-app: $(spsd_out)\n\n$(spsd_out): $(spsd)\n\t@$(node_bin)/browserify -t coffeeify $< > $@\n\nhandlebars:\n\t@$(node_bin)/handlebars app/views/note.handlebars -f app/views/note.js\n\t@$(node_bin)/handlebars app/views/notebook.handlebars -f app/views/notebook.js\n\nstyle:\n\t@sass $(css) $(css_out)\n\nnpm:\n\t@npm install .\n\nclean:\n\t@rm -f $(spsd_out) $(atom_out) $(css_out)\n"
  },
  {
    "path": "Procfile",
    "content": "web: serveup ./public"
  },
  {
    "path": "README.md",
    "content": "# Springseed\n[![Stories in Ready](https://badge.waffle.io/byhestia/springseed.svg?label=ready&title=Ready)](http://waffle.io/byhestia/springseed) \n\n**Current version: 2.0**\n\nSpringseed is the simple and easy way to take your notes.\n\n# Binaries\n\nA fairly up-to-date build is available [here](https://xack.xyz/misc/springseed.zip).\n\n1. Extract `springseed.zip` into its own directory.\n2. `./run.sh` **should** download atom-shell, extract it, then run the app.\n\nIf there are any issues, please don't hesitate to submit a bug report.\n\n## Preparing Springseed\n\nSpringseed is now based on the awesome work of the people at GitHub and as\nsuch we use the fantastic `electron` framework to get stuff done. \n\n### Installing `electron`\n(If you already have `electron` jump to the next section)\n\nLatest builds of `electron` are available [here](https://github.com/atom/electron/releases).\n* Download the appropriate file based on your operating system and the system architecture.\n* Unzip the downloaded file. This must create an executable file named `electron`.\n\n### Building this code\nWe have introduced a new build system based on the GNU Makefile build system. Should the\nbuild below fail, you should run `make clean` before trying again because some\nmake operations won't complete if they've errored. Nothing we can do to fix\nthis. :smile:\n\n    sudo gem install sass\n    git submodule update --init\n    make\n\n## Running Springseed\nTo start Springseed, run the command `<path-to-electron-executable>/electron <springseed-build-directory>` where `<springseed-build-directory>` is the directory where you executed the three commands in **Building this code** section\n\n\nIf you're feeling awesome, you should contribute either with code or a\n[donation][1]. Check out the [issue tracker][2] and tackle an issue.\n\nSpringseed is written in CoffeeScript and uses Spine.JS for MVC.\n\n## Official website\n\n<http://getspringseed.com>\n\nCopyright &copy; 2013-2014 [Caffeinated Code][3]<br>\nCopyright &copy; 2014 [Hestia][4]\n\nOpen source under the [MIT license][5].\n\n[1]: http://getspringseed.com/donate\n[2]: https://github.com/byhestia/springseed\n[3]: http://www.caffeinatedco.de/\n[4]: http://byhestia.com/\n[5]: http://opensource.org/licenses/MIT\n"
  },
  {
    "path": "app/controllers/account.coffee",
    "content": "Spine = require 'spine'\n\nclass Account\n  constructor: ->\n\n  @signin: (username, password) ->\n    # Sign in to the Springseed API. It should return a token. Save it.\n    localStorage.login = JSON.stringify {'username': username, 'password': password}\n    if not username and not password\n      # Try signing in with stored credidentials.\n      $.get 'http://api.getspringseed.com/login', JSON.parse(localStorage.login), (data) =>\n        if data['status'] is 200\n          localStorage.token = data['token']\n          return true # Logged in\n        else if data['status'] > 400\n          return false\n    else\n      # Try signing in with the credidentials we were given.\n      $.get 'http://api.getspringseed.com/login', {'username': username, 'password', password}, (data) =>\n        if data['status'] is 200\n          localStorage.token = data['token']\n          return true # Logged in\n        else if data['status'] > 400\n          return false\n\n  @isSignedIn: () ->\n    return true if localStorage.token\n    return false if not localStorage.token\n\n  @enableChecks: () ->\n    $.get 'http://api.getspringseed.com/me', {token: localStorage.token}, (data) =>\n      if data['status'] is 403\n        # Get a new valid token - for the old one has expired.\n        localStorage.removeItem 'token'\n        @signin()\n      else\n        console.log data\n        localStorage.data = JSON.stringify({'username': data.username, 'first_name': data.first_name, 'last_name': data.last_name, 'pro': data.pro})\n    setTimeout(@enableChecks, 300000);\n\n  @get: () ->\n    return JSON.parse(localStorage.data)\n\n  @signout: () ->\n    localStorage.removeItem 'token'\n    localStorage.removeItem 'login'\n\nmodule.exports = Account\n"
  },
  {
    "path": "app/controllers/browser.coffee",
    "content": "Spine = require 'spine'\n\n# Models\nNote = require '../models/note.coffee'\nNotebook = require '../models/notebook.coffee'\n\n# Controllers\nNoteItem = require '../controllers/note.item.coffee'\n\nclass Browser extends Spine.Controller\n\n  template: (->\n    require '../views/note.js'\n    Handlebars.templates['note']\n  )()\n\n  elements:\n    'ul': 'noteBrowser'\n    'span': 'title'\n\n  events:\n    'click #new': 'newNote'\n\n  constructor: ->\n    super\n    Note.bind \"create\", @addOne\n    Notebook.bind \"changeNotebook\", @changeNotebook\n\n  addOne: (note) =>\n    # We should always be in the right list, but doesn't hurt to check\n    if typeof(Notebook.current) isnt \"undefined\"\n      if note.notebook is Notebook.current.id and (Notebook.current.category is \"all\" or note.category is Notebook.find(Notebook.current.id).categories[Notebook.current.category])\n        note.date = note.prettyDate()\n        @noteBrowser.prepend @template note\n\n        view = new NoteItem\n          el: @noteBrowser.find(\"#note-#{ note.id }\")\n          note: note\n\n  newNote: (e) =>\n    if Notebook.current.id isnt \"all\"\n\n          # Create the note meta\n          note = Note.create\n            name: \"Untitled Note\"\n            starred: false\n            excerpt: \"This is your new blank note - add some content!\"\n            notebook: Notebook.current.id\n            category: if Notebook.current.category is \"all\" then Notebook.find(Notebook.current.id).categories[0] else Notebook.find(Notebook.current.id).categories[Notebook.current.category]\n            date: Math.round(new Date().getTime()/1000)\n\n          # Set the content with the special function\n          note.saveNote \"# This is your new blank note\\nAdd some content!\", ->\n\n            # Select it and throw it into editable mode\n            note.trigger(\"changeNote\")\n            note.trigger(\"openNote\")\n    else\n      Modal.get('newNote').run()\n\n  changeNotebook: (notebook) =>\n    dateSort = (a, b) ->\n      return b.date - a.date\n\n    if notebook.search is true or notebook.search is not undefined\n      noteList = \"\"\n      for note in notebook.result\n        note.date = note.prettyDate\n        noteList += @template note\n\n      @noteBrowser.html noteList\n\n    else\n      noteList = \"\"\n      for note in Note.filter(Notebook.current.id, Notebook.current.category).sort(dateSort)\n        note.date = note.prettyDate()\n        noteList += @template note\n\n      @noteBrowser.html(noteList)\n\n      # Defers for speed\n      window.requestAnimationFrame( =>\n        for note in Note.filter(Notebook.current.id, Notebook.current.category)\n          view = new NoteItem\n            el: @noteBrowser.find(\"#note-#{ note.id }\")\n            note: note\n      )\n\nmodule.exports = Browser\n"
  },
  {
    "path": "app/controllers/editor.coffee",
    "content": "Spine = require 'spine'\nmarked = require 'marked'\nhljs = require 'highlight.js'\n\n# Models\nNote = require '../models/note.coffee'\n\n# Controllers\nwindow.Modal = require '../controllers/modal.coffee'\n\nclass Editor extends Spine.Controller\n\n  elements:\n    \".headerwrap .left input\": \"title\"\n    \".headerwrap .left time\": \"time\"\n    \"#contentread\": \"contentread\"\n    \"#contentwrite > .inner\": \"contentwrite\"\n    \".headerwrap .edit\": \"toggle\"\n    \"#psuedoinput\": \"psuedoinput\"\n    \".headerwrap i.star\": \"star\"\n\n  events:\n    \"click .headerwrap .edit\": \"toggleMode\"\n    \"click .headerwrap .revert\": \"revert\"\n    \"keydown #contentwrite > .inner\": \"keydown\"\n    #\"paste #contentwrite > .inner\": \"paste\"\n    \"dblclick #contentread\": \"toggleMode\"\n    \"click header .right .delete\": \"deleteNote\"\n    \"click header .star\": \"starNote\"\n    \"textInput section.inner\": \"inputHandler\" # used for emojis\n    \"blur section.inner\": \"blurHandler\" # again, used for emojis\n\n\n  starNote: ->\n    note = Note.find(Note.current.id)\n    if note.starred is \"true\"\n      note.updateAttribute(\"starred\", \"false\")\n      @star.addClass(\"fa-star-o\")\n      @star.removeClass(\"fa-star\")\n      @star.removeClass(\"starred\")\n    else\n      note.updateAttribute(\"starred\", \"true\")\n      @star.removeClass(\"fa-star-o\")\n      @star.addClass(\"fa-star\")\n      @star.addClass(\"starred\")\n\n  deleteNote: (e) ->\n    note = Note.find(Note.current.id)\n    $(\".delete-container span.name\").text(note.name)\n    Modal.get(\"delete\").run()\n\n  constructor: ->\n    super\n    Note.bind(\"changeNote\", @enable)\n    Note.bind \"openNote\", =>\n      @toggleMode()\n    Note.bind(\"revert\", @revertNote)\n    @.bind(\"checkSel\", @checkSelWrap)\n\n    emojify.setConfig {\n      ignored_tags: {\n        'CODE': 1\n      }\n    }\n    marked.setOptions {\n      highlight: (code, lang) ->\n        try\n          if lang\n            return hljs.highlight(lang.toLowerCase(), code).value\n          else\n            return hljs.highlightAuto(code).value\n        catch error\n          code\n      tables: true\n      sanitize: true\n      smartLists: true\n      smartypants: true\n    }\n    @controls = $(\"#editorcontrols\")\n    @controls.find('#bold').click @formatBold\n    @controls.find('#italics').click @formatItalics\n    @controls.find('#heading').click @formatHead\n\n  enable: (note) =>\n    # Put back into the right mode\n    @toggleMode() if @mode is \"edit\"\n\n    # Loads note\n    Note.current = note\n    if note isnt undefined\n      currentNote = Note.find(note.id)\n\n      @el.removeClass(\"deselected\")\n      @title.val currentNote.name\n      @time.text currentNote.prettyDate(true)\n\n      if currentNote.starred is \"true\"\n        @star.attr('class', 'star fa fa-star starred')\n      else\n        @star.attr('class', 'star fa fa-star-o')\n\n      # Content\n      currentNote.loadNote (content) =>\n        @contentread.html marked(content)\n        @contentwrite.text content\n\n        # this needs to be bound\n        $('#contentread a').attr('target', '_blank').click ->\n          return false\n    else\n      @el.addClass(\"deselected\")\n\n\n    setInterval(@wc, 1000)\n\n    @mode = \"preview\"\n\n  wc: ->\n    text = $('#contentwrite section').text()\n    wc = $(marked(text)).text().split(' ').length\n    $('.wc').text(wc)\n\n\n  toggleMode: (save) ->\n    if @mode is \"preview\" # enable the editor\n      # UI bits and bobs\n      @el.addClass(\"edit\")\n      @toggle.find(\"i\").addClass(\"fa-lock\")\n      @toggle.find(\"i\").removeClass(\"fa-pencil\")\n      @toggle.find(\"i\")[0].parentNode.title = \"Preview Note\"\n      @title.prop \"disabled\", false\n      @mode = \"edit\"\n\n      # Focus the text area\n      @contentwrite.focus()\n\n    else # disable the editor\n      if save is false and Note.current isnt undefined # We're not saving the content (revert button)\n        currentNote = Note.find(Note.current.id)\n        currentNote.loadNote (content) =>\n          @contentwrite.text content\n      else\n        @controls.hide()\n        # Copy the text in\n        noteText = @contentwrite.text()\n        @contentread.html marked(noteText)\n        $('#contentread a').attr('target', '_blank').click ->\n          return false\n\n        # Save it\n        if Note.current isnt undefined\n          currentNote = Note.find(Note.current.id)\n\n          # Excerpts nicely\n          info = noteText\n          if info.length > 90\n            info = info.substring(0, 100)\n            lastIndex = info.lastIndexOf(\" \")\n            info = info.substring(0, lastIndex) + \"&hellip;\"\n          info = $(marked(info)).text()\n          info = info.split(\"\\n\").join(\" \")\n\n          # Update Spine\n          currentNote.updateAttributes {\n            \"name\": @title.val()\n            \"excerpt\": info\n            \"date\": Math.round(new Date()/1000)\n          }\n\n          # Update IndexedDB\n          currentNote.saveNote(noteText)\n\n\n      # The opposite\n      @el.removeClass(\"edit\")\n      @toggle.find(\"i\").removeClass(\"fa-lock\")\n      @toggle.find(\"i\").addClass(\"fa-pencil\")\n      @toggle.find(\"i\")[0].parentNode.title = \"Edit Note\"\n      @title.prop \"disabled\", true\n      @mode = \"preview\"\n      @time.text currentNote.prettyDate(true)\n\n  revert: ->\n    if @mode isnt \"preview\"\n      Modal.get('revert').run()\n\n  revertNote: =>\n    @toggleMode(false)\n\n  # Pops the text into the contenteditable\n  insertText: (text) ->\n    sel = window.getSelection()\n    range = sel.getRangeAt(0)\n    range.deleteContents()\n    textNode = document.createTextNode(text)\n    range.insertNode(textNode)\n    range.setStartAfter(textNode)\n    sel.removeAllRanges()\n    sel.addRange(range)\n\n\n  keydown: (e) ->\n    # Some keys are special\n    if e.keyCode is 13 #return\n      #e.preventDefault()\n      @insertText \"\\n\"\n    else if e.keyCode is 9 #tab\n      e.preventDefault()\n      @insertText \"    \"\n    else if e.keyCode is 27 #escape key\n      e.preventDefault()\n      @toggleMode()\n\n  #paste: (e) ->\n  #  # Keeps the range for later\n  #  @range = window.getSelection().getRangeAt(0)\n\n  #  # Paste it into a textarea (removes formatting)\n  #  #@psuedoinput.val(\"\").focus()\n\n  #  # As the paste event isn't instant, put it back in a few secs.\n  #  setTimeout( =>\n  #    s = window.getSelection()\n  #    s.removeAllRanges()\n  #    s.addRange(@range)\n\n  #    @insertText @psuedoinput.val()\n  #  , 10)\n\n  checkSelWrap: ->\n    setTimeout =>\n      @checkSel()\n    , 50\n\n  checkSel: ->\n    if @mode is \"preview\"\n      @controls.hide()\n    else\n      sel = window.getSelection()\n      if sel.toString().trim() is ''\n        @controls.hide()\n      else\n        @sel = sel\n        @selrange = sel.getRangeAt(0)\n        @controls.show()\n        toppos = @selrange.getBoundingClientRect().top - 55 - @controls.height() + 'px'\n        leftpos = @selrange.getBoundingClientRect().right - (@controls.width() / 2) + 'px'\n        @controls.css {top: toppos, left: leftpos}\n\n  newString: (str) ->\n    @selrange.surroundContents(document.createElement(\"span\"))\n    text = @el.find(\"span\").text()\n    @el.find(\"span\").text(str).contents().unwrap()\n\n  formatBold: (e) =>\n    str = @selrange.toString()\n    if str.substring(0,2) is \"**\" and str.substring(str.length-2,str.length) is \"**\"\n      @newString(str.substring(2,str.length-2))\n    else\n      @sel.collapseToStart()\n      @sel.modify(\"move\", \"backward\", \"character\")\n      @sel.modify(\"move\", \"backward\", \"character\")\n      @sel.modify(\"extend\", \"forward\", \"word\")\n      @sel.modify(\"extend\", \"forward\", \"character\")\n      @sel.modify(\"extend\", \"forward\", \"character\")\n      @selrange = @sel.getRangeAt(0)\n      str = @selrange.toString()\n\n      if str.substring(0,2) is \"**\" and str.substring(str.length-2,str.length) is \"**\"\n        @newString(str.substring(2,str.length-2))\n      else\n        @sel.collapseToStart()\n        @sel.modify(\"move\", \"forward\", \"character\")\n        @sel.modify(\"move\", \"forward\", \"character\")\n        @sel.modify(\"extend\", \"forward\", \"word\")\n        @selrange = @sel.getRangeAt(0)\n        str = @selrange.toString()\n        @newString(\"**\" + str + \"**\")\n\n  formatItalics: (e) =>\n\n    str = @selrange.toString()\n    if str.substring(0,1) is \"*\" and str.substring(str.length-1,str.length) is \"*\"\n      @newString(str.substring(1,str.length-1))\n    else\n      @sel.collapseToStart()\n      @sel.modify(\"move\", \"backward\", \"character\")\n      @sel.modify(\"extend\", \"forward\", \"word\")\n      @sel.modify(\"extend\", \"forward\", \"character\")\n      @selrange = @sel.getRangeAt(0)\n      str = @selrange.toString()\n\n      if str.substring(0,1) is \"*\" and str.substring(str.length-1,str.length) is \"*\"\n        @newString(str.substring(1,str.length-1))\n      else\n        @sel.collapseToStart()\n        @sel.modify(\"move\", \"forward\", \"character\")\n        @sel.modify(\"extend\", \"forward\", \"word\")\n        @selrange = @sel.getRangeAt(0)\n        str = @selrange.toString()\n        @newString(\"*#{str}*\")\n\n  formatHead: (e) =>\n    @sel.modify(\"extend\", \"backward\", \"paragraphboundary\")\n    @sel.modify(\"extend\", \"forward\", \"paragraphboundary\")\n    @selrange = @sel.getRangeAt(0)\n\n    if @selrange.toString().substring(0,3) isnt \"###\"\n      @selrange.surroundContents(document.createElement(\"span\"))\n      text = @el.find(\"span\").text()\n      @el.find(\"span\").text(\"#\"+text+\"\").contents().unwrap()\n    else\n      @selrange.surroundContents(document.createElement(\"span\"))\n      text = @el.find(\"span\").text()\n      @el.find(\"span\").text(text.substring(3)).contents().unwrap()\n\n  inputHandler: (e) ->\n    # Handle Emoji creation\n    if e.originalEvent.data == \":\" # capture colon key\n      setTimeout (->\n        emojify.run() # ALL the emojis!\n      ), 100\n\n\n  blurHandler: (e) ->\n    for i in $('section.inner img.emoji')\n      $(i).replaceWith(i.title)\n\n\nmodule.exports = Editor\n"
  },
  {
    "path": "app/controllers/modal.coffee",
    "content": "Spine = require 'spine'\n$ = Spine.$\n\n# Needed.\nNote = require '../models/note.coffee'\nNotebook = require '../models/notebook.coffee'\n\n# Base Modal Class.\nclass Modal extends Spine.Controller\n  constructor: (opts) ->\n    super\n\n    # Probably shouldn't be in here, but whatever\n    Spine.bind 'sync:meta', =>\n      modals['syncmeta'].run()\n\n  state: off\n\n  show: ->\n    return unless @state is off\n    @state = on\n    @el.show(0).addClass 'show'\n    if @onShow then @onShow()\n    setTimeout ( =>\n      @el.on \"click.modal\", (event) =>\n        if event.target.className.indexOf('modals') > -1\n          @hide()\n    ), 500\n\n\n  hide: ->\n    return unless @state is on\n    @state = off\n    @el.removeClass 'show'\n    setTimeout ( =>\n      @el.hide(0)\n      if @onHide then @onHide()\n    ), 350\n    @el.off 'click.modal'\n\nmodals = []\n\nmodule.exports =\n\n  get: (name) ->\n    # Return a Modal object. Like a pro.\n    return modals[name]\n\n  init: ->\n    # Do init stuff here.\n    # Like, uh, getting modals sorted. Yolo.\n    modals['delete'] = new Modal\n      el: $('.modal.delete')\n      events:\n        'click .true': 'delete'\n        'click .false': 'hide'\n\n      run: ->\n        @show()\n\n      delete: ->\n        # Taken from controllers/panel.coffee.\n        if Note.current isnt undefined\n          currentNote = Note.find(Note.current.id)\n\n          # Take it out of editmode\n          Note.trigger 'changeNote'\n          currentNote.destroy()\n\n          @hide()\n    \n\tmodals['newNote'] = new Modal\n\t  el: $('.newNote')\n\t  events:\n\t    'click .gotit': 'hide'\n\t  run: ->\n\t    @show()\n\n    modals['revert'] = new Modal\n      el: $('.modal.revert')\n      events:\n        'click .true': 'revert'\n        'click .false': 'hide'\n\n      run: ->\n        @show()\n\n      revert: ->\n        Note.trigger 'revert'\n        @hide()\n\n    modals['syncmeta'] = new Modal\n      el: $('.modal.syncmeta')\n      events:\n        'click .destroyclient': 'destroyclient'\n        'click .destroyserver': 'destroyserver'\n\n      destroyclient: ->\n        Sync.firstSync(\"destroyclient\")\n        @hide()\n\n      destroyserver: ->\n        Sync.firstSync(\"destroyserver\")\n        @hide()\n\n      run: ->\n        @show()\n\n    modals['deleteNotebook'] = new Modal\n      el: $('.modal.deleteNotebook')\n      events:\n        'click .true': 'delete'\n        'click .false': 'hide'\n\n      run: (notebookid, @category) ->\n        @notebook = Notebook.find(notebookid)\n        numberofNotes = Note.filter(notebookid, category).length;\n        if @category is \"all\"\n          @el.find('.type').text \"Notebook\"\n          @el.find('i').text @notebook.name\n        else\n          @el.find('.type').text \"Subcategory\"\n          @el.find('i').text @notebook.categories[@category]\n\n        @el.find('.numberofNotes').text(numberofNotes)\n\n        if numberofNotes > 1\n          @el.find('.oneOrMore').show()  \n        else\n          @el.find('.oneOrMore').hide()\n\n        if numberofNotes > 0\n          @show()\n        else\n          @delete()\n\n      delete: ->\n        Note.trigger 'changeNote'\n        if @category is \"all\"\n          @notebook.destroy()\n        else\n          @notebook.subcategoryDestroy(@category)\n        @hide()\n\n    modals['renameNotebook'] = new Modal\n      el: $('.modal.renameNotebook')\n      events:\n        'click .true': 'rename'\n        'click .false': 'hide'\n\n      run: (@notebookid, @category) ->\n        # Subcategories need a proper lookup\n        input = @el.find('input')\n        if @category is 'all'\n          input.val(Notebook.find(@notebookid).name)\n        else\n          input.val(Notebook.find(@notebookid).categories[@category])\n        @show()\n\n      rename: ->\n        # Backslashes only seem to be an issue here\n        input = @el.find('input').val()\n        input = input.replace(/\\\\/g, '')\n        notebook = Notebook.find(@notebookid)\n\n        # Check for Empty String\n        if input isnt ''\n          if @category is 'all'\n            notebook.updateAttribute 'name', input\n          else\n            # Subcategories need to be cloned then updated\n            # Also, I wish there was a better way to do pointers.\n            arr = notebook.categories.slice(0)\n            arr[@category] = input\n            notebook.updateAttribute 'categories', arr\n\n          Notebook.trigger 'refresh'\n        @hide()\n\n    modals['pleaseLogIn'] = new Modal\n      el: $('.modal.pleaseLogIn')\n      events:\n        'click .false': 'hide'\n\n      hide: ->\n        @hide()\n"
  },
  {
    "path": "app/controllers/note.item.coffee",
    "content": "Spine = require 'spine'\n\n# Models\nNote = require '../models/note.coffee'\n\nclass NoteItem extends Spine.Controller\n\n  elements:\n    \"h2\": \"title\"\n    \"time\": \"time\"\n    \"span\": \"excerpt\"\n\n  events:\n    \"click\": \"select\"\n    \"dragstart\": \"startdrag\"\n    \"dragend\": \"stopdrag\"\n\n  constructor: ->\n    super\n    @note.bind \"changeNote\", @changeNote\n    @note.bind \"change\", @updateNote\n    @note.bind \"destroy\", @deleteNote\n\n  select: ->\n\n    Note.trigger \"changeNote\", {id: @note.id}\n    # console.log 'unemojified - change'\n\n  changeNote: =>\n    @el.parent().find(\".selected\").removeClass(\"selected\")\n    @el.addClass(\"selected\")\n    setTimeout (->\n      emojify.run() # ALL the emojis!\n    ), 100\n\n\n  updateNote: =>\n    @title.text @note.name\n    @time.text @note.prettyDate() + \" -\"\n    @excerpt.text @note.excerpt\n\n  deleteNote: =>\n    @el.remove()\n\n  startdrag: (e) =>\n    @el.css {opacity: 0.4}\n\n    noteid = $(e.target).attr('id').replace(\"note-\", \"\")\n    e.originalEvent.dataTransfer.setData('noteid', noteid)\n\n\n  stopdrag: (e) =>\n    @el.css {opacity: 1}\n\n\nmodule.exports = NoteItem\n"
  },
  {
    "path": "app/controllers/notebook.item.coffee",
    "content": "Spine = require 'spine'\n\n# Models\nNotebook = require '../models/notebook.coffee'\n\nclass NotebookItem extends Spine.Controller\n  elements:\n    'ul': 'category'\n\n  events:\n    'click': 'expand'\n    'contextmenu': 'expand'\n    'contextmenu': 'toggleMore'\n    'click .icon': 'newCategory'\n    'dragenter': 'onDragEnter'\n    'dragleave': 'onDragLeave'\n    'dragover': 'onDragOver'\n    'drop': 'onDrop'\n\n  constructor: ->\n    super\n    if @notebook.id isnt 'all'\n      @notebook.bind 'changeNotebook', @changeNotebook\n      @notebook.bind 'update', @update\n      @notebook.bind 'destroy', @destroy\n\n  expand: (e) =>\n    # Categories\n    if $(e.target).attr('data-category')\n      Notebook.trigger('changeNotebook', {id: @notebook.id, category: $(e.target).attr('data-category')})\n    else\n      Notebook.trigger('changeNotebook', {id: @notebook.id, category: 'all'})\n\n    # Hacky, but whatever.\n    @changeNotebook({id: 'all', category: 'all'}) if @notebook.id is 'all'\n\n  toggleMore: (e) =>\n    @expand(e)\n    e.preventDefault()\n    if !$(e.target).hasClass('icon') and @notebook.id isnt 'all'\n      $('.popover-mask').show()\n      target = $(e.target).parent()\n\n      if $(e.target).attr('data-category') is 'all'\n        return\n\n      # Category\n      else if $(e.target).attr('data-category')\n        $('.delete-popover').css(\n          left: target.outerWidth(),\n          top: $(e.target).offset().top-($('.delete-popover').height()/3)\n        ).attr('data-notebook', @notebook.id\n        ).attr('data-category', $(e.target).attr('data-category')\n        ).show()\n\n      # Book\n      else\n        $('.delete-popover').css(\n          left: target.outerWidth(),\n          top: @el.offset().top\n        ).attr('data-notebook', @notebook.id\n        ).attr('data-category', 'all'\n        ).show()\n\n  changeNotebook: (notebook) =>\n    @el.parent()\n      .children()\n      .removeClass('expanded selected')\n    @el.addClass('selected')\n\n    # Only show the categories if there's more than one.\n    @el.addClass('expanded') if @notebook.categories.length > 1\n\n    # Select the right one\n    @category.find('li').removeClass('selected')\n    @el.find(\"[data-category='#{notebook.category}']\").addClass('selected')\n\n  newCategory: (e) ->\n    $('.popover-mask').show()\n    target = $(e.target).parent()\n\n    $('.category-popover').css({left: target.outerWidth(), top: target.offset().top}).show()\n      .find('input').val('').focus()\n\n  update: =>\n    # Subcategories\n    str = '<li data-category=\"all\" class=\"selected\">All Notes</li>'\n    for category, i in @notebook.categories\n      str += \"<li data-category=#{i}>#{category}</li>\"\n    @category.html(str)\n\n    @el.addClass('expanded') if @notebook.categories.length > 1\n\n  destroy: =>\n    @el.remove()\n\n  onDragEnter: (e) =>\n    e.preventDefault()\n    if ($(e.target).attr('data-category') and $(e.target).attr('data-category') isnt 'all') or $(e.currentTarget).attr('id') isnt 'notebook-all'\n      $(e.target).addClass('dragover')\n\n  onDragLeave: (e) =>\n    e.preventDefault()\n    $(e.target).removeClass('dragover')\n\n  onDragOver: (e) =>\n    e.preventDefault()\n    if @notebook.id is 'all' or $(e.target).attr('data-category') is 'all'\n      # No.\n      return false\n\n  onDrop: (e) =>\n    # Create the note in this Notebook, delete the old one.\n    if @notebook.id is 'all' or $(e.target).attr('data-category') is 'all'\n      return false;\n    else\n      noteid = e.originalEvent.dataTransfer.getData('noteid')\n      note = Note.find(noteid)\n      if $(e.target).attr('data-category')\n        category = $(e.target).text()\n        $(e.target).removeClass('dragover') # Reset CSS changes\n      else\n        category = @notebook.categories[0] # Default Category\n\n      note.updateAttributes {\n        'notebook': @notebook.id,\n        'category': category\n      }\n\n      # Finally, refresh!\n      Notebook.trigger 'changeNotebook', {id: Notebook.current.id, category: Notebook.current.category}\n\nmodule.exports = NotebookItem\n"
  },
  {
    "path": "app/controllers/panel.coffee",
    "content": "Spine = require 'spine'\n\n# Models\nNote = require '../models/note.coffee'\nNotebook = require '../models/notebook.coffee'\nModal = require '../controllers/modal.coffee'\nSettings = require '../controllers/settings.coffee'\nAccount = require '../controllers/account.coffee'\n\nclass Panel extends Spine.Controller\n  elements:\n    \"#loginbox\": \"login\"\n\n  events:\n    \"dblclick\": \"maximize\"\n    \"click #decor img\": \"windowControl\"\n    \"keyup #search input\": \"search\"\n    \"click #loginbox .name\": \"userSettings\"\n\n  maximized: false\n\n  constructor: ->\n    super\n    Note.bind \"changeNote\", @toggleNote\n    Notebook.bind \"changeNotebook\", @toggleNotebook\n    # if win\n    #   win.on 'maximize', =>\n    #     @maximized = true\n    #   win.on 'unmaximize', =>\n    #     @maximized = false\n\n    setInterval ->\n      if Account.isSignedIn()\n        $('#loginbox').find('.name').text(Account.get().first_name + \" \" + Account.get().last_name)\n        if Account.get().pro\n          $('#loginbox').find('.gopro').text('you\\'re pro')\n      else\n        $('#loginbox').find('.name').text(\"log in\")\n        $('#loginbox').find('.gopro').text('go pro')\n    ,100\n\n    # Resizes the panel seperator\n    browser = $(\"#browser\")\n    $(\".splitter.split-right\").on \"mouseup\", =>\n      @noteControls.width((browser.width()-4))\n\n  userSettings: (e) ->\n    Settings.get().show(\"account\")\n\n  windowControl: (e) ->\n    # switch e.currentTarget.className\n    #   when \"close\"\n    #     win.close()\n    #   when \"minimize\"\n    #     win.minimize()\n    #   when \"maximize\"\n    #     @maximize()\n\n  maximize: ->\n    win.maximize() if @maximized is false\n    win.unmaximize() if @maximized is true\n\n  toggleNote: (note) =>\n    # if note isnt undefined\n    #   @noteControls.removeClass \"disabled\"\n    # else\n    #   @noteControls.addClass \"disabled\"\n\n  toggleNotebook: (notebook) =>\n    # if notebook.id is \"all\"\n    #   @noteControls.addClass \"all\"\n    # else\n    #   @noteControls.removeClass \"all\"\n\n  search: (e) =>\n    # This feels so ugly :/\n    searchstring = $(e.target).val()\n    Note.search(searchstring)\n\nmodule.exports = Panel\n"
  },
  {
    "path": "app/controllers/popover.coffee",
    "content": "Spine = require 'spine'\n\n# Models\nNotebook = require '../models/notebook.coffee'\n\nModal = require './modal.coffee'\n\nclass Popover extends Spine.Controller\n\n  elements:\n    \".delete-popover\": \"categoryPopover\"\n    \".delete-popover input\": \"categoryInput\"\n    \".delete-popover\": \"delpopover\"\n\n  events:\n    \"click\": \"hidePopover\"\n    \"contextmenu\": \"hidePopover\"\n    \"click .category-popover button\": \"addCategory\"\n    \"keyup .category-popover input\": \"addCategory\"\n    \"click .delete-popover #deleteNotebook\": \"deleteNotebook\"\n    \"click .delete-popover #renameNotebook\": \"renameNotebook\"\n    \"keyup .delete-popover #addCat\": \"addCategory\"\n    \"focusout .delete-popover #addCat\": \"cleanField\"\n\n  constructor: ->\n    super\n\n  hidePopover: (e) ->\n    # Not sure where to put this, but it is global\n    e.preventDefault()\n    @el.hide().children().hide() if $(e.target)[0].nodeName isnt \"INPUT\"\n\n  cleanField: (e) ->\n    $(e.target)[0].value = \"\"\n\n\n  addCategory: (e) ->\n    if e.type is \"keyup\" and e.which is 13\n      # adds the new category on\n      notebook = Notebook.find(Notebook.current.id)\n      cat = notebook.categories\n      name = @categoryInput.val().replace(/\\\\/g, '')\n      if name isnt ''\n        cat.push(name)\n        notebook.updateAttribute(\"categories\", cat)\n        @cleanField(e)\n\n      @el.hide()\n\n  renameNotebook: (e) =>\n    # All renaming gets implemented in modal.coffee\n    notebookid = @delpopover.attr('data-notebook')\n    categoryid = @delpopover.attr('data-category')\n    Modal.get('renameNotebook').run(notebookid, categoryid)\n\n  deleteNotebook: (e) =>\n    # All deletion gets implemented in modal.coffee\n    notebookid = @delpopover.attr('data-notebook')\n    categoryid = @delpopover.attr('data-category')\n    Modal.get('deleteNotebook').run(notebookid, categoryid)\n\n\nmodule.exports = Popover\n"
  },
  {
    "path": "app/controllers/settings.coffee",
    "content": "Spine = require 'spine'\n$ = Spine.$\n\nshell = window.require('shell') if window.require\n\nSync = require './sync.coffee'\nAccount = require '../controllers/account.coffee'\n\nclass Settings extends Spine.Controller\n  elements:\n    '.sync #signin': 'signinbtn'\n    '.sync #signout': 'signoutbtn'\n    '.account #signin': 'signinacc'\n    '.sync .username': 'username'\n    '.account .name': 'accusername'\n    '.about': 'aboutPage'\n    '.general': 'generalPage'\n    '.sync .signedin': 'signedin'\n    '.sync .signedout': 'signedout'\n    '.account .signedin': 'accsignedin'\n    '.account .signedout': 'accsignedout'\n    '#accusername': 'usernameinput'\n    '#accpassword': 'passwordinput'\n    '.account .signedin #pro': 'pro'\n    '.account .signedin #alreadypro': 'alreadypro'\n\n  events:\n    'click .tabs li': 'tabs'\n    'click .sync #signin': 'signin'\n    'click .sync #signout': 'signout'\n    'click .account #signin': 'accountSignin'\n    'click .account #signout': 'accountSignout'\n\n  state: off\n\n  constructor: ->\n    super\n\n    # A really bad hack\n    Spine.bind 'sync:authorized', =>\n      @hide()\n      @signedout.hide()\n      @signedin.show()\n      $.ajax(\n        Sync.generateRequest {request: \"me\"}\n      ).done((data) =>\n        @username.text data.email\n      )\n\n    Spine.bind 'sync:unauthorized', =>\n      @signedout.show()\n      @signedin.hide()\n      @signinbtn.text 'Sign In'\n\n    setInterval () =>\n      if Account.isSignedIn()\n        @accsignedout.hide()\n        @accsignedin.show()\n        @accusername.text(Account.get().first_name + \" \" + Account.get().last_name)\n        if Account.get().pro\n          @pro.hide()\n          @alreadypro.show()\n      else\n        @accsignedin.hide()\n        @accsignedout.show()\n        @pro.show()\n        @alreadypro.hide()\n    ,100\n\n  accountSignin: ->\n    if Account.signin(@usernameinput.val(), @passwordinput.val())\n      if Account.isSignedIn()\n        @hide()\n        Account.enableChecks()\n    else\n      @signinacc.text \"Wrong Username/Password\"\n      setTimeout () =>\n        @signinacc.text \"Sign in\"\n      , 5000\n\n\n  accountSignout: ->\n    Account.signout()\n\n  tabs: (e) ->\n    # This is ugly. Shoot me later. Could not think of a better implementation.\n    @el.find('.current').removeClass 'current'\n    @el.find('div.'+$(e.target).addClass('current').attr('data-id')).addClass 'current'\n\n  show: (tab) ->\n    return unless @state is off\n    @state = on\n    @el.show(0).addClass(\"show\")\n    setTimeout ( =>\n      @el.on \"click.modal\", (event) =>\n        if event.target.className.indexOf('modal') > -1 then @hide()\n    ), 500\n\n    if Account.isSignedIn()\n      @accsignedin.show()\n      @accsignedout.hide()\n    else\n      @accsignedout.show()\n      @accsignedin.hide()\n\n    if tab is not null\n      $('.tabs ul li[data-id=\"'+tab+'\"]').click()\n\n  hide: ->\n    return unless @state is on\n    @state = off\n    @el.removeClass(\"show\")\n    setTimeout ( => @el.hide(0)), 350\n    @el.off(\"click.modal\")\n\n  signin: ->\n    @signinbtn.text 'Connecting...'\n    Sync.auth (data) =>\n        shell.openExternal(data.url)\n\n  signout: ->\n    Sync.signOut()\n\n\nsettings = null # Temp\n\nmodule.exports =\n\n  get: ->\n    return settings\n\n  init: ->\n    settings = new Settings\n      el: $('.modal.preferences')\n"
  },
  {
    "path": "app/controllers/sidebar.coffee",
    "content": "Spine = require 'spine'\n\n# Models\nNote = require '../models/note.coffee'\nNotebook = require '../models/notebook.coffee'\n\n# Controllers\nNotebookItem = require './notebook.item.coffee'\nSettings = require './settings.coffee'\nSync = require './sync.coffee'\n\nclass Sidebar extends Spine.Controller\n\n  template: (->\n    require '../views/notebook.js'\n    Handlebars.templates['notebook']\n  )()\n\n  events:\n    \"keyup input\": \"new\"\n    \"click #settings\": \"toggleSettings\"\n    \"click #sync\": \"doSync\"\n\n  elements:\n    \"ul\": \"list\"\n    \"input\": \"input\"\n    \"#settings\": \"settings\"\n    \"#sync\": \"sync\"\n\n  constructor: ->\n    super\n    Notebook.bind \"create\", @addOne\n    Notebook.bind \"changeNotebook\", @change\n    Notebook.bind \"refresh\", @refresh\n    Notebook.bind \"destroy\", @destroy\n\n    # Starts and stops the animation\n    Spine.bind 'sync:start', =>\n      @sync.addClass 'spin'\n    Spine.bind 'sync:stop', =>\n      @sync.removeClass 'spin'\n\n  addOne: (notebook) =>\n    @list.append @template notebook\n    view = new NotebookItem\n      el: @list.find(\"#notebook-#{ notebook.id }\")\n      notebook: notebook\n\n  change: (notebook) =>\n    # This is defined here, or some weird shit happens\n\n    # Annoyingly, this is a two step process\n    if Note.current\n      if Note.current.persist\n        setTimeout( =>\n          Note.trigger \"changeNote\", Note.current\n        , 100)\n      else\n        Note.trigger \"changeNote\"\n    else\n      Note.trigger \"changeNote\"\n\n    Notebook.current = notebook\n\n  refresh: () =>\n    # Called on load from indexeddb\n    html = @template {id: \"all\", name: \"All Notes\"}\n    for notebook in Notebook.all()\n      html += @template notebook\n    @list.html(html)\n\n    # Defers for speed\n    window.requestAnimationFrame( =>\n      # All Notes\n      new NotebookItem\n        el: @list.find(\"#notebook-all\")\n        notebook: {id: \"all\", name: \"All Notes\", categories: []}\n\n      # Normal Notes\n      for notebook in Notebook.all()\n        view = new NotebookItem\n          el: @list.find(\"#notebook-#{ notebook.id }\")\n          notebook: notebook\n\n      # This feels so bad :(\n      if Notebook.current\n        Note.current.persist = true if Note.current\n        # Doubley bad\n        if Notebook.current.id is \"all\"\n          $(\"#notebook-all\").trigger(\"click\")\n        else\n          Notebook.trigger('changeNotebook', Notebook.current)\n      else\n        $(\"#notebook-all\").trigger(\"click\")\n    )\n\n  destroy: ->\n    # This is bad practice, but I knew this would happen.\n    # We'll revamp it when we get Smart Lists\n    $(\"#notebook-all\").trigger(\"click\")\n\n  new: (e) ->\n    val = @input.val()\n    if e.which is 13 and val\n      # Make a new Notebook\n      newNotebook = Notebook.create\n        name: val\n        categories: [\"General\"]\n        date: Math.round(new Date()/1000)\n\n      # Select that notebook for opening\n      Notebook.trigger \"changeNotebook\", {id: newNotebook.id, category: \"all\"}\n      @input.val \"\"\n\n  toggleSettings: (e) ->\n    Settings.get().show(\"sync\")\n\n  doSync: ->\n    if localStorage.oauth\n      Sync.doSync()\n    else\n      @toggleSettings()\n\nmodule.exports = Sidebar\n"
  },
  {
    "path": "app/controllers/sync.coffee",
    "content": "Spine = @Spine or require 'spine'\nio = require '../lib/socket.io-client/dist/socket.io.js'\nModel = Spine.Model\n\n# Connection states\nOFFLINE = 0\nIN_PROGRESS = 1\nONLINE = 2\n\nwindow.Sync =\n\n  oauth: JSON.parse localStorage.oauth or '{\"service\": \"undefined\"}'\n  queue: JSON.parse localStorage.Queue or '{\"Note\": {}, \"Notebook\": {}}'\n  syncMeta: {}\n\n  # Run a Sync on a Timeout\n  # Clears if another request is put through\n  timeoutSync: ->\n    clearTimeout Sync.timeoutId\n    Sync.timeoutId = setTimeout ->\n      Sync.doSync() if localStorage.oauth\n    , 5000\n\n  # Hold pending actions\n  pending: []\n\n  # Run pending actions\n  _clearPending: ->\n    for [fn, that, args] in @pending by - 1\n      fn.apply(that, args)\n      @pending.length--\n\n  # If connection is not ready, then we will wait until it is\n  defer: (self, fn, args...) ->\n    if @state is ONLINE\n      fn.apply(self, args)\n    else\n      @pending.push [fn, self,  args]\n\n  state: OFFLINE\n\n  signOut: ->\n    # Deletes everything. Should work right?\n    localStorage.removeItem 'oauth'\n    Sync.oauth = JSON.parse localStorage.oauth or '{\"service\": \"undefined\"}'\n    Spine.trigger 'sync:unauthorized'\n    Spine.trigger 'sync:stop'\n\n  # analytics\n  anal: ->\n    $.ajax(\n      Sync.generateRequest({request: \"me\"})\n    ).done (info) ->\n      anal =\n        name: info.display_name\n        email: info.email\n        countryCode: info.country\n        language: navigator.language\n        platform: navigator.platform\n        version: localStorage.version\n      # $.get(\"http://api.getspringseed.com/client\", anal)\n\n  auth: (callback) ->\n\n    # Saves data after getting it from the auth server\n    onData = (data) ->\n      # Calc expiration date\n      data.expires = new Date().getTime() + parseInt(data.expires_in)*1000 if data.hasOwnProperty(\"expires_in\")\n      Sync.oauth = data\n      localStorage.oauth = JSON.stringify(data)\n      Spine.trigger 'sync:authorized'\n\n      # Weird? Do a sync on error. Nope. We're checking if a meta file exists and then asking the user if they\n      # want to copy from the server, or copy to the server. I did tests and if we don't have this step, we get\n      # some really weird fuckery. File systems are great, yes. But databases are sometimes better.\n      $.ajax(\n        Sync.generateRequest\n          request: \"download\"\n          filename: \"meta\"\n      ).done((data) ->\n         Spine.trigger 'sync:meta'\n      ).error((data) ->\n        Sync.doSync()\n      )\n\n    if Sync.oauth.service is \"undefined\"\n      # There's something weird, even thought the sockets should die.\n      if Sync.socket\n        Sync.socket.disconnect()\n        Sync.socket.socket.reconnect()\n      else\n        Sync.socket = io.connect(\"https://springseed.azurewebsites.net:443\")\n\n      Sync.socket.on \"meta\", (data) ->\n        console.log('meta', data)\n        callback(data)\n\n      Sync.socket.on \"authorized\", (data) ->\n        onData(data)\n        Sync.socket.disconnect() # Free up server resources\n\n    # If it expires in the next ten minutes, we'll refresh the token\n    else if Sync.oauth.service is \"skydrive\" and new Date().getTime() > (Sync.oauth.expires - 6000000)\n      $.ajax(\n        Sync.generateRequest\n          request: \"refresh\"\n      ).done((data) ->\n        onData(data)\n        callback() if callback\n      )\n\n  # There's two options of destroying stuff.\n  # Destroy the server, or destroy the client.\n  firstSync: (method) ->\n    deferred = new $.Deferred()\n    if method is \"destroyserver\"\n      $.ajax(\n        Sync.generateRequest\n          request: \"destroy\"\n          filename: \"meta\"\n          dataType: \"text\"\n      ).done (data) ->\n        # Do the real initial sync\n        Sync.doSync()\n\n    else if method is \"destroyclient\"\n      # Delete all the notes in the app\n      Notebook.all().forEach (notebook) ->\n        notebook.destroy()\n\n      # Then delete the queue so nothing tries to sync\n      Sync.queue = {\"Note\": {}, \"Notebook\": {}}\n      Sync.saveQueue()\n\n      # Do the real initial sync\n      Sync.doSync()\n\n  preSync: ->\n    deferred = new $.Deferred()\n\n    if Sync.oauth.service is \"skydrive\"\n      $.ajax(\n        Sync.generateRequest\n          request: \"findappdir\"\n      ).done((data) ->\n        for item in data.data\n          # Break when we find the springseed folder\n          if item.name.toLowerCase() is \"springseed\"\n            Sync.syncMeta.folderid = item.id\n            break\n        $.ajax(\n          Sync.generateRequest\n            request: \"listappdir\"\n        ).done((data) ->\n          Sync.syncMeta.map = {}\n          for item in data.data\n            Sync.syncMeta.map[item.name] = item.id\n          deferred.resolve()\n        )\n      )\n    else\n      deferred.resolve()\n\n    return deferred.promise()\n\n  # The main syncing function.\n  # It downloads the meta, then updates it to latest version as well as doing various other io.\n  # It's magic. Trust me.\n  doSync: ->\n\n    Spine.trigger 'sync:start'\n\n    # Downloads a meta file.\n    $.ajax(\n      Sync.generateRequest\n        request: \"download\"\n        filename: \"meta\"\n    ).done((data) ->\n      # Merge all the magical data together\n      result = Sync.merger(JSON.parse(Sync.exportData()), data, Sync.queue)\n\n      # First, we rename the keys in our current DB\n      promises = []\n      result[1].Note.forEach (item) ->\n\n        promises.push((->\n          deferred = $.Deferred()\n\n          Note.find(item[0]).loadNote (oldcontent) ->\n            trans = Sync.db.transaction([\"notes\"], \"readwrite\")\n            store = trans.objectStore \"notes\"\n            request = store.put(oldcontent, item[1])\n\n            request.onsuccess = (e) =>\n              Note.find(item[0]).deleteNote ->\n                deferred.resolve()\n\n          return deferred.promise()\n        )())\n\n      # All files renamed, doing da internet IO.\n      $.when.apply($, promises).then ->\n\n        promises = []\n        dbrequests = []\n        trans = Sync.db.transaction([\"notes\"], \"readwrite\")\n        store = trans.objectStore \"notes\"\n\n        result[2].Note.forEach (item) ->\n\n          promises.push((->\n            deferred = $.Deferred()\n\n            switch item[0]\n              when \"upload\"\n                itemid = item[1]\n                dbrequests[itemid] = store.get(itemid)\n                dbrequests[itemid].onsuccess = (e) =>\n                  # Upload file to my butt.\n                  $.ajax(\n                    Sync.generateRequest\n                      request: \"upload\"\n                      filename: itemid\n                      dataType: \"text\"\n                      data: e.target.result\n                  ).done (data) ->\n                    deferred.resolve()\n\n              when \"download\"\n                # Download from my butt\n                $.ajax(\n                  Sync.generateRequest\n                    request: \"download\"\n                    filename: item[1]\n                    dataType: \"text\"\n                ).done (data) ->\n                  # We now have to store the new data in the database.\n                  trans = Sync.db.transaction([\"notes\"], \"readwrite\")\n                  store = trans.objectStore \"notes\"\n                  request = store.put(data, item[1])\n\n                  request.onsuccess = (e) =>\n                    deferred.resolve()\n\n              when \"destroy\"\n                dbrequests[item[1]] = store.delete(item[1])\n                file = item[1]\n\n                # Delete in the butt\n                $.ajax(\n                  Sync.generateRequest\n                    request: \"destroy\"\n                    filename: file\n                    dataType: \"text\"\n                ).done (data) ->\n                  deferred.resolve()\n\n            return deferred.promise()\n          )())\n\n        # Almost all io done, replace metas now.\n        $.when.apply($, promises).then ->\n\n          # Copy into the app\n          Sync.importData JSON.stringify(result[0])\n\n          # Send it to my butt yo\n          $.ajax(\n            Sync.generateRequest\n              request: \"upload\"\n              filename: \"meta\"\n              data: JSON.stringify(result[0])\n          ).done (data) ->\n            console.log(\"all done! Delete the queue\")\n            Sync.queue = {\"Note\": {}, \"Notebook\": {}}\n            Sync.saveQueue()\n            Spine.trigger 'sync:stop'\n\n    ).error (data) ->\n      if data.status is 401\n        console.log \"the bearer token is wrong. deleting token & please reauth\"\n        Sync.signOut()\n\n      else if data.status is 404\n        console.log \"meta does not exist. uploading a new meta w/ every single file\"\n\n        promises = []\n        $(Note.all()).each (i, e) ->\n          e.loadNote (data) ->\n\n            # make ajax request based on inputs from current loop element\n            promises.push($.ajax(\n                Sync.generateRequest\n                  request: \"upload\"\n                  filename: e.id\n                  dataType: \"text\"\n                  data: data\n              )\n            )\n\n        # stuff\n        $.when(promises).done ->\n          console.log 'All files uploaded, uploading the meta file'\n\n          $.ajax(\n            Sync.generateRequest\n              request: \"upload\"\n              filename: \"meta\"\n              data: Sync.exportData()\n          ).done (data) ->\n            console.log(\"all done! Delete the queue\")\n            Sync.queue = {\"Note\": {}, \"Notebook\": {}}\n            Sync.saveQueue()\n            Spine.trigger 'sync:stop'\n            Note.trigger 'refresh'\n\n  # It's *slightly* nicer having a function generating requests\n  generateRequest: (opts) ->\n    if Sync.oauth.service is \"dropbox\"\n      params =\n        crossDomain: true\n        dataType: opts.dataType || \"json\"\n        beforeSend: (xhr) ->\n          xhr.setRequestHeader \"Authorization\", \"Bearer \" + Sync.oauth.access_token\n\n      if opts.request is \"me\"\n        params.type = \"get\"\n        params.url = \"https://api.dropbox.com/1/account/info\"\n\n      else if opts.request is \"download\"\n        params.type = \"get\"\n        params.url = \"https://api-content.dropbox.com/1/files/sandbox/\" + opts.filename + \".seed\"\n\n      else if opts.request is \"upload\"\n        params.type = \"put\"\n        params.contentType = opts.contentType || \"application/octet-stream\"\n        params.url = \"https://api-content.dropbox.com/1/files_put/sandbox/\" + opts.filename + \".seed\"\n        params.data = opts.data\n\n      else if opts.request is \"destroy\"\n        params.type = \"post\"\n        params.url = \"https://api.dropbox.com/1/fileops/delete\"\n        params.data = {\n          root: \"sandbox\"\n          path: opts.filename + \".seed\"\n        }\n\n    else if Sync.oauth.service is \"skydrive\"\n      params =\n        crossDomain: true\n        dataType: opts.dataType || \"json\"\n\n      if opts.request is \"refresh\"\n        params.type = \"get\"\n        params.url = \"https://springseed.azurewebsites.net:443/refresh/skydrive?code=\" + Sync.oauth.refresh_token\n\n      else if opts.request is \"me\"\n        params.type = \"get\"\n        params.url = \"https://apis.live.net/v5.0/me?access_token=\" + Sync.oauth.access_token\n\n      else if opts.request is \"root\"\n        params.type = \"get\"\n        params.url = \"https://apis.live.net/v5.0/me/skydrive?access_token=\" + Sync.oauth.access_token\n\n      else if opts.request is \"makeappdir\"\n        params.type = \"post\"\n        params.contentType = \"application/json\"\n        params.url = \"https://apis.live.net/v5.0/me/skydrive/my_documents?access_token=\" + Sync.oauth.access_token\n        params.data = '{\"name\": \"Springseed\", \"description\": \"Springseed App Data\"}'\n\n      else if opts.request is \"findappdir\"\n        params.type = \"get\"\n        params.url = \"https://apis.live.net/v5.0/me/skydrive/my_documents/files?access_token=\" + Sync.oauth.access_token\n\n      else if opts.request is \"listappdir\"\n        params.type = \"get\"\n        params.url = \"https://apis.live.net/v5.0/\" + Sync.syncMeta.folderid + \"/files?access_token=\" + Sync.oauth.access_token\n\n      else if opts.request is \"download\"\n        params.type = \"get\"\n        params.url = \"https://apis.live.net/v5.0/\" + Sync.syncMeta.map[opts.filename + \".seed\"] + \"/content?access_token=\" + Sync.oauth.access_token\n\n    params # return\n\n  connect: (fn) ->\n\n    # Only run connect once\n    if @state is OFFLINE\n      @state = IN_PROGRESS\n\n      request = indexedDB.open(\"springseed\", 1)\n\n      request.onupgradeneeded = (e) =>\n        @db = e.target.result\n\n        # We're going to just be storing all the spine stuff in one store,\n        # just because I cbf seperating the Keys.\n        @db.createObjectStore(\"meta\")\n\n        # We'll make another store to seperate the note s\n        @db.createObjectStore(\"notes\")\n\n      request.onsuccess = (e) =>\n        Sync.db = e.target.result\n        @state = ONLINE\n        fn() if typeof fn is 'function'\n        @_clearPending()\n\n  # Check an event, and if it is a model update add it to the queue\n  addToQueue: (event, args) ->\n    if @queue[args.constructor.name][args.id] and @queue[args.constructor.name][args.id][0] is \"create\"\n      # create + destroy = nothing\n      if event is \"destroy\"\n        delete @queue[args.constructor.name][args.id]\n    else\n      # Otherwiswe, add it to the queue\n      @queue[args.constructor.name][args.id] = [event, Math.round(new Date()/1000)]\n    @saveQueue()\n\n  saveQueue: ->\n    # Save queue to localstorage\n    localStorage.Queue = JSON.stringify @queue\n\n  exportData: (keys=[\"Note\", \"Notebook\"]) ->\n    # Export local data to JSON\n    output = {\n      \"Note\": Note.toJSON()\n      \"Notebook\": Notebook.toJSON()\n    }\n    JSON.stringify(output)\n\n  importData: (obj) ->\n    input = JSON.parse(obj)\n\n    # We have to save it to the db, otherwise it just hangs around in memory.\n    Note.refresh(input.Note, clear: true)\n    Notebook.refresh(input.Notebook, clear: true)\n    Note.saveLocal()\n    Notebook.saveLocal()\n\n  # Merges the client & server, using a queue\n  # Spits out the result, id changes & fs changes\n  merger: (client, server, queue) ->\n\n    # Creates an array index\n    indexer = (db) ->\n      result = {}\n      for k,v of db\n        # Sets Up Index\n        result[k] = {}\n        result[k].max = 0\n\n        # Indexes Items\n        for key, index in db[k]\n          result[k][key.id] = index\n\n          # Checks for the highest number\n          num = parseInt(key.id.substring(2, key.id.length))\n          result[k].max = num if num > result[k].max\n\n      result #return\n\n    clientindex = indexer(client)\n    resultant = JSON.parse(JSON.stringify(server))\n    resultantindex = indexer(resultant)\n    namechanges = {\"Notebook\": [], \"Note\": []}\n    fschanges = {\"Notebook\": [], \"Note\": []}\n\n    # Add Changes from client\n    for type of queue\n      for key, value of queue[type]\n        # Ensures that the key exists\n          switch value[0]\n            when \"create\"\n              if clientindex[type][key]\n                # we copy the change into the resultant\n                oldId = key\n                newId = \"c-\" + (resultantindex[type].max += 1)\n                client[type][clientindex[type][key]].id = newId\n                resultant[type].push(client[type][clientindex[type][key]])\n\n                # update the index\n                resultantindex[type][newId] = resultant[type].length\n\n                # add to fschanges\n                fschanges[type].push([\"upload\", newId])\n\n                # add to name changes\n                namechanges[type].push([oldId, newId]) if oldId isnt newId\n\n            when \"update\"\n              if clientindex[type][key]\n                # If the item update was before the update on the server, create a conflicted copy\n                if value[1] < resultant[type][resultantindex[type][key]].date\n                  # bad case of DRY here\n\n                  # we copy the change into the resultant\n                  oldId = key\n                  newId = \"c-\" + (resultantindex[type].max += 1)\n                  client[type][clientindex[type][key]].id = newId\n                  client[type][clientindex[type][key]].name += \" (Conflicted Copy)\"\n                  resultant[type].push(client[type][clientindex[type][key]])\n\n                  # update the index\n                  resultantindex[type][newId] = resultant[type].length\n\n                  # add to fschanges\n                  fschanges[type].push([\"download\", resultant[type][resultantindex[type][key]].id])\n                  fschanges[type].push([\"upload\", newId])\n\n                  # add to name changes\n                  namechanges[type].push([oldId, newId]) if oldId isnt newId\n                else\n                  # copies the new change in\n                  resultant[type][resultantindex[type][key]] = client[type][clientindex[type][key]]\n\n                  fschanges[type].push([\"upload\", resultant[type][resultantindex[type][key]].id])\n            when \"destroy\"\n              # If the item was after before the delete event, don't do anything\n              if value[1] > resultant[type][resultantindex[type][key]].date\n                # tell the server to delete it\n                fschanges[type].push([\"destroy\", resultant[type][resultantindex[type][key]].id])\n\n                # destroy the change from the resultant\n                resultant[type].splice(resultantindex[type][key], 1)\n\n                # reindex\n                resultantindex = indexer(resultant)\n\n    # Er, well if notebook name id changes we have to change note ids\n    # @consindo is an idiot. Please send him angry messages.\n    # This code is also annoying because it's not a keyvalue pair. That's what happens if you loop try to dry.\n    # So, we'll build an index\n    notebooknamechangesindex = {}\n    for item in namechanges.Notebook\n      notebooknamechangesindex[item[0]] = item[1]\n\n    # Simple, right? Now we loop throught the notes and change the ids\n    for k, v of resultant.Note\n      if notebooknamechangesindex[v.notebook] isnt undefined\n        v.notebook = notebooknamechangesindex[v.notebook]\n        resultant.Note[k] = v\n\n    # All the changes from the client should be added at this point\n    # Now we detect the differences between the server copy and our client.\n\n    # Basically, find timestamps that are newer on the server and stuff\n    # that exists on the server but not the client.\n\n    # We start by cloning the resultant\n    original = JSON.parse(JSON.stringify(resultant))\n    originalindex = indexer(original)\n\n    # Removing all the stuff that is changed\n    for type of fschanges\n      for item in fschanges[type]\n        original[type].splice(originalindex[type][item[1]], 1)\n        originalindex = indexer(original)\n\n    for type of original\n      for key, value of original[type]\n        # We only need to do this for stuff with dates, not anything else\n        if value.date\n          if client[type][clientindex[type][value.id]]\n            if client[type][clientindex[type][value.id]].date < value.date\n              # Server is newer than client, download from server\n              fschanges[type].push([\"download\", value.id])\n          else\n            # Doesn't exist on client, download from server\n            fschanges[type].push([\"download\", value.id])\n\n    return [resultant, namechanges, fschanges]\n\n# Just in case you need any default values\nclass Base\n\nModel.Sync =\n\n  extended: ->\n\n    console.log '%c> Setting up sync for %s', 'font-weight: bold', this.name\n\n    @fetch ->\n      console.log '%c> Calling fetch', 'background: #eee'\n      Sync.defer(this, @loadLocal)\n\n    @change (record, event) ->\n      Sync.addToQueue(event, record)\n      console.log '%c> Calling change: ' + event, 'background: #eee'\n      Sync.defer(this, @saveLocal)\n      Sync.timeoutSync()\n\n    Sync.connect()\n\n  saveLocal: ->\n    result = JSON.stringify(@)\n\n    # Save to IndexedDB\n    trans = Sync.db.transaction([\"meta\"], \"readwrite\")\n    store = trans.objectStore \"meta\"\n    request = store.put(result, @className)\n\n  loadLocal: (options = {}) ->\n\n    console.log \"%c> Fetching #{@className}s\", 'color: blue'\n\n    options.clear = true unless options.hasOwnProperty('clear')\n\n    # Load from IndexedDB\n    trans = Sync.db.transaction([\"meta\"], \"readwrite\")\n    store = trans.objectStore \"meta\"\n    request = store.get(@className)\n\n    request.onsuccess = (e) =>\n      result = e.target.result\n      @refresh(result or [], options)\n      Spine.trigger \"#{@className}:ready\"\n\n  saveNote: (content, callback) ->\n    trans = Sync.db.transaction([\"notes\"], \"readwrite\")\n    store = trans.objectStore \"notes\"\n    request = store.put(content, @id)\n\n    request.onsuccess = (e) =>\n      Sync.timeoutSync()\n      callback() if callback\n\n  loadNote: (callback) ->\n    trans = Sync.db.transaction([\"notes\"], \"readwrite\")\n    store = trans.objectStore \"notes\"\n    request = store.get(@id)\n\n    request.onsuccess = (e) =>\n      result = e.target.result\n      callback(result) if callback\n\n  deleteNote: (callback) ->\n    trans = Sync.db.transaction([\"notes\"], \"readwrite\")\n    store = trans.objectStore \"notes\"\n    request = store.delete(@id)\n\n    request.onsuccess = (e) =>\n      callback() if callback\n\nModel.Sync.Methods =\n  extended: ->\n    @extend Extend\n    @include Include\n\nmodule?.exports = Sync\n"
  },
  {
    "path": "app/controllers/upgrader.coffee",
    "content": "###############\n# If you're reading this code, and you're like\n# ERMAGERD, WHY IS THIS IDIOT USING NODE.JS, S`NOT EVEN ASYNC!!11!!\n# Well, it's because Spine doesn't work too well when it's async.\n# Not sure why, it just loves to run out of memory and crash.\n###############\nSpine = require 'spine'\nmarked = require 'marked'\n\nNote = require '../models/note.coffee'\nNotebook = require '../models/notebook.coffee'\n\nclass window.upgrader extends Spine.Controller\n  constructor: ->\n    super\n\n    notebookPromise = new $.Deferred()\n    notePromise = new $.Deferred()\n\n    Spine.bind \"Notebook:ready\", notebookPromise.resolve\n    Spine.bind \"Note:ready\", notePromise.resolve\n\n    $.when.apply($, [notebookPromise.promise(), notePromise.promise()]).then =>\n      @upgrade(localStorage.version)\n      localStorage.version = \"2.0\"\n\n  upgrade: (version) ->\n    # New install, add default notes\n    if version is undefined\n      for notebook in ['Personal', 'Scrap', 'Work']\n        Notebook.create\n          name: notebook\n          attributes: {starred: false}\n          categories: [\"General\"]\n          date: Math.round(new Date()/1000)\n\n      # Semi Ajaxed in, rather than hardcoded.\n      $.getJSON('default.json').done (data) ->\n        for defaultNote in data\n          note = Note.create\n            name: defaultNote.name\n            excerpt: defaultNote.content.substring(0, 100)\n            notebook: 'c-2'\n            category: 'General'\n            date: Math.round(new Date().getTime()/1000)\n          note.saveNote defaultNote.content\n\n        # For whatever reason, it doesn't reload afterwards?\n        $(\"#notebook-all\").trigger(\"click\")\n\n    else if version is \"1.1\"\n      console.log \"Upgrading DB\"\n      for note in Note.toJSON()\n        note = Note.create\n          name: note.name\n          starred: false\n          categories: note.categories\n          date: note.date\n        Note.find(note.id).destroy()\n\n      $.getJSON('default.json').done (data) ->\n        for defaultNote in data\n          note = Note.create\n            name: defaultNote.name\n            excerpt: defaultNote.content.substring(0, 100)\n            notebook: 'c-2'\n            category: 'General'\n            date: Math.round(new Date().getTime()/1000)\n          note.saveNote defaultNote.content\n\n        # For whatever reason, it doesn't reload afterwards?\n        $(\"#notebook-all\").trigger(\"click\")\n\n    else if version is \"1.0\"\n      path = window.require 'path'\n      fs = window.require 'fs'\n\n      # Make variables. Do checks.\n      homedir = window.process.env.HOME\n\n      # Set up where we're going to store stuff.\n      if window.process.platform is 'darwin'\n        storagedir = path.join(homedir, \"/Library/Application Support/Springseed/\")\n      else if window.process.platform is 'win32'\n        storagedir = path.join(process.env.LOCALAPPDATA, \"/Springseed/\")\n      else if window.process.platform is 'linux'\n        storagedir = path.join(homedir, '/.config/Springseed/')\n\n      notebookdir = path.join(storagedir, 'Notebooks')\n      notebooks = {}\n\n      files = fs.readdirSync notebookdir\n      files.forEach (file) =>\n        if file.substr(16,5) is \".list\"\n\n          # Read the file, syncronously.\n          data = fs.readFileSync path.join(notebookdir, file)\n          console.log data.toString()\n\n          # Read the old notebook, create a new spine model\n          try\n            oldnotebook = JSON.parse(data)\n            newNotebook = Notebook.create\n              name: oldnotebook.name\n              categories: [\"General\"]\n              date: Math.round(new Date()/1000)\n            # Our mapping array to show the new positions\n            notebooks[oldnotebook.id] = newNotebook.id\n          catch error\n            console.log(\"there was an error\", id)\n            # Eh, what can we do?\n            return\n\n      # Load the notes from the notebook into the model\n      files.forEach (file) =>\n        if file.substr(33,5) is \".note\"\n          raw = fs.readFileSync path.join(notebookdir, file)\n          try\n            contents = JSON.parse(raw)\n            contents.notebook = notebooks[contents.notebook]\n          catch error\n            contents = {\n              name: \"Untitled Note\"\n              content: raw.toString()\n              date: Math.round(new Date()/1000)\n              notebook: Notebook.all()[0].id\n            }\n\n          note = Note.create\n            name: contents.name\n            excerpt: $(marked(contents.content.substring(0,100))).text()\n            notebook: contents.notebook\n            category: \"General\"\n            date: contents.date\n          note.saveNote(contents.content)\n\nmodule.exports = upgrader\n"
  },
  {
    "path": "app/index.coffee",
    "content": "require './lib/setup.coffee'\nSpine = require 'spine'\n\nshell = window.require('shell') if window.require\nAnalytics = require 'analytics-node'\n\n# Upgrader\nUpgrader = require('./controllers/upgrader.coffee')\n\n# Splitter. Not working in setup for whatever reason.\nSplitter = require('./lib/splitter.js')\n\n# Modals\nNotebook = require './models/notebook.coffee'\nNote = require './models/note.coffee'\n\n# Controllers\nPanel = require './controllers/panel.coffee'\nSidebar = require './controllers/sidebar.coffee'\nBrowser = require './controllers/browser.coffee'\nEditor = require './controllers/editor.coffee'\nPopover = require './controllers/popover.coffee'\nModal = require './controllers/modal.coffee'\nAccount = require './controllers/account.coffee'\nSettings = require './controllers/settings.coffee'\n\nclass App extends Spine.Controller\n  elements:\n    '#panel': 'panel'\n    '#sidebar': 'sidebar'\n    '#browser': 'browser'\n    '#editor': 'editor'\n    '.popover-mask': 'popoverMask'\n    '.modal.preferences': 'settings'\n\n  events:\n    'mousedown': 'checkSel'\n    'mouseup': 'checkSel'\n\n  constructor: ->\n    super\n\n    Account.enableChecks()\n    Notebook.fetch()\n    Note.fetch()\n\n    anal = new Analytics('u9g1p9otaa')\n\n    # We're nosey.\n    anal.track({\n      'userId': 'anonymous_user',\n      'event': 'Open App',\n      'properties': {\n        'os': @getOS(),\n        'country': @getCountry(),\n        'language': navigator.language,\n        'version': localStorage.version\n      }\n    })\n\n    # Init the Splitter so we can see crap.\n    Splitter.init\n      parent: $('#parent')[0],\n      panels:\n        left:\n          el: $(\"#sidebar\")[0]\n          min: 150\n          width: 200\n          max: 450\n        center:\n          el: $(\"#browser\")[0]\n          min: 250\n          width: 300\n          max: 850\n        right:\n          el: $(\"#editor\")[0]\n          min: 450\n          width: 550\n          max: Infinity\n\n    Modal.init()\n\n    Settings.init()\n\n    @settings = Settings.get()\n\n    # Init Stuff\n    new Upgrader()\n    @panel = new Panel( el: @panel )\n    @sidebar = new Sidebar( el: @sidebar )\n    @browser = new Browser( el: @browser )\n    @editor = new Editor( el: @editor )\n    @popover = new Popover( el: @popoverMask )\n\n    # We'll put the sync conenct here as well.\n    Spine.trigger 'sync:authorized' if Sync.oauth.service != \"undefined\"\n    Sync.anal()\n\n    # Stuff for node webkit.\n    $('a').on 'click', (e) ->\n      e.preventDefault()\n      if e.which is 1 or e.which is 2\n        shell.openExternal $(@).attr(\"href\")\n      return false\n\n    # Going to use this to enable the dev tools, because yolo\n    # konami_keys = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65]\n    # konami_index = 0\n    # $(document).keydown (e) ->\n    #   location.reload() if e.keyCode is 116\n    #   if e.keyCode is konami_keys[konami_index++]\n    #     if konami_index is konami_keys.length\n    #       $(document).unbind \"keydown\", arguments.callee\n    #       <nw require>.Window.get().showDevTools()\n    #   else\n    #     konami_index = 0\n\n  # We're sending an event to the editor here because we need the checksel to be global\n  checkSel: ->\n    @editor.trigger(\"checkSel\")\n\n  getOS: ->\n    ua = navigator.userAgent\n    return \"Linux\" if ua.indexOf(\"Linux\") > -1\n    return \"Mac OS X 10.9\" if ua.indexOf(\"Mac OS X 10_9\") > -1\n    return \"Mac OS X 10.8\" if ua.indexOf(\"Mac OS X 10_8\") > -1\n    return \"Mac OS X 10.7\" if ua.indexOf(\"Mac OS X 10_7\") > -1\n    return \"Mac OS X 10.6\" if ua.indexOf(\"Mac OS X 10_6\") > -1\n    return \"Windows XP\" if ua.indexOf(\"Windows NT 6.2\") > -1\n    return \"Windows Vista\" if ua.indexOf(\"Windows NT 6\") > -1\n    return \"Windows 7\" if ua.indexOf(\"Windows NT 6.1\") > -1\n    return \"Windows 8\" if ua.indexOf(\"Windows NT 6.2\") > -1\n    return \"Windows 8.1\" if ua.indexOf(\"Windows NT 6.3\") > -1\n\n  getCountry: ->\n    $.getJSON 'http://freegeoip.net/json/', (loc) ->\n      return loc.country_name\n\n\nmodule.exports = App\n"
  },
  {
    "path": "app/init.coffee",
    "content": "jQuery  = require 'jqueryify'\nexports = this\njQuery ->\n  App = require './index.coffee'\n  exports.app = new App\n    el: $('body')\n"
  },
  {
    "path": "app/lib/setup.coffee",
    "content": "require('jqueryify')\n\nrequire('spine')\nrequire '../controllers/sync.coffee'\n"
  },
  {
    "path": "app/lib/splitter.js",
    "content": "(function() {\n\n  // Variables\n  var parent;\n  var panels = {};\n  var splitters = {};\n  var parentOffset = 0;\n  var width = 0;\n  var active = false;\n  var offset = {};\n  var minWidth = 0;\n  var last = {\n    pos: 0,\n    width: 0\n  };\n\n\n  // Class Panel\n  var Panel = function(id, options) {\n    this.id = id;\n    this.el = options.el;\n    this.min = options.min || 0;\n    this.max = options.max || Infinity;\n    this.width = options.width || 0;\n\n    switch (this.id) {\n      case \"left\":\n        this.pos = 0;\n        break;\n      case \"center\":\n        this.pos = panels.left.width;\n        break;\n      case \"right\":\n        this.pos = panels.left.width + panels.center.width;\n        break;\n    }\n\n    if (this.id !== \"right\") { this.el.style.width = this.width + \"px\"; }\n    this.el.style.left = this.pos + \"px\";\n\n  };\n\n  Panel.prototype = {\n    move: function(position, relative) {\n      if (relative) { this.pos += position; }\n      else { this.pos = position; }\n      this.el.style.left = this.pos + \"px\";\n    },\n    resize: function(width, relative) {\n      if (relative) { this.width += width; }\n      else { this.width = width; }\n      if (this.width < this.min) { this.width = this.min; }\n      else if (this.width > this.max) { this.width = this.max; }\n      this.el.style.width = this.width + \"px\";\n    }\n  };\n\n\n  // Class Splitter\n  var Splitter = function(id) {\n    this.id = id;\n    this.el = doc.createElement(\"div\")\n    this.pos = 0;\n\n    if (this.id === \"left\") {\n      this.left = panels.left;\n      this.right = panels.center;\n    }\n    else if (this.id === \"right\") {\n      this.left = panels.center;\n      this.right = panels.right;\n    }\n\n    this.el.className = \"splitter split-\" + this.id;\n    this.el.style.left = this.right.pos + \"px\";\n    this.left.el.insertAdjacentElement('afterend', this.el);\n    this.pos = this.el.offsetLeft;\n    this.el.obj = this;\n    this.el.onmousedown = events.mousedown;\n\n  };\n\n  Splitter.prototype = {\n    move: Panel.prototype.move,\n    resize: function(pos) {\n      var resizeWindow = true;\n\n      // Left min\n      if (pos < this.left.min + offset.left) {\n        pos = this.left.min + offset.left;\n      }\n\n      // Left max\n      else if (pos > this.left.max + offset.left) {\n        pos = this.left.max + offset.left;\n      }\n\n      if (this.id === \"right\") {\n        resizeWindow = false;\n\n        // Right min\n        if (offset.right - pos < this.right.min) {\n          resizeWindow = true;\n        }\n\n        // Right max\n        else if (offset.right - pos > this.right.max) {\n          pos = offset.right - this.right.max;\n        }\n      }\n\n      // Calculate diff\n      var diff = pos - last.pos;\n      if (diff === 0) {\n        this.pos = pos;\n        return true;\n      }\n\n      // Right Splitter\n      if (this.id === \"right\") {\n        panels.center.resize(pos - offset.left);\n        panels.right.move(pos);\n        splitters.right.move(pos);\n      }\n\n      // Left splitter\n      else if (this.id === \"left\") {\n        splitters.left.move(pos);\n        splitters.right.move(pos + panels.center.width);\n        panels.left.resize(pos - offset.left);\n        panels.center.move(pos);\n        panels.right.move(splitters.right.pos);\n        minWidth = pos + panels.center.min + panels.right.min;\n      }\n\n      // Resize window frame\n      if (mode === \"node\" && resizeWindow) {\n        width += diff;\n        offset.right = win.width = width;\n      }\n\n      // Save position\n      this.pos = last.pos = pos;\n    }\n  };\n\n\n  /*\n    Node Webkit Support\n    -------------------\n    global.document = document\n    global.window = window\n  */\n  var win, doc, mode;\n  // Think cake is fucking this.\n  // if (typeof(process) != \"undefined\") {\n  //   mode = \"node\";\n  //   console.log(\"2\")\n  //   win = global.gui.Window.get();\n  //   doc = global.document;\n  // } else {\n    mode = \"browser\";\n    win = window;\n    doc = document;\n  // }\n\n\n  // Calculate position of cursor on parent.\n  var getPos = function(clientX) {\n    var pos = clientX - parentOffset;\n    if (pos < 0) {\n      pos = 0;\n    }\n    else if (pos > width) {\n      pos = width;\n    }\n    return pos;\n  };\n\n\n  // Events\n  var events = {\n\n    mousedown: function(event) {\n      active = this.obj;\n      offset = {\n        left: 0,\n        right: width\n      };\n      if (active.id === \"right\") {\n        offset.left = splitters.left.pos;\n      }\n      else if (active.id === \"left\") {\n        offset.right = splitters.right.pos;\n      }\n      last.pos = getPos(event.clientX);\n      doc.body.className = \"resizing\";\n    },\n\n    mousemove: function(event) {\n      if (active) {\n        var pos = getPos(event.clientX);\n        active.resize(pos);\n      }\n    },\n\n    mouseup: function() {\n\n      if (mode == \"node\" && active.id === \"left\") {\n        win.setMinimumSize(panels.left.max + panels.center.min + panels.right.min, 0);\n      }\n\n      doc.body.className = \"\";\n      active = false;\n    },\n\n    resize: function() {\n\n      // Only run if triggered by user\n      if (!active) {\n\n        // Get new width and check if it hase changed\n        width = parent.offsetWidth;\n        var diff = width - last.width;\n        if (diff === 0 || width < minWidth) { return false; }\n\n        // If window is shrinking\n        if (diff < 0) {\n          // Check right panel for min width\n          if (panels.right.el.offsetWidth <= panels.right.min) {\n            panels.center.resize(diff, true);\n            panels.right.move(diff, true);\n            splitters.right.move(diff, true);\n          }\n        }\n\n        last.width = width;\n      }\n    }\n  };\n\n  var init = function(options) {\n\n    // Get options\n    parent = options.parent;\n\n    // Create Panels\n    panels.left = new Panel(\"left\", options.panels.left);\n    panels.center = new Panel(\"center\", options.panels.center);\n    panels.right = new Panel(\"right\", options.panels.right);\n\n    // Create Splitters\n    splitters.left = new Splitter(\"left\");\n    splitters.right = new Splitter(\"right\");\n\n    // Get width of parent\n    width = parent.offsetWidth;\n    minWidth = panels.left.min + panels.center.min + panels.right.min;\n\n    // Bind events\n    doc.onmousemove = events.mousemove;\n    doc.onmouseup = events.mouseup;\n    window.onresize = events.resize;\n\n  };\n\n  var exports = {\n    init: init,\n    panels: panels,\n    splitters: splitters\n  };\n\n  if (typeof(module) !== \"undefined\") {\n    module.exports = exports;\n  }\n  else {\n    window.Splitter = exports;\n  }\n\n}());\n"
  },
  {
    "path": "app/models/.gitkeep",
    "content": ""
  },
  {
    "path": "app/models/note.coffee",
    "content": "Spine = require 'spine'\nNotebook = require './notebook.coffee'\n\nclass window.Note extends Spine.Model\n  @configure 'Note',\n    'name',\n    'starred',\n    'excerpt',\n    'notebook',\n    'category',\n    'date'\n\n  @extend @Sync\n  @include @Sync\n\n  # Deletes it from IndexedDB\n  @.bind \"beforeDestroy\", (note) ->\n    note.deleteNote()\n\n  # since we can't change .find, we can use this to the same effect\n  @filter: (notebook, category) ->\n    # returns all the notes if no notebook specified\n    if notebook && notebook isnt \"all\"\n      array = Note.findAllByAttribute(\"notebook\", notebook)\n\n      # because 0 evals to false in JS\n      category = category.toString()\n      # returns items in a category, unless not specfied\n      if category && category isnt \"all\"\n        # matches the id number to the realname. i wish i had made a better system.\n        category = Notebook.find(notebook).categories[category]\n        newArray = []\n        for note in array\n          newArray.push(note) if note.category is category\n        array = newArray\n    else\n      array = Note.all()\n    return array\n\n  @search: (string) ->\n    # Ported from 1.0\n    results = []\n    notes = Note.all()\n    for note in notes\n      if note.name.match(new RegExp(string, 'i'))# or content.match(new RegExp(string, 'i'))\n        note.date = note.prettyDate()\n        results.push(note)\n\n    console.log(results)\n    Notebook.trigger 'changeNotebook', {id: 'all', category: 'all', search: true, result: results}\n\n  prettyDate: (time) =>\n    date = new Date(@date * 1000)\n    pad = (n) -> (if (n < 10) then (\"0\" + n) else n)\n\n    month = [\n      \"Jan\"\n      \"Feb\"\n      \"Mar\"\n      \"Apr\"\n      \"May\"\n      \"Jun\"\n      \"Jul\"\n      \"Aug\"\n      \"Sep\"\n      \"Oct\"\n      \"Nov\"\n      \"Dec\"\n    ]\n\n    now = new Date()\n    difference = 0\n    oneDay = 86400000; # 1000*60*60*24 - one day in milliseconds\n    words = ''\n\n    # Find difference between days\n    difference = Math.ceil((date.getTime() - now.getTime()) / oneDay)\n\n    # Show difference nicely\n    if difference is 0\n      words = \"Today\"\n      words = \"Yesterday\" if now.getDate() isnt date.getDate()\n    else if difference is -1\n      words = \"Yesterday\"\n    else if difference > 0\n      # If the user has a TARDIS\n      words = \"Today\"\n    else if difference > -15\n      words = Math.abs(difference) + \" days ago\"\n    else if difference > -365\n      words = month[date.getMonth()] + \" \" + date.getDate()\n    else\n      words = pad(date.getFullYear())+\"-\"+(pad(date.getMonth()+1))+\"-\"+pad(date.getDate())\n\n    words += \" \" + date.getHours() + \":\" + pad(date.getMinutes()) if time\n\n    return words\n\n\nmodule.exports = Note\n"
  },
  {
    "path": "app/models/notebook.coffee",
    "content": "Spine = require 'spine'\n\nclass window.Notebook extends Spine.Model\n  @configure 'Notebook',\n    'name',\n    'categories',\n    'date'\n\n  @extend @Sync\n\n  @.bind \"beforeUpdate\", (notebook, context) ->\n    if context isnt \"date\"\n      notebook.updateAttributes {\n        \"date\": Math.round(new Date()/1000)\n      }, \"date\"\n\n  @.bind \"beforeDestroy\", (notebook) ->\n    for note in Note.filter(notebook.id, \"all\")\n      note.destroy()\n\n  subcategoryDestroy: (category) ->\n    for note in Note.filter(Notebook.current.id, category)\n      note.destroy()\n\n    # this is a terrible hack. I will fix it maybe\n    # in theory, they can't an empty subcategory string\n    arr = @categories.slice(0)\n    arr[category] = \"\"\n    @updateAttribute 'categories', arr\n\nmodule.exports = Notebook\n"
  },
  {
    "path": "app/views/.gitkeep",
    "content": ""
  },
  {
    "path": "app/views/note.handlebars",
    "content": "<li id=\"note-{{id}}\" draggable=\"true\" data-notebook=\"{{notebook}}\">\n  <h2>{{name}}</h2>\n  <time>{{date}}  - </time><span>{{{excerpt}}}</span>\n</li>\n"
  },
  {
    "path": "app/views/notebook.handlebars",
    "content": "<li class=\"notebook\" id=\"notebook-{{id}}\"><span class=\"name\">{{name}}</span><span class=\"icon\"></span>\n<ul class=\"category\">\n  <li data-category=\"all\" class=\"selected\">All Notes</li>\n  {{#each categories}}\n  <li data-category=\"{{@index}}\">{{this}}</li>\n  {{/each}}\n</ul>\n</li>\n"
  },
  {
    "path": "css/font.scss",
    "content": "@font-face {\n  font-family: 'YK Thin';\n  font-style: normal;\n  font-weight: 400;\n  src: url(\"YanoneKaffeesatz-Thin.ttf\") format('ttf');\n}\n@font-face {\n  font-family: 'YK Sans';\n  font-style: normal;\n  font-weight: 200;\n  src: url(\"YanoneKaffeesatz-Thin.ttf\") format('ttf');\n}\n@font-face {\n  font-family: 'YK Sans';\n  font-style: normal;\n  font-weight: 300;\n  src: url(\"YanoneKaffeesatz-Light.ttf\") format('ttf');\n}\n@font-face {\n  font-family: 'PT Sans';\n  font-style: normal;\n  font-weight: 400;\n  src: url(\"YanoneKaffeesatz-Normal.ttf\") format('ttf');\n}\n@font-face {\n  font-family: 'PT Sans';\n  font-style: normal;\n  font-weight: 700;\n  src: url(\"YanoneKaffeesatz-Bold.ttf\") format('ttf');\n}"
  },
  {
    "path": "css/keyframes.scss",
    "content": "@-webkit-keyframes zoom-in {\n\t0% {\n\t\t-webkit-transform: scale(0.1) transform3d(0,0,0);\n\t}\n\n\t100% {\n\t\t-webkit-transform: scale(1) transform3d(0,0,0);\n\t}\n}\n\n@-webkit-keyframes spin {\n\t0% {\n\t\t-webkit-transform: rotate(0deg) transform3d(0,0,0);\n\t}\n\n\t100% {\n\t\t-webkit-transform: rotate(3600deg) transform3d(0,0,0);\n\t}\n}\n"
  },
  {
    "path": "css/new.scss",
    "content": "@import \"font\";\n@import \"normalize\";\n@import \"keyframes\";\n\n$light-color: #ecf0f1;\n$gray-color: #AAAAAA;\n$dark-color: #2d3235;\n\n$font: \"YK Sans\", sans-serif;\n$light-font: \"YK Thin\", sans-serif;\n\n.spin {\n\t-webkit-animation: spin 1s linear;\n}\n\n::-webkit-scrollbar {\n\twidth: 5px;\n}\n\n::-webkit-scrollbar-thumb {\n\tbackground: rgba(0,0,0,0.25);\n\tborder-radius: 2.5px;\n}\n\nbody, input, textarea {\n\tfont-family: $font;\n\toverflow: hidden;\n\n\t-webkit-font-smoothing: antialiased;\n}\n\n// Dragging stuff.\n#sidebar, #panel, #browser, .drag {\n\t-webkit-app-region: drag;\n\t-webkit-user-select: none;\n\tcursor: default!important;\n}\n\n#sidebar, #browser, .nodrag {\n\t-webkit-app-region: no-drag;\n}\n\n//\n//  ABOUT PAGE\n//\n\nbody.about {\n\ttext-align: center;\n\tfont-family: $light-font;\n\tbackground: #F0F0F0;\n\tfont-size: 16px;\n\tcolor: $dark-color;\n\tfont-weight: 200;\n\n\th1 {\n\t\tfont-weight: 400;\n\t}\n\n\tp {\n\t\tfont-size: 10px;\n\t}\n}\n\n// Panel\n\n#panel {\n\twidth: 100%;\n\theight: 15px;\n\tbackground: #FFFFFF;\n\tborder-left: 200px solid $dark-color;\n\tbox-shadow: 300px 0 0 0 $light-color inset;\n\tcursor: default;\n}\n\n#decor {\n\tdisplay: inline-block;\n\theight: 19px;\n\tmargin: 12px 9px;\n\n\tposition: absolute;\n\ttop:0;left:0;\n\n\timg {\n\t\tpadding: 3px;\n\n\t\t-webkit-transition: all 0.25s ease;\n\t}\n}\n\n#loginbox {\n\tposition: absolute;\n\ttop: 0; right: 15px;\n\ttext-align: right;\n\tpadding: 5px;\n\tcolor: lighten($dark-color, 15%);\n\n\t.name {\n\t\tdisplay: block;\n\t\ttext-transform: uppercase;\n\t\tfont-size: 10pt;\n\t\tfont-weight: 600;\n\t}\n\n\t.gopro {\n\t\tdisplay: block;\n\t\ttext-transform: lowercase;\n\t\tfont-size: 8pt;\n\t\tfont-weight: 200;\n\t}\n}\n\n#parent {\n\tposition: absolute;\n\toverflow: hidden;\n\ttop: 15px; bottom: 0;\n\tleft: 0; right: 0;\n}\n\n.panel {\n\tposition: absolute;\n\ttop: 0; bottom: 0;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n}\n\n#sidebar {\n\tposition: absolute;\n\tleft: 0;\n\n\tbackground: $dark-color;\n\tpadding-bottom: 30px;\n\n\t.container {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: 100%;\n\t\tbottom: 30px;\n\t\toverflow-x: hidden;\n\n\t\t& .title {\n\t\t\tpadding: 10px 15px;\n\t\t\tcolor: $light-color;\n\t\t\tfont-family: $light-font;\n\t\t\tfont-size: 20pt;\n\t\t\tfont-weight: 200;\n\t\t}\n\t}\n\n\tul {\n\t\tlist-style-type: none;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t}\n\n\tli.notebook {\n\t\tfont-family: $light-font;\n\t\tfont-size: 10pt;\n\t\tfont-weight: 200;\n\t\tcolor: $light-color;\n\t\tpadding: 10px 15px;\n\t\tmargin: 5px 0;\n\n\t\t&.selected {\n\t\t\tbackground: darken($dark-color, 5%);\n\t\t}\n\n\t\t.name {\n\t\t\tfont-size: 14pt;\n\t\t}\n\t}\n\n\t#settingsbar {\n\t\tposition: absolute;\n\t\tbottom: 0; left: 0;\n\t\tcolor: $light-color;\n\t\tpadding: 5px;\n\n\t\t& i {\n\t\t\tfont-size: 12pt;\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n\n\tinput {\n\t\tbackground: $dark-color;\n\t\tborder: none;\n\t\tfont-size: 14pt;\n\t\tfont-weight: 200;\n\t\tcolor: $light-color;\n\t\tpadding: 10px 15px;\n\t\tmargin: 5px 0;\n\t}\n}\n\n#browser {\n\tposition: absolute;\n\tbackground: $light-color;\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\n\t& .title {\n\t\tpadding: 10px 15px;\n\t\tcolor: $dark-color;\n\t\tfont-family: $light-font;\n\t\tfont-size: 20pt;\n\t\tfont-weight: 200;\n\t}\n\n\t& #new {\n\t\tfont-size: 18pt;\n\t\tcolor: $dark-color;\n\t\tcursor: pointer;\n\t}\n\n\tul {\n\t\tmargin: 0;\n\t\tpadding: 5px 0 0;\n\t\tlist-style-type: none;\n\t}\n\n\tli {\n\t\tcursor: default;\n\t\tpadding: 4px 15px 8px;\n\t\tcolor: $dark-color;\n\t\tline-height: 16px;\n\t\tfont-family: $light-font;\n\t\tfont-weight: 200;\n\n\t\t&.selected {\n\t\t\tbackground: darken($light-color, 5%);\n\t\t}\n\t}\n\n\th2 {\n\t\tmargin: 8px 0;\n\t\tfont-size: 14pt;\n\t\tfont-weight: 200;\n\t}\n\n\tspan {\n\t\tfont-size: 10pt;\n\t\tfont-weight: 200;\n\t}\n\n\ttime {\n\t\tdisplay: none;\n\t}\n}\n\n#editor {\n\tposition: absolute;\n\tbackground: #ffffff;\n\tright: 0;\n\n\t&.deselected {\n\t\tbackground: #FFFFFF url(img/page.svg) 50% 100px no-repeat;\n\t\tbackground-size: 140px;\n\n\t\t&::after {\n\t\t\tcontent: \"Select a note using the sidebar.\";\n\t\t\tposition: absolute;\n\t\t\ttop: 230px;\n\t\t\tfont-weight: 200;\n\t\t\tfont-size: 16pt;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tcolor: $gray-color;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\theader, #contentread, #contentwrite {\n\t\t\tdisplay: none !important;\n\t\t}\n\t}\n\n\theader {\n\t\tmargin: 0;\n\t\tbackground: #9b59b6;\n\t\tposition: absolute;\n\t\tleft: 15px; right: 15px;\n\t\tpadding: 10px;\n\n\t\t.headerwrap {\n\t\t\t-webkit-user-select: none;\n\n\t\t\t.star {\n\t\t\t\tcolor: $light-color;\n\t\t\t\tfont-size: 14pt;\n\t\t\t}\n\n\t\t\t.star.starred {\n\t\t\t\tcolor: #f1c40f;\n\t\t\t}\n\n\t\t\tinput {\n\t\t\t\tfont-weight: 200;\n\t\t\t\toutline: 0;\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: white;\n\t\t\t\tpadding: 5px;\n\t\t\t\tbackground: transparent;\n\t\t\t\tfont-size: 18pt;\n\t\t\t\tborder: 0;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tmax-width: 400px;\n\t\t\t}\n\n\t\t\t.left {\n\t\t\t\tfloat: left;\n\n\t\t\t\ttime {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.right {\n\t\t\t\tfloat: right;\n\n\t\t\t\ta {\n\t\t\t\t\tcolor: $gray-color;\n\t\t\t\t\tfont-size: 14pt;\n\t\t\t\t\tpadding: 10px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t}\n\n\t\t\t\tbutton {\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tborder: none;\n\t\t\t\t\tbackground: transparent;\n\t\t\t\t\tfont-size: 14pt;\n\t\t\t\t\tpadding: 8px;\n\t\t\t\t\toutline: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.edit {\n\t\t#contentread {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t#contentwrite {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n}\n\n#contentscroller {\n\tposition: absolute;\n\ttop: 60px; bottom: 0;\n\tleft: 0; right: 0;\n\toverflow-y: auto;\n}\n\n#contentread, #contentwrite {\n\tposition: absolute;\n\ttop: 0; bottom: 0;\n\tleft: 0; right: 0;\n\tbackground: #FFFFFF;\n\tpadding: 0 30px;\n\tcolor: $dark-color;\n\tfont-family: $font;\n}\n\n#psuedoinput {\n\tposition: fixed;\n\ttop: -9999px;\n}\n\n#contentwrite {\n\tpadding: 35px 25px;\n\tdisplay: none;\n\n\t> .inner {\n\t\twidth: 100%;\n\t\tmargin: 0;\n\t\tfont-size: 15px;\n\t\tline-height: 1.1;\n\t\tpadding: 0 0 30px;\n\t\toutline: none;\n\t\twhite-space: pre-wrap;\n\t}\n\n\t& > .wc {\n\t\tposition: fixed;\n\t\tbottom: 5px;\n\t\tright: 5px;\n\t\tborder-radius: 3px;\n\t\tfont-size: 12px;\n\t\tpadding: 5px 10px;\n\t\tbackground: #3f3b3a;\n\t\tcolor: white;\n\t\tdisplay: block-inline;\n\t}\n}\n\n#contentread {\n\tpadding: 35px 25px;\n\tbottom: auto;\n\tz-index: 4;\n\tline-height: 1.1;\n\tfont-size: 15px;\n\tfont-family: $light-font;\n\tfont-weight: 200;\n\n\t:first-child {\n\t\tmargin-top: 0;\n\t}\n\n\th1, h2, h3 {\n\t\tmargin-bottom: 0.2em;\n\t\tfont-weight: 400;\n\t}\n\n\tul {\n\t\tpadding: 0 0 0 20px;\n\t}\n\n\tp {\n\t\tmargin-top: 0.4em;\n\t}\n\n\ta {\n\t\tcolor: #2d8dd6;\n\t\ttext-decoration: none;\n\n\t\t&:hover {\n\t\t\ttext-decoration: underline;\n\t\t}\n\t}\n\n\tcode, pre {\n\t\tfont-size: 0.95em;\n\t\tline-height: 1.1;\n\t\tfont-family: monospace;\n\t}\n\n\t& > .wc {\n\t\tdisplay: none;\n\t}\n}\n\n.modal {\n\tdisplay: none;\n\tfont-size: 14px;\n\tcolor: hsl(0,0,30%);\n\twidth: 100%;\n\theight: 100%;\n\topacity: 0;\n\tz-index: 9999!important;\n\tbackground: rgba(0,0,0,0.7);\n\tposition: absolute;\n\ttop: 0; left: 0;\n\tbottom: 0; right: 0;\n\t-webkit-transition: .3s opacity ease;\n\t-webkit-user-select: none;\n\t-webkit-tap-highlight-color: rgba(0,0,0,0);\n\n\t&.show {\n\t\topacity: 1;\n\n\t\t& > div {\n\t\t\t-webkit-transition: .3s zoom-in ease linear;\n\t\t}\n\t}\n\n\t& > div {\n\t\tposition: absolute;\n\t\ttop: 15%;\n\t\tleft: 50%;\n\t\tbackground: white;\n\t\tfont-size: 16px;\n\t\tbox-shadow: 0 2px 15px rgba(0,0,0,0.2);\n\t}\n\n\t.delete-container, .error-container {\n\t\twidth: 600px;\n\t\tmargin-left: -328px;\n\t\tpadding: 25px;\n\t\ttext-align: center;\n\t\tfont-size: 18px;\n\t\tfont-weight: 200;\n\t\tcolor: $dark-color;\n\t\tborder: 5px solid #E15556;\n\n\t\th1 {\n\t\t\t-webkit-user-select: none;\n\t\t}\n\n\t\tspan.name {\n\t\t\tfont-weight: 400;\n\t\t}\n\t}\n\n\t.syncmeta-container {\n\t\twidth: 600px;\n\t\tmargin-left: -328px;\n\t\tpadding: 25px;\n\t\ttext-align: center;\n\t\tfont-size: 16px;\n\t\tfont-weight: 200;\n\t\tcolor: $dark-color;\n\t\tborder: 5px solid #66BE7F;\n\n\t\t.special {\n\t\t\tborder-color: #E15556;\n\t\t}\n\n\t\t.special.green {\n\t\t\tborder-color: #66BE7F;\n\t\t}\n\t}\n\n\t.newNote-container {\n\t\twidth: 600px;\n\t\tmargin-left: -328px;\n\t\tpadding: 25px;\n\t\ttext-align: center;\n\t\tfont-size: 16px;\n\t\tfont-weight: 200;\n\t\tcolor: $dark-color;\n\t\tborder: 5px solid #66BE7F;\n\t}\n\n\t.rename-container {\n\t\twidth: 600px;\n\t\tmargin-left: -328px;\n\t\tpadding: 25px;\n\t\ttext-align: center;\n\t\tfont-size: 16px;\n\t\tfont-weight: 200;\n\t\tcolor: $dark-color;\n\t\tborder: 5px solid $dark-color;\n\n\t\t.special {\n\t\t\tborder-color: #E15556;\n\t\t}\n\n\t\t.special.green {\n\t\t\tborder-color: #66BE7F;\n\t\t}\n\t}\n\n\t.preferences-container {\n\t\twidth: 450px;\n\t\tmargin-left: -227px;\n\t\ttext-align: center;\n\t\tfont-size: 16px;\n\t\tcolor: $dark-color;\n\t\tborder: 5px solid #9b59b6;\n\t\tfont-weight: 200;\n\n\t\t.tabs {\n\t\t\tborder-bottom: 2px solid #9b59b6;\n\n\t\t\tul {\n\t\t\t\tlist-style: none;\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding: 0;\n\t\t\t\tfont-size: 0;\n\t\t\t}\n\n\t\t\tli {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tline-height: 30px;\n\t\t\t\tfont-size: 15px;\n\t\t\t\tpadding: 0 15px;\n\t\t\t\tfont-weight: 400;\n\t\t\t\tcolor: $dark-color;\n\t\t\t\tcursor: default;\n\n\t\t\t\t&:active {\n\t\t\t\t\tcolor: darken(#9b59b6, 15%);\n\t\t\t\t}\n\n\t\t\t\t&.current {\n\t\t\t\t\tbackground: #9b59b6;\n\t\t\t\t\tcolor: white;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ta {\n\t\t\ttext-decoration: none;\n\t\t}\n\n\t\t.account {\n\t\t\tpadding: 10px;\n\n\t\t\t.pro {\n\t\t\t\tbackground: #9b59b6;\n\t\t\t\tcolor: white;\n\t\t\t\tpadding: 1px 35px 20px;\n\t\t\t\tmargin: 10px -35px;\n\n\t\t\t\tp {\n\t\t\t\t\tfont-weight: normal;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.container {\n\t\t\tpadding: 10px 25px;\n\t\t}\n\n\t\t.signedin, .signedout {\n\t\t\tpadding-bottom: 15px;\n\t\t\tp {\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\tbutton {\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\t\t}\n\n\t\t.signedin {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\tinput {\n\t\t\tdisplay: block;\n\t\t\ttext-decoration: none;\n\t\t\tborder-radius: 0.0001px;\n\t\t\tborder: 1px solid $light-color;\n\t\t\tbackground: lighten($light-color, 5%);\n\t\t\tmargin: 10px 0 0;\n\t\t\tpadding: 10px 15px;\n\t\t\tfont-size: 10pt;\n\t\t}\n\n\t\t.about, .sync, .account {\n\t\t\tdisplay: none;\n\t\t\ttext-align: left;\n\n\t\t\th1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t}\n\n\t\t\tp {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 10pt;\n\t\t\t}\n\n\t\t\t& img {\n\t\t\t\tfloat: left;\n\t\t\t\tmargin-right: 10px;\n\t\t\t}\n\n\t\t\t&.current {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n\n\tbutton.special, a.special {\n\t\tdisplay: inline-block;\n\t\ttext-decoration: none;\n\t\tborder-radius: 0.0001px;\n\t\tborder: 1px solid $light-color;\n\t\tbackground: lighten($light-color, 5%);\n\t\tmargin: 10px 0 0;\n\t\tpadding: 10px 20px;\n\t}\n}\n\n#editorcontrols {\n\tdisplay: none;\n\tposition: absolute;\n\tz-index: 1000;\n\tbackground: $dark-color;\n\tbox-shadow: 0 2px 5px rgba(0,0,0,0.2);\n}\n\n#editorcontrols button {\n\t-webkit-transition: 200ms ease all;\n\tpadding: 10px 15px;\n\tfloat: left;\n\tborder: 0;\n\tbackground: transparent;\n}\n\n#editorcontrols button:hover {\n\tbackground: rgba(0,0,0,0.15);\n}\n\n.popover-mask {\n\tdisplay: none;\n\tz-index: 100;\n\twidth: 100%;\n\theight: 100%;\n\tposition: absolute;\n\ttop: 0;\n\n\t& > div {\n\t\tdisplay: none;\n\n\t\tinput {\n\t\t\tbackground: $light-color;\n\t\t\tdisplay: block;\n\t\t\tfont-size: 14pt;\n\t\t\tfont-weight: 200;\n\t\t\tborder: 0;\n\t\t\twidth: 100%;\n\t\t\tbox-sizing: border-box;\n\t\t\tpadding: 5px 10px;\n\t\t\toutline: 0;\n\t\t\tcolor: $gray-color;\n\t\t\ttext-align: left;\n\n\t\t\t-webkit-transition: .5s all ease;\n\t\t}\n\n\t\tbutton {\n\t\t\tbackground: $light-color;\n\t\t\tdisplay: block;\n\t\t\tfont-size: 14pt;\n\t\t\tfont-weight: 200;\n\t\t\tborder: 0;\n\t\t\twidth: 100%;\n\t\t\tbox-sizing: border-box;\n\t\t\tpadding: 5px 10px;\n\t\t\toutline: 0;\n\t\t\tcolor: $gray-color;\n\t\t\ttext-align: left;\n\n\t\t\t-webkit-transition: .5s all ease;\n\t\t}\n\n\t\tbutton:hover {\n\t\t\tcolor: $dark-color;\n\t\t}\n\t}\n}\n\n.delete-popover, .category-popover {\n\tdisplay: inline-block;\n\twidth: 300px;\n\theight: 36px;\n\tposition: absolute;\n\n\t.arrow {\n\t\tdisplay: none;\n\t}\n\n\t.container {\n\t\tdisplay: inline-block;\n\t\tbackground: $light-color;\n\t\twidth: 150px;\n\t\tvertical-align: top;\n\t\tpadding: 5px;\n\t\tbox-shadow: 0 0 5px rgba(0,0,0,0.2);\n\t}\n\n\tinput {\n\t\twidth: 100px;\n\t}\n}\n\n.category { display: none; }\n\n.expanded .category { display: block; }\n\n.category .selected { font-weight: 400; }\n\n\nimg.emoji {\n\twidth: 20px;\n\theight: 20px;\n}\n"
  },
  {
    "path": "css/normalize.scss",
    "content": "/*! normalize.css v1.0.1 | MIT License | git.io/normalize */\n\n/* ==========================================================================\n   HTML5 display definitions\n   ========================================================================== */\n\n/*\n * Corrects `block` display not defined in IE 6/7/8/9 and Firefox 3.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection,\nsummary {\n    display: block;\n}\n\n/*\n * Corrects `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.\n */\n\naudio,\ncanvas,\nvideo {\n    display: inline-block;\n    *display: inline;\n    *zoom: 1;\n}\n\n/*\n * Prevents modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n    display: none;\n    height: 0;\n}\n\n/*\n * Addresses styling for `hidden` attribute not present in IE 7/8/9, Firefox 3,\n * and Safari 4.\n * Known issue: no IE 6 support.\n */\n\n[hidden] {\n    display: none;\n}\n\n/* ==========================================================================\n   Base\n   ========================================================================== */\n\n/*\n * 1. Corrects text resizing oddly in IE 6/7 when body `font-size` is set using\n *    `em` units.\n * 2. Prevents iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\n\nhtml {\n    font-size: 100%; /* 1 */\n    -webkit-text-size-adjust: 100%; /* 2 */\n    -ms-text-size-adjust: 100%; /* 2 */\n}\n\n/*\n * Addresses `font-family` inconsistency between `textarea` and other form\n * elements.\n */\n\nhtml,\nbutton,\ninput,\nselect,\ntextarea {\n    font-family: sans-serif;\n}\n\n/*\n * Addresses margins handled incorrectly in IE 6/7.\n */\n\nbody {\n    margin: 0;\n}\n\n/* ==========================================================================\n   Links\n   ========================================================================== */\n\n/*\n * Addresses `outline` inconsistency between Chrome and other browsers.\n */\n\na:focus {\n    outline: thin dotted;\n}\n\n/*\n * Improves readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n    outline: 0;\n}\n\n/* ==========================================================================\n   Typography\n   ========================================================================== */\n\n/*\n * Addresses font sizes and margins set differently in IE 6/7.\n * Addresses font sizes within `section` and `article` in Firefox 4+, Safari 5,\n * and Chrome.\n */\n\nh1 {\n    font-size: 2em;\n    margin: 0.67em 0;\n}\n\nh2 {\n    font-size: 1.5em;\n    margin: 0.83em 0;\n}\n\nh3 {\n    font-size: 1.17em;\n    margin: 1em 0;\n}\n\nh4 {\n    font-size: 1em;\n    margin: 1.33em 0;\n}\n\nh5 {\n    font-size: 0.83em;\n    margin: 1.67em 0;\n}\n\nh6 {\n    font-size: 0.75em;\n    margin: 2.33em 0;\n}\n\n/*\n * Addresses styling not present in IE 7/8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n    border-bottom: 1px dotted;\n}\n\n/*\n * Addresses style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome.\n */\n\nb,\nstrong {\n    font-weight: bold;\n}\n\nblockquote {\n    margin: 1em 40px;\n}\n\n/*\n * Addresses styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n    font-style: italic;\n}\n\n/*\n * Addresses styling not present in IE 6/7/8/9.\n */\n\nmark {\n    background: #ff0;\n    color: #000;\n}\n\n/*\n * Addresses margins set differently in IE 6/7.\n */\n\np,\npre {\n    margin: 1em 0;\n}\n\n/*\n * Corrects font family set oddly in IE 6, Safari 4/5, and Chrome.\n */\n\ncode,\nkbd,\npre,\nsamp {\n    font-family: 'Source Code Pro', monospace;\n    font-size: 1em;\n}\n\n/*\n * Improves readability of pre-formatted text in all browsers.\n */\n\npre {\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n}\n\n/*\n * Addresses CSS quotes not supported in IE 6/7.\n */\n\nq {\n    quotes: none;\n}\n\n/*\n * Addresses `quotes` property not supported in Safari 4.\n */\n\nq:before,\nq:after {\n    content: '';\n    content: none;\n}\n\n/*\n * Addresses inconsistent and variable font size in all browsers.\n */\n\nsmall {\n    font-size: 80%;\n}\n\n/*\n * Prevents `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n}\n\nsup {\n    top: -0.5em;\n}\n\nsub {\n    bottom: -0.25em;\n}\n\n/* ==========================================================================\n   Lists\n   ========================================================================== */\n\n/*\n * Addresses margins set differently in IE 6/7.\n */\n\ndl,\nmenu,\nol,\nul {\n    margin: 1em 0;\n}\n\ndd {\n    margin: 0 0 0 40px;\n}\n\n/*\n * Addresses paddings set differently in IE 6/7.\n */\n\nmenu,\nol,\nul {\n    padding: 0 0 0 40px;\n}\n\n/*\n * Corrects list images handled incorrectly in IE 7.\n */\n\nnav ul,\nnav ol {\n    list-style: none;\n    list-style-image: none;\n}\n\n/* ==========================================================================\n   Embedded content\n   ========================================================================== */\n\n/*\n * 1. Removes border when inside `a` element in IE 6/7/8/9 and Firefox 3.\n * 2. Improves image quality when scaled in IE 7.\n */\n\nimg {\n    border: 0; /* 1 */\n    -ms-interpolation-mode: bicubic; /* 2 */\n}\n\n/*\n * Corrects overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n    overflow: hidden;\n}\n\n/* ==========================================================================\n   Figures\n   ========================================================================== */\n\n/*\n * Addresses margin not present in IE 6/7/8/9, Safari 5, and Opera 11.\n */\n\nfigure {\n    margin: 0;\n}\n\n/* ==========================================================================\n   Forms\n   ========================================================================== */\n\n/*\n * Corrects margin displayed oddly in IE 6/7.\n */\n\nform {\n    margin: 0;\n}\n\n/*\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n    border: 1px solid #c0c0c0;\n    margin: 0 2px;\n    padding: 0.35em 0.625em 0.75em;\n}\n\n/*\n * 1. Corrects color not being inherited in IE 6/7/8/9.\n * 2. Corrects text not wrapping in Firefox 3.\n * 3. Corrects alignment displayed oddly in IE 6/7.\n */\n\nlegend {\n    border: 0; /* 1 */\n    padding: 0;\n    white-space: normal; /* 2 */\n    *margin-left: -7px; /* 3 */\n}\n\n/*\n * 1. Corrects font size not being inherited in all browsers.\n * 2. Addresses margins set differently in IE 6/7, Firefox 3+, Safari 5,\n *    and Chrome.\n * 3. Improves appearance and consistency in all browsers.\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n    font-size: 100%; /* 1 */\n    margin: 0; /* 2 */\n    vertical-align: baseline; /* 3 */\n    *vertical-align: middle; /* 3 */\n}\n\n/*\n * Addresses Firefox 3+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\nbutton,\ninput {\n    line-height: normal;\n}\n\n/*\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Corrects inability to style clickable `input` types in iOS.\n * 3. Improves usability and consistency of cursor style between image-type\n *    `input` and others.\n * 4. Removes inner spacing in IE 7 without affecting normal text inputs.\n *    Known issue: inner spacing remains in IE 6.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n    -webkit-appearance: button; /* 2 */\n    cursor: pointer; /* 3 */\n    *overflow: visible;  /* 4 */\n}\n\n/*\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\ninput[disabled] {\n    cursor: default;\n}\n\n/*\n * 1. Addresses box sizing set to content-box in IE 8/9.\n * 2. Removes excess padding in IE 8/9.\n * 3. Removes excess padding in IE 7.\n *    Known issue: excess padding remains in IE 6.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n    box-sizing: border-box; /* 1 */\n    padding: 0; /* 2 */\n    *height: 13px; /* 3 */\n    *width: 13px; /* 3 */\n}\n\n/*\n * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome\n *    (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n    -webkit-appearance: textfield; /* 1 */\n    -moz-box-sizing: content-box;\n    -webkit-box-sizing: content-box; /* 2 */\n    box-sizing: content-box;\n}\n\n/*\n * Removes inner padding and search cancel button in Safari 5 and Chrome\n * on OS X.\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n    -webkit-appearance: none;\n}\n\n/*\n * Removes inner padding and border in Firefox 3+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n    border: 0;\n    padding: 0;\n}\n\n/*\n * 1. Removes default vertical scrollbar in IE 6/7/8/9.\n * 2. Improves readability and alignment in all browsers.\n */\n\ntextarea {\n    overflow: auto; /* 1 */\n    vertical-align: top; /* 2 */\n}\n\n/* ==========================================================================\n   Tables\n   ========================================================================== */\n\n/*\n * Remove most spacing between table cells.\n */\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"main\": \"src/main.js\",\n    \"name\": \"Springseed\",\n    \"version\": \"2.0.0\",\n    \"repository\": {\n        \"type\":\"git\",\n        \"url\": \"http://github.com/springseednotes/springseed.git\"\n    },\n    \"window\": {\n        \"toolbar\": true,\n        \"width\": 1024,\n        \"height\": 600,\n        \"position\": \"center\",\n        \"min_width\": 300,\n        \"min_height\": 500\n    },\n    \"dependencies\": {\n        \"underscore\": \"1.4.x\",\n        \"jqueryify\": \"~1.9.1\",\n        \"spine\": \"~1.1.x\",\n        \"marked\": \"0.2.9\",\n        \"socket.io-client\": \"0.9.16\",\n        \"highlight.js\": \"7.3.0\",\n        \"open\": \"0.0.5\",\n        \"analytics-node\": \"1.0.4\"\n    },\n    \"devDependencies\": {\n        \"handlebars\": \"1.0.x\",\n        \"coffee-script\": \"1.7.x\",\n        \"browserify\": \"4.1.x\",\n        \"coffeeify\": \"0.6.x\"\n    }\n}\n"
  },
  {
    "path": "public/about.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>About</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"application.css\"/>\n  </head>\n  <body class=\"about\">\n    <img src=\"img/icon.svg\" height=\"150\">\n    <h1>Springseed <small>2.0</small></h1>\n    <p>Copyright &copy; 2012-2014 Springseed.</p>\n    <p><a href=\"http://getspringseed.com\">http://getspringseed.com/</a></p>\n  </body>\n</html>\n"
  },
  {
    "path": "public/default.json",
    "content": "[\n\t{\n\t\t\"name\": \"Springseed!\",\n\t\t\"content\": \"Springseed 2.0 is here and there's a lot going on. We finally have a Twitter and Google+ page, which means that we're going to keep you updated with what is going on with Springseed.\\n\\nOur Twitter can be found at http://twitter.com/springseednotes whereas our Google+ page can be found at http://plus.google.com/+Getspringseed - we hope that you follow us on these platforms because it's great to let you know what's happening.\\n\\nIn other news, we're also working on other cool stuff so do try and get involved as much as you can, it means a lot to us!\\n\\nOh, and before we forgot, we also have IRC! We can be found at irc.freenode.net in #springseed\"\n\t}\n]\n"
  },
  {
    "path": "public/emojify.js",
    "content": "/*! emojify.js - v0.9.2 - \n * Copyright (c) Hassan Khan 2014\n */!function(a){\"use strict\";var b=function(){function b(a){return\" \"===a||\"\t\"===a||\"\\r\"===a||\"\\n\"===a||\"\"===a}function c(a,b,c){var d=i.createElement(\"img\");d.setAttribute(\"title\",\":\"+c+\":\"),d.setAttribute(\"alt\",\":\"+c+\":\"),d.setAttribute(\"class\",\"emoji\"),d.setAttribute(\"src\",q.img_dir+\"/\"+c+\".png\"),d.setAttribute(\"align\",\"absmiddle\"),a.splitText(b.index),a.nextSibling.nodeValue=a.nextSibling.nodeValue.substr(b[0].length,a.nextSibling.nodeValue.length),d.appendChild(a.splitText(b.index)),a.parentNode.insertBefore(d,a.nextSibling)}function d(a){if(a[1]&&a[2]){var b=a[2];if(l[b])return b}else for(var c=3;c<a.length-1;c++)if(a[c])return n[c-2][1]}function e(a,b){return\"<img title=':\"+b+\":' alt=':\"+b+\":' class='emoji' src='\"+q.img_dir+\"/\"+b+\".png' align='absmiddle' />\"}function f(){this.lastEmojiTerminatedAt=-1}function g(a,b){if(!a)return a;b||(b=e);var c=new f;return a.replace(p,function(){var a=Array.prototype.slice.call(arguments,0,-2),d=arguments[arguments.length-2],e=arguments[arguments.length-1],f=c.validate(a,d,e);return f?b(arguments[0],f):arguments[0]})}function h(a){\"undefined\"==typeof a&&(a=q.only_crawl_id?i.getElementById(q.only_crawl_id):i.body);for(var b,e=q.ignored_tags,g=i.createTreeWalker(a,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,function(a){return 1!==a.nodeType?NodeFilter.FILTER_ACCEPT:e[a.tagName]||a.classList.contains(\"no-emojify\")?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_SKIP},!1),h=[];null!==(b=g.nextNode());)h.push(b);h.forEach(function(a){for(var b,e=[],g=new f;null!==(b=p.exec(a.data));)g.validate(b,b.index,b.input)&&e.push(b);for(var h=e.length;h-->0;){var i=d(e[h]);c(a,e[h],i)}})}var i=a.window.document,j=\"100,109,1234,-1,+1,8ball,abcd,abc,ab,accept,aerial_tramway,airplane,alarm_clock,alien,ambulance,anchor,angel,anger,angry,anguished,ant,a,apple,aquarius,aries,arrow_backward,arrow_double_down,arrow_double_up,arrow_down,arrow_down_small,arrow_forward,arrow_heading_down,arrow_heading_up,arrow_left,arrow_lower_left,arrow_lower_right,arrow_right_hook,arrow_right,arrows_clockwise,arrows_counterclockwise,arrow_up_down,arrow_upper_left,arrow_upper_right,arrow_up,arrow_up_small,articulated_lorry,art,astonished,atm,baby_bottle,baby_chick,baby,baby_symbol,baggage_claim,balloon,ballot_box_with_check,bamboo,banana,bangbang,bank,barber,bar_chart,baseball,basketball,bath,bathtub,battery,bear,bee,beer,beers,beetle,beginner,bell,bento,bicyclist,bike,bikini,bird,birthday,black_circle,black_joker,black_nib,black_square_button,black_square,blossom,blowfish,blue_book,blue_car,blue_heart,blush,boar,boat,bomb,bookmark,bookmark_tabs,book,books,boom,boot,bouquet,bowling,bow,bowtie,boy,b,bread,bride_with_veil,bridge_at_night,briefcase,broken_heart,bug,bulb,bullettrain_front,bullettrain_side,bus,busstop,bust_in_silhouette,busts_in_silhouette,cactus,cake,calendar,calling,camel,camera,cancer,candy,capital_abcd,capricorn,card_index,carousel_horse,car,cat2,cat,cd,chart,chart_with_downwards_trend,chart_with_upwards_trend,checkered_flag,cherries,cherry_blossom,chestnut,chicken,children_crossing,chocolate_bar,christmas_tree,church,cinema,circus_tent,city_sunrise,city_sunset,clapper,clap,clipboard,clock1030,clock10,clock1130,clock11,clock1230,clock12,clock130,clock1,clock230,clock2,clock330,clock3,clock430,clock4,clock530,clock5,clock630,clock6,clock730,clock7,clock830,clock8,clock930,clock9,closed_book,closed_lock_with_key,closed_umbrella,cloud,cl,clubs,cn,cocktail,coffee,cold_sweat,collision,computer,confetti_ball,confounded,confused,congratulations,construction,construction_worker,convenience_store,cookie,cool,cop,copyright,corn,couplekiss,couple,couple_with_heart,cow2,cow,credit_card,crocodile,crossed_flags,crown,crying_cat_face,cry,crystal_ball,cupid,curly_loop,currency_exchange,curry,custard,customs,cyclone,dancer,dancers,dango,dart,dash,date,deciduous_tree,department_store,de,diamond_shape_with_a_dot_inside,diamonds,disappointed,disappointed_relieved,dizzy_face,dizzy,dog2,dog,dollar,dolls,dolphin,do_not_litter,donut,door,doughnut,dragon_face,dragon,dress,dromedary_camel,droplet,dvd,ear_of_rice,ear,earth_africa,earth_americas,earth_asia,eggplant,egg,eight,eight_pointed_black_star,eight_spoked_asterisk,electric_plug,elephant,e-mail,email,end,envelope,es,european_castle,european_post_office,euro,evergreen_tree,exclamation,expressionless,eyeglasses,eyes,facepunch,factory,fallen_leaf,family,fast_forward,fax,fearful,feelsgood,feet,ferris_wheel,file_folder,finnadie,fire_engine,fire,fireworks,first_quarter_moon,first_quarter_moon_with_face,fish_cake,fishing_pole_and_fish,fish,fist,five,flags,flashlight,floppy_disk,flower_playing_cards,flushed,foggy,football,fork_and_knife,fountain,four_leaf_clover,four,free,fried_shrimp,fries,frog,frowning,fr,fuelpump,full_moon,full_moon_with_face,fu,game_die,gb,gemini,gem,ghost,gift_heart,gift,girl,globe_with_meridians,goat,goberserk,godmode,golf,grapes,green_apple,green_book,green_heart,grey_exclamation,grey_question,grimacing,grinning,grin,guardsman,guitar,gun,haircut,hamburger,hammer,hamster,handbag,hand,hankey,hash,hatched_chick,hatching_chick,headphones,hear_no_evil,heartbeat,heart_decoration,heart_eyes_cat,heart_eyes,heart,heartpulse,hearts,heavy_check_mark,heavy_division_sign,heavy_dollar_sign,heavy_exclamation_mark,heavy_minus_sign,heavy_multiplication_x,heavy_plus_sign,helicopter,herb,hibiscus,high_brightness,high_heel,hocho,honeybee,honey_pot,horse,horse_racing,hospital,hotel,hotsprings,hourglass_flowing_sand,hourglass,house,house_with_garden,hurtrealbad,hushed,ice_cream,icecream,ideograph_advantage,id,imp,inbox_tray,incoming_envelope,information_desk_person,information_source,innocent,interrobang,iphone,it,izakaya_lantern,jack_o_lantern,japanese_castle,japanese_goblin,japanese_ogre,japan,jeans,joy_cat,joy,jp,keycap_ten,key,kimono,kissing_cat,kissing_closed_eyes,kissing_face,kissing_heart,kissing,kissing_smiling_eyes,kiss,koala,koko,kr,large_blue_circle,large_blue_diamond,large_orange_diamond,last_quarter_moon,last_quarter_moon_with_face,laughing,leaves,ledger,left_luggage,left_right_arrow,leftwards_arrow_with_hook,lemon,leopard,leo,libra,light_rail,link,lips,lipstick,lock,lock_with_ink_pen,lollipop,loop,loudspeaker,love_hotel,love_letter,low_brightness,mag,mag_right,mahjong,mailbox_closed,mailbox,mailbox_with_mail,mailbox_with_no_mail,man,mans_shoe,man_with_gua_pi_mao,man_with_turban,maple_leaf,mask,massage,meat_on_bone,mega,melon,memo,mens,metal,metro,microphone,microscope,milky_way,minibus,minidisc,mobile_phone_off,moneybag,money_with_wings,monkey_face,monkey,monorail,moon,mortar_board,mountain_bicyclist,mountain_cableway,mountain_railway,mount_fuji,mouse2,mouse,movie_camera,moyai,m,muscle,mushroom,musical_keyboard,musical_note,musical_score,mute,nail_care,name_badge,neckbeard,necktie,negative_squared_cross_mark,neutral_face,new_moon,new_moon_with_face,new,newspaper,ng,nine,no_bell,no_bicycles,no_entry,no_entry_sign,no_good,no_mobile_phones,no_mouth,non-potable_water,no_pedestrians,nose,no_smoking,notebook,notebook_with_decorative_cover,notes,nut_and_bolt,o2,ocean,octocat,octopus,oden,office,ok_hand,ok,ok_woman,older_man,older_woman,oncoming_automobile,oncoming_bus,oncoming_police_car,oncoming_taxi,one,on,open_file_folder,open_hands,open_mouth,ophiuchus,o,orange_book,outbox_tray,ox,page_facing_up,pager,page_with_curl,palm_tree,panda_face,paperclip,parking,part_alternation_mark,partly_sunny,passport_control,paw_prints,peach,pear,pencil2,pencil,penguin,pensive,performing_arts,persevere,person_frowning,person_with_blond_hair,person_with_pouting_face,phone,pig2,pig_nose,pig,pill,pineapple,pisces,pizza,plus1,point_down,point_left,point_right,point_up_2,point_up,police_car,poodle,poop,postal_horn,postbox,post_office,potable_water,pouch,poultry_leg,pound,pouting_cat,pray,princess,punch,purple_heart,purse,pushpin,put_litter_in_its_place,question,rabbit2,rabbit,racehorse,radio_button,radio,rage1,rage2,rage3,rage4,rage,railway_car,rainbow,raised_hand,raised_hands,raising_hand,ramen,ram,rat,recycle,red_car,red_circle,registered,relaxed,relieved,repeat_one,repeat,restroom,revolving_hearts,rewind,ribbon,rice_ball,rice_cracker,rice,rice_scene,ring,rocket,roller_coaster,rooster,rose,rotating_light,round_pushpin,rowboat,rugby_football,runner,running,running_shirt_with_sash,ru,sagittarius,sailboat,sake,sandal,santa,sa,satellite,satisfied,saxophone,school,school_satchel,scissors,scorpius,scream_cat,scream,scroll,seat,secret,seedling,see_no_evil,seven,shaved_ice,sheep,shell,shipit,ship,shirt,shit,shoe,shower,signal_strength,six,six_pointed_star,ski,skull,sleeping,sleepy,slot_machine,small_blue_diamond,small_orange_diamond,small_red_triangle_down,small_red_triangle,smile_cat,smile,smiley_cat,smiley,smiling_imp,smirk_cat,smirk,smoking,snail,snake,snowboarder,snowflake,snowman,sob,soccer,soon,sos,sound,space_invader,spades,spaghetti,sparkler,sparkles,sparkling_heart,speaker,speak_no_evil,speech_balloon,speedboat,squirrel,star2,star,stars,station,statue_of_liberty,steam_locomotive,stew,straight_ruler,strawberry,stuck_out_tongue_closed_eyes,stuck_out_tongue,stuck_out_tongue_winking_eye,sunflower,sunglasses,sunny,sunrise_over_mountains,sunrise,sun_with_face,surfer,sushi,suspect,suspension_railway,sweat_drops,sweat,sweat_smile,sweet_potato,swimmer,symbols,syringe,tada,tanabata_tree,tangerine,taurus,taxi,tea,telephone,telephone_receiver,telescope,tennis,tent,thought_balloon,three,thumbsdown,thumbsup,ticket,tiger2,tiger,tired_face,tm,toilet,tokyo_tower,tomato,tongue,tophat,top,tractor,traffic_light,train2,train,tram,triangular_flag_on_post,triangular_ruler,trident,triumph,trolleybus,trollface,trophy,tropical_drink,tropical_fish,truck,trumpet,tshirt,tulip,turtle,tv,twisted_rightwards_arrows,two_hearts,two_men_holding_hands,two,two_women_holding_hands,u5272,u5408,u55b6,u6307,u6708,u6709,u6e80,u7121,u7533,u7981,u7a7a,uk,umbrella,unamused,underage,unlock,up,us,vertical_traffic_light,vhs,vibration_mode,video_camera,video_game,violin,virgo,volcano,v,vs,walking,waning_crescent_moon,waning_gibbous_moon,warning,watch,water_buffalo,watermelon,wave,wavy_dash,waxing_crescent_moon,waxing_gibbous_moon,wc,weary,wedding,whale2,whale,wheelchair,white_check_mark,white_circle,white_flower,white_large_square,white_square_button,white_square,wind_chime,wine_glass,wink2,wink,wolf,woman,womans_clothes,womans_hat,womens,worried,wrench,x,yellow_heart,yen,yum,zap,zero,zzz\",k=j.split(/,/),l=k.reduce(function(a,b){return a[b]=!0,a},{}),m={named:/:([a-z0-9A-Z_-]+):/,blush:/:-?\\)/g,scream:/:-o/gi,smirk:/[:;]-?]/g,smiley:/[:;]-?d/gi,stuck_out_tongue_closed_eyes:/x-d/gi,stuck_out_tongue_winking_eye:/[:;]-?p/gi,rage:/:-?[\\[@]/g,disappointed:/:-?\\(/g,sob:/:['’]-?\\(|:&#x27;\\(/g,kissing_heart:/:-?\\*/g,wink:/;-?\\)/g,pensive:/:-?\\//g,confounded:/:-?s/gi,flushed:/:-?\\|/g,relaxed:/:-?\\$/g,mask:/:-x/gi,heart:/<3|&lt;3/g,broken_heart:/<\\/3|&lt;&#x2F;3/g,thumbsup:/:\\+1:/g,thumbsdown:/:\\-1:/g},n=Object.keys(m).map(function(a){return[m[a],a]}),o=n.map(function(a){var b=a[0],c=b.source||b;return c=c.replace(/(^|[^\\[])\\^/g,\"$1\"),\"(\"+c+\")\"}).join(\"|\"),p=new RegExp(o,\"gi\"),q={emojify_tag_type:\"div\",only_crawl_id:null,img_dir:\"images/emoji\",ignored_tags:{SCRIPT:1,TEXTAREA:1,A:1,PRE:1,CODE:1}};return f.prototype={validate:function(a,c,e){function f(){return g.lastEmojiTerminatedAt=j+c,h}var g=this,h=d(a);if(h){var i=a[0],j=i.length;if(0===c)return f();if(e.length===i.length+c)return f();var k=this.lastEmojiTerminatedAt===c;if(k)return f();if(b(e.charAt(c-1)))return f();var l=b(e.charAt(i.length+c));return l&&k?f():void 0}}},{defaultConfig:q,emojiNames:k,setConfig:function(a){Object.keys(q).forEach(function(b){b in a&&(q[b]=a[b])})},replace:g,run:h}}();return a.emojify=b,\"function\"==typeof define&&define.amd&&define([],function(){return b}),b}(this);"
  },
  {
    "path": "public/handlebars.runtime.js",
    "content": "/*\n\nCopyright (C) 2011 by Yehuda Katz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\n// lib/handlebars/browser-prefix.js\nvar Handlebars = {};\n\n(function(Handlebars, undefined) {\n;\n// lib/handlebars/base.js\n\nHandlebars.VERSION = \"1.0.0\";\nHandlebars.COMPILER_REVISION = 4;\n\nHandlebars.REVISION_CHANGES = {\n  1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n  2: '== 1.0.0-rc.3',\n  3: '== 1.0.0-rc.4',\n  4: '>= 1.0.0'\n};\n\nHandlebars.helpers  = {};\nHandlebars.partials = {};\n\nvar toString = Object.prototype.toString,\n    functionType = '[object Function]',\n    objectType = '[object Object]';\n\nHandlebars.registerHelper = function(name, fn, inverse) {\n  if (toString.call(name) === objectType) {\n    if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }\n    Handlebars.Utils.extend(this.helpers, name);\n  } else {\n    if (inverse) { fn.not = inverse; }\n    this.helpers[name] = fn;\n  }\n};\n\nHandlebars.registerPartial = function(name, str) {\n  if (toString.call(name) === objectType) {\n    Handlebars.Utils.extend(this.partials,  name);\n  } else {\n    this.partials[name] = str;\n  }\n};\n\nHandlebars.registerHelper('helperMissing', function(arg) {\n  if(arguments.length === 2) {\n    return undefined;\n  } else {\n    throw new Error(\"Missing helper: '\" + arg + \"'\");\n  }\n});\n\nHandlebars.registerHelper('blockHelperMissing', function(context, options) {\n  var inverse = options.inverse || function() {}, fn = options.fn;\n\n  var type = toString.call(context);\n\n  if(type === functionType) { context = context.call(this); }\n\n  if(context === true) {\n    return fn(this);\n  } else if(context === false || context == null) {\n    return inverse(this);\n  } else if(type === \"[object Array]\") {\n    if(context.length > 0) {\n      return Handlebars.helpers.each(context, options);\n    } else {\n      return inverse(this);\n    }\n  } else {\n    return fn(context);\n  }\n});\n\nHandlebars.K = function() {};\n\nHandlebars.createFrame = Object.create || function(object) {\n  Handlebars.K.prototype = object;\n  var obj = new Handlebars.K();\n  Handlebars.K.prototype = null;\n  return obj;\n};\n\nHandlebars.logger = {\n  DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,\n\n  methodMap: {0: 'debug', 1: 'info', 2: 'warn', 3: 'error'},\n\n  // can be overridden in the host environment\n  log: function(level, obj) {\n    if (Handlebars.logger.level <= level) {\n      var method = Handlebars.logger.methodMap[level];\n      if (typeof console !== 'undefined' && console[method]) {\n        console[method].call(console, obj);\n      }\n    }\n  }\n};\n\nHandlebars.log = function(level, obj) { Handlebars.logger.log(level, obj); };\n\nHandlebars.registerHelper('each', function(context, options) {\n  var fn = options.fn, inverse = options.inverse;\n  var i = 0, ret = \"\", data;\n\n  var type = toString.call(context);\n  if(type === functionType) { context = context.call(this); }\n\n  if (options.data) {\n    data = Handlebars.createFrame(options.data);\n  }\n\n  if(context && typeof context === 'object') {\n    if(context instanceof Array){\n      for(var j = context.length; i<j; i++) {\n        if (data) { data.index = i; }\n        ret = ret + fn(context[i], { data: data });\n      }\n    } else {\n      for(var key in context) {\n        if(context.hasOwnProperty(key)) {\n          if(data) { data.key = key; }\n          ret = ret + fn(context[key], {data: data});\n          i++;\n        }\n      }\n    }\n  }\n\n  if(i === 0){\n    ret = inverse(this);\n  }\n\n  return ret;\n});\n\nHandlebars.registerHelper('if', function(conditional, options) {\n  var type = toString.call(conditional);\n  if(type === functionType) { conditional = conditional.call(this); }\n\n  if(!conditional || Handlebars.Utils.isEmpty(conditional)) {\n    return options.inverse(this);\n  } else {\n    return options.fn(this);\n  }\n});\n\nHandlebars.registerHelper('unless', function(conditional, options) {\n  return Handlebars.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn});\n});\n\nHandlebars.registerHelper('with', function(context, options) {\n  var type = toString.call(context);\n  if(type === functionType) { context = context.call(this); }\n\n  if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);\n});\n\nHandlebars.registerHelper('log', function(context, options) {\n  var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;\n  Handlebars.log(level, context);\n});\n;\n// lib/handlebars/utils.js\n\nvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nHandlebars.Exception = function(message) {\n  var tmp = Error.prototype.constructor.apply(this, arguments);\n\n  // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n  for (var idx = 0; idx < errorProps.length; idx++) {\n    this[errorProps[idx]] = tmp[errorProps[idx]];\n  }\n};\nHandlebars.Exception.prototype = new Error();\n\n// Build out our basic SafeString type\nHandlebars.SafeString = function(string) {\n  this.string = string;\n};\nHandlebars.SafeString.prototype.toString = function() {\n  return this.string.toString();\n};\n\nvar escape = {\n  \"&\": \"&amp;\",\n  \"<\": \"&lt;\",\n  \">\": \"&gt;\",\n  '\"': \"&quot;\",\n  \"'\": \"&#x27;\",\n  \"`\": \"&#x60;\"\n};\n\nvar badChars = /[&<>\"'`]/g;\nvar possible = /[&<>\"'`]/;\n\nvar escapeChar = function(chr) {\n  return escape[chr] || \"&amp;\";\n};\n\nHandlebars.Utils = {\n  extend: function(obj, value) {\n    for(var key in value) {\n      if(value.hasOwnProperty(key)) {\n        obj[key] = value[key];\n      }\n    }\n  },\n\n  escapeExpression: function(string) {\n    // don't escape SafeStrings, since they're already safe\n    if (string instanceof Handlebars.SafeString) {\n      return string.toString();\n    } else if (string == null || string === false) {\n      return \"\";\n    }\n\n    // Force a string conversion as this will be done by the append regardless and\n    // the regex test will do this transparently behind the scenes, causing issues if\n    // an object's to string has escaped characters in it.\n    string = string.toString();\n\n    if(!possible.test(string)) { return string; }\n    return string.replace(badChars, escapeChar);\n  },\n\n  isEmpty: function(value) {\n    if (!value && value !== 0) {\n      return true;\n    } else if(toString.call(value) === \"[object Array]\" && value.length === 0) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n};\n;\n// lib/handlebars/runtime.js\n\nHandlebars.VM = {\n  template: function(templateSpec) {\n    // Just add water\n    var container = {\n      escapeExpression: Handlebars.Utils.escapeExpression,\n      invokePartial: Handlebars.VM.invokePartial,\n      programs: [],\n      program: function(i, fn, data) {\n        var programWrapper = this.programs[i];\n        if(data) {\n          programWrapper = Handlebars.VM.program(i, fn, data);\n        } else if (!programWrapper) {\n          programWrapper = this.programs[i] = Handlebars.VM.program(i, fn);\n        }\n        return programWrapper;\n      },\n      merge: function(param, common) {\n        var ret = param || common;\n\n        if (param && common) {\n          ret = {};\n          Handlebars.Utils.extend(ret, common);\n          Handlebars.Utils.extend(ret, param);\n        }\n        return ret;\n      },\n      programWithDepth: Handlebars.VM.programWithDepth,\n      noop: Handlebars.VM.noop,\n      compilerInfo: null\n    };\n\n    return function(context, options) {\n      options = options || {};\n      var result = templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);\n\n      var compilerInfo = container.compilerInfo || [],\n          compilerRevision = compilerInfo[0] || 1,\n          currentRevision = Handlebars.COMPILER_REVISION;\n\n      if (compilerRevision !== currentRevision) {\n        if (compilerRevision < currentRevision) {\n          var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],\n              compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];\n          throw \"Template was precompiled with an older version of Handlebars than the current runtime. \"+\n                \"Please update your precompiler to a newer version (\"+runtimeVersions+\") or downgrade your runtime to an older version (\"+compilerVersions+\").\";\n        } else {\n          // Use the embedded version info since the runtime doesn't know about this revision yet\n          throw \"Template was precompiled with a newer version of Handlebars than the current runtime. \"+\n                \"Please update your runtime to a newer version (\"+compilerInfo[1]+\").\";\n        }\n      }\n\n      return result;\n    };\n  },\n\n  programWithDepth: function(i, fn, data /*, $depth */) {\n    var args = Array.prototype.slice.call(arguments, 3);\n\n    var program = function(context, options) {\n      options = options || {};\n\n      return fn.apply(this, [context, options.data || data].concat(args));\n    };\n    program.program = i;\n    program.depth = args.length;\n    return program;\n  },\n  program: function(i, fn, data) {\n    var program = function(context, options) {\n      options = options || {};\n\n      return fn(context, options.data || data);\n    };\n    program.program = i;\n    program.depth = 0;\n    return program;\n  },\n  noop: function() { return \"\"; },\n  invokePartial: function(partial, name, context, helpers, partials, data) {\n    var options = { helpers: helpers, partials: partials, data: data };\n\n    if(partial === undefined) {\n      throw new Handlebars.Exception(\"The partial \" + name + \" could not be found\");\n    } else if(partial instanceof Function) {\n      return partial(context, options);\n    } else if (!Handlebars.compile) {\n      throw new Handlebars.Exception(\"The partial \" + name + \" could not be compiled when running in runtime-only mode\");\n    } else {\n      partials[name] = Handlebars.compile(partial, {data: data !== undefined});\n      return partials[name](context, options);\n    }\n  }\n};\n\nHandlebars.template = Handlebars.VM.template;\n;\n// lib/handlebars/browser-suffix.js\n})(Handlebars);\n;\n"
  },
  {
    "path": "public/images/emoji/emojify.css",
    "content": ".emojify{width:1.5em;height:1.5em;display:inline-block;margin-bottom:-0.25em}.emojify.alien{background:url(alien.png) no-repeat;background-size:1.5em}.emojify.angel{background:url(angel.png) no-repeat;background-size:1.5em}.emojify.anger{background:url(anger.png) no-repeat;background-size:1.5em}.emojify.angry{background:url(angry.png) no-repeat;background-size:1.5em}.emojify.anguished{background:url(anguished.png) no-repeat;background-size:1.5em}.emojify.astonished{background:url(astonished.png) no-repeat;background-size:1.5em}.emojify.baby{background:url(baby.png) no-repeat;background-size:1.5em}.emojify.blue_heart{background:url(blue_heart.png) no-repeat;background-size:1.5em}.emojify.blush{background:url(blush.png) no-repeat;background-size:1.5em}.emojify.boom{background:url(boom.png) no-repeat;background-size:1.5em}.emojify.bow{background:url(bow.png) no-repeat;background-size:1.5em}.emojify.bowtie{background:url(bowtie.png) no-repeat;background-size:1.5em}.emojify.boy{background:url(boy.png) no-repeat;background-size:1.5em}.emojify.bride_with_veil{background:url(bride_with_veil.png) no-repeat;background-size:1.5em}.emojify.broken_heart{background:url(broken_heart.png) no-repeat;background-size:1.5em}.emojify.bust_in_silhouette{background:url(bust_in_silhouette.png) no-repeat;background-size:1.5em}.emojify.busts_in_silhouette{background:url(busts_in_silhouette.png) no-repeat;background-size:1.5em}.emojify.clap{background:url(clap.png) no-repeat;background-size:1.5em}.emojify.cold_sweat{background:url(cold_sweat.png) no-repeat;background-size:1.5em}.emojify.collision{background:url(collision.png) no-repeat;background-size:1.5em}.emojify.confounded{background:url(confounded.png) no-repeat;background-size:1.5em}.emojify.confused{background:url(confused.png) no-repeat;background-size:1.5em}.emojify.construction_worker{background:url(construction_worker.png) no-repeat;background-size:1.5em}.emojify.cop{background:url(cop.png) no-repeat;background-size:1.5em}.emojify.couple_with_heart{background:url(couple_with_heart.png) no-repeat;background-size:1.5em}.emojify.couple{background:url(couple.png) no-repeat;background-size:1.5em}.emojify.couplekiss{background:url(couplekiss.png) no-repeat;background-size:1.5em}.emojify.cry{background:url(cry.png) no-repeat;background-size:1.5em}.emojify.crying_cat_face{background:url(crying_cat_face.png) no-repeat;background-size:1.5em}.emojify.cupid{background:url(cupid.png) no-repeat;background-size:1.5em}.emojify.dancer{background:url(dancer.png) no-repeat;background-size:1.5em}.emojify.dancers{background:url(dancers.png) no-repeat;background-size:1.5em}.emojify.dash{background:url(dash.png) no-repeat;background-size:1.5em}.emojify.disappointed{background:url(disappointed.png) no-repeat;background-size:1.5em}.emojify.dizzy_face{background:url(dizzy_face.png) no-repeat;background-size:1.5em}.emojify.dizzy{background:url(dizzy.png) no-repeat;background-size:1.5em}.emojify.droplet{background:url(droplet.png) no-repeat;background-size:1.5em}.emojify.ear{background:url(ear.png) no-repeat;background-size:1.5em}.emojify.exclamation{background:url(exclamation.png) no-repeat;background-size:1.5em}.emojify.expressionless{background:url(expressionless.png) no-repeat;background-size:1.5em}.emojify.eyes{background:url(eyes.png) no-repeat;background-size:1.5em}.emojify.facepunch{background:url(facepunch.png) no-repeat;background-size:1.5em}.emojify.family{background:url(family.png) no-repeat;background-size:1.5em}.emojify.fearful{background:url(fearful.png) no-repeat;background-size:1.5em}.emojify.feelsgood{background:url(feelsgood.png) no-repeat;background-size:1.5em}.emojify.feet{background:url(feet.png) no-repeat;background-size:1.5em}.emojify.finnadie{background:url(finnadie.png) no-repeat;background-size:1.5em}.emojify.fire{background:url(fire.png) no-repeat;background-size:1.5em}.emojify.fist{background:url(fist.png) no-repeat;background-size:1.5em}.emojify.flushed{background:url(flushed.png) no-repeat;background-size:1.5em}.emojify.frowning{background:url(frowning.png) no-repeat;background-size:1.5em}.emojify.girl{background:url(girl.png) no-repeat;background-size:1.5em}.emojify.goberserk{background:url(goberserk.png) no-repeat;background-size:1.5em}.emojify.godmode{background:url(godmode.png) no-repeat;background-size:1.5em}.emojify.green_heart{background:url(green_heart.png) no-repeat;background-size:1.5em}.emojify.grey_exclamation{background:url(grey_exclamation.png) no-repeat;background-size:1.5em}.emojify.grey_question{background:url(grey_question.png) no-repeat;background-size:1.5em}.emojify.grimacing{background:url(grimacing.png) no-repeat;background-size:1.5em}.emojify.grin{background:url(grin.png) no-repeat;background-size:1.5em}.emojify.grinning{background:url(grinning.png) no-repeat;background-size:1.5em}.emojify.guardsman{background:url(guardsman.png) no-repeat;background-size:1.5em}.emojify.haircut{background:url(haircut.png) no-repeat;background-size:1.5em}.emojify.hand{background:url(hand.png) no-repeat;background-size:1.5em}.emojify.hankey{background:url(hankey.png) no-repeat;background-size:1.5em}.emojify.hear_no_evil{background:url(hear_no_evil.png) no-repeat;background-size:1.5em}.emojify.heart_eyes_cat{background:url(heart_eyes_cat.png) no-repeat;background-size:1.5em}.emojify.heart_eyes{background:url(heart_eyes.png) no-repeat;background-size:1.5em}.emojify.heart{background:url(heart.png) no-repeat;background-size:1.5em}.emojify.heartbeat{background:url(heartbeat.png) no-repeat;background-size:1.5em}.emojify.heartpulse{background:url(heartpulse.png) no-repeat;background-size:1.5em}.emojify.hurtrealbad{background:url(hurtrealbad.png) no-repeat;background-size:1.5em}.emojify.hushed{background:url(hushed.png) no-repeat;background-size:1.5em}.emojify.imp{background:url(imp.png) no-repeat;background-size:1.5em}.emojify.information_desk_person{background:url(information_desk_person.png) no-repeat;background-size:1.5em}.emojify.innocent{background:url(innocent.png) no-repeat;background-size:1.5em}.emojify.japanese_goblin{background:url(japanese_goblin.png) no-repeat;background-size:1.5em}.emojify.japanese_ogre{background:url(japanese_ogre.png) no-repeat;background-size:1.5em}.emojify.joy_cat{background:url(joy_cat.png) no-repeat;background-size:1.5em}.emojify.joy{background:url(joy.png) no-repeat;background-size:1.5em}.emojify.kiss{background:url(kiss.png) no-repeat;background-size:1.5em}.emojify.kissing_cat{background:url(kissing_cat.png) no-repeat;background-size:1.5em}.emojify.kissing_closed_eyes{background:url(kissing_closed_eyes.png) no-repeat;background-size:1.5em}.emojify.kissing_heart{background:url(kissing_heart.png) no-repeat;background-size:1.5em}.emojify.kissing_smiling_eyes{background:url(kissing_smiling_eyes.png) no-repeat;background-size:1.5em}.emojify.kissing{background:url(kissing.png) no-repeat;background-size:1.5em}.emojify.laughing{background:url(laughing.png) no-repeat;background-size:1.5em}.emojify.lips{background:url(lips.png) no-repeat;background-size:1.5em}.emojify.love_letter{background:url(love_letter.png) no-repeat;background-size:1.5em}.emojify.man_with_gua_pi_mao{background:url(man_with_gua_pi_mao.png) no-repeat;background-size:1.5em}.emojify.man_with_turban{background:url(man_with_turban.png) no-repeat;background-size:1.5em}.emojify.man{background:url(man.png) no-repeat;background-size:1.5em}.emojify.mask{background:url(mask.png) no-repeat;background-size:1.5em}.emojify.massage{background:url(massage.png) no-repeat;background-size:1.5em}.emojify.metal{background:url(metal.png) no-repeat;background-size:1.5em}.emojify.muscle{background:url(muscle.png) no-repeat;background-size:1.5em}.emojify.musical_note{background:url(musical_note.png) no-repeat;background-size:1.5em}.emojify.nail_care{background:url(nail_care.png) no-repeat;background-size:1.5em}.emojify.neckbeard{background:url(neckbeard.png) no-repeat;background-size:1.5em}.emojify.neutral_face{background:url(neutral_face.png) no-repeat;background-size:1.5em}.emojify.no_good{background:url(no_good.png) no-repeat;background-size:1.5em}.emojify.no_mouth{background:url(no_mouth.png) no-repeat;background-size:1.5em}.emojify.nose{background:url(nose.png) no-repeat;background-size:1.5em}.emojify.notes{background:url(notes.png) no-repeat;background-size:1.5em}.emojify.ok_hand{background:url(ok_hand.png) no-repeat;background-size:1.5em}.emojify.ok_woman{background:url(ok_woman.png) no-repeat;background-size:1.5em}.emojify.older_man{background:url(older_man.png) no-repeat;background-size:1.5em}.emojify.older_woman{background:url(older_woman.png) no-repeat;background-size:1.5em}.emojify.open_hands{background:url(open_hands.png) no-repeat;background-size:1.5em}.emojify.open_mouth{background:url(open_mouth.png) no-repeat;background-size:1.5em}.emojify.pensive{background:url(pensive.png) no-repeat;background-size:1.5em}.emojify.persevere{background:url(persevere.png) no-repeat;background-size:1.5em}.emojify.person_frowning{background:url(person_frowning.png) no-repeat;background-size:1.5em}.emojify.person_with_blond_hair{background:url(person_with_blond_hair.png) no-repeat;background-size:1.5em}.emojify.person_with_pouting_face{background:url(person_with_pouting_face.png) no-repeat;background-size:1.5em}.emojify.point_down{background:url(point_down.png) no-repeat;background-size:1.5em}.emojify.point_left{background:url(point_left.png) no-repeat;background-size:1.5em}.emojify.point_right{background:url(point_right.png) no-repeat;background-size:1.5em}.emojify.point_up_2{background:url(point_up_2.png) no-repeat;background-size:1.5em}.emojify.point_up{background:url(point_up.png) no-repeat;background-size:1.5em}.emojify.poop{background:url(poop.png) no-repeat;background-size:1.5em}.emojify.pouting_cat{background:url(pouting_cat.png) no-repeat;background-size:1.5em}.emojify.pray{background:url(pray.png) no-repeat;background-size:1.5em}.emojify.princess{background:url(princess.png) no-repeat;background-size:1.5em}.emojify.punch{background:url(punch.png) no-repeat;background-size:1.5em}.emojify.purple_heart{background:url(purple_heart.png) no-repeat;background-size:1.5em}.emojify.question{background:url(question.png) no-repeat;background-size:1.5em}.emojify.rage{background:url(rage.png) no-repeat;background-size:1.5em}.emojify.rage1{background:url(rage1.png) no-repeat;background-size:1.5em}.emojify.rage2{background:url(rage2.png) no-repeat;background-size:1.5em}.emojify.rage3{background:url(rage3.png) no-repeat;background-size:1.5em}.emojify.rage4{background:url(rage4.png) no-repeat;background-size:1.5em}.emojify.raised_hand{background:url(raised_hand.png) no-repeat;background-size:1.5em}.emojify.raised_hands{background:url(raised_hands.png) no-repeat;background-size:1.5em}.emojify.relaxed{background:url(relaxed.png) no-repeat;background-size:1.5em}.emojify.relieved{background:url(relieved.png) no-repeat;background-size:1.5em}.emojify.revolving_hearts{background:url(revolving_hearts.png) no-repeat;background-size:1.5em}.emojify.runner{background:url(runner.png) no-repeat;background-size:1.5em}.emojify.running{background:url(running.png) no-repeat;background-size:1.5em}.emojify.satisfied{background:url(satisfied.png) no-repeat;background-size:1.5em}.emojify.scream_cat{background:url(scream_cat.png) no-repeat;background-size:1.5em}.emojify.scream{background:url(scream.png) no-repeat;background-size:1.5em}.emojify.see_no_evil{background:url(see_no_evil.png) no-repeat;background-size:1.5em}.emojify.shit{background:url(shit.png) no-repeat;background-size:1.5em}.emojify.skull{background:url(skull.png) no-repeat;background-size:1.5em}.emojify.sleeping{background:url(sleeping.png) no-repeat;background-size:1.5em}.emojify.sleepy{background:url(sleepy.png) no-repeat;background-size:1.5em}.emojify.smile_cat{background:url(smile_cat.png) no-repeat;background-size:1.5em}.emojify.smile{background:url(smile.png) no-repeat;background-size:1.5em}.emojify.smiley_cat{background:url(smiley_cat.png) no-repeat;background-size:1.5em}.emojify.smiley{background:url(smiley.png) no-repeat;background-size:1.5em}.emojify.smiling_imp{background:url(smiling_imp.png) no-repeat;background-size:1.5em}.emojify.smirk_cat{background:url(smirk_cat.png) no-repeat;background-size:1.5em}.emojify.smirk{background:url(smirk.png) no-repeat;background-size:1.5em}.emojify.sob{background:url(sob.png) no-repeat;background-size:1.5em}.emojify.sparkling_heart{background:url(sparkling_heart.png) no-repeat;background-size:1.5em}.emojify.sparkles{background:url(sparkles.png) no-repeat;background-size:1.5em}.emojify.speak_no_evil{background:url(speak_no_evil.png) no-repeat;background-size:1.5em}.emojify.speech_balloon{background:url(speech_balloon.png) no-repeat;background-size:1.5em}.emojify.star{background:url(star.png) no-repeat;background-size:1.5em}.emojify.star2{background:url(star2.png) no-repeat;background-size:1.5em}.emojify.stuck_out_tongue_closed_eyes{background:url(stuck_out_tongue_closed_eyes.png) no-repeat;background-size:1.5em}.emojify.stuck_out_tongue_winking_eye{background:url(stuck_out_tongue_winking_eye.png) no-repeat;background-size:1.5em}.emojify.stuck_out_tongue{background:url(stuck_out_tongue.png) no-repeat;background-size:1.5em}.emojify.sunglasses{background:url(sunglasses.png) no-repeat;background-size:1.5em}.emojify.suspect{background:url(suspect.png) no-repeat;background-size:1.5em}.emojify.sweat_drops{background:url(sweat_drops.png) no-repeat;background-size:1.5em}.emojify.sweat_smile{background:url(sweat_smile.png) no-repeat;background-size:1.5em}.emojify.sweat{background:url(sweat.png) no-repeat;background-size:1.5em}.emojify.thought_balloon{background:url(thought_balloon.png) no-repeat;background-size:1.5em}.emojify.thumbsdown{background:url(thumbsdown.png) no-repeat;background-size:1.5em}.emojify.thumbsup{background:url(thumbsup.png) no-repeat;background-size:1.5em}.emojify.tired_face{background:url(tired_face.png) no-repeat;background-size:1.5em}.emojify.tongue{background:url(tongue.png) no-repeat;background-size:1.5em}.emojify.triumph{background:url(triumph.png) no-repeat;background-size:1.5em}.emojify.trollface{background:url(trollface.png) no-repeat;background-size:1.5em}.emojify.two_hearts{background:url(two_hearts.png) no-repeat;background-size:1.5em}.emojify.two_men_holding_hands{background:url(two_men_holding_hands.png) no-repeat;background-size:1.5em}.emojify.two_women_holding_hands{background:url(two_women_holding_hands.png) no-repeat;background-size:1.5em}.emojify.unamused{background:url(unamused.png) no-repeat;background-size:1.5em}.emojify.v{background:url(v.png) no-repeat;background-size:1.5em}.emojify.walking{background:url(walking.png) no-repeat;background-size:1.5em}.emojify.wave{background:url(wave.png) no-repeat;background-size:1.5em}.emojify.weary{background:url(weary.png) no-repeat;background-size:1.5em}.emojify.wink2{background:url(wink2.png) no-repeat;background-size:1.5em}.emojify.wink{background:url(wink.png) no-repeat;background-size:1.5em}.emojify.woman{background:url(woman.png) no-repeat;background-size:1.5em}.emojify.worried{background:url(worried.png) no-repeat;background-size:1.5em}.emojify.yellow_heart{background:url(yellow_heart.png) no-repeat;background-size:1.5em}.emojify.yum{background:url(yum.png) no-repeat;background-size:1.5em}.emojify.zzz{background:url(zzz.png) no-repeat;background-size:1.5em}.emojify.sunny{background:url(sunny.png) no-repeat;background-size:1.5em}.emojify.umbrella{background:url(umbrella.png) no-repeat;background-size:1.5em}.emojify.cloud{background:url(cloud.png) no-repeat;background-size:1.5em}.emojify.snowflake{background:url(snowflake.png) no-repeat;background-size:1.5em}.emojify.snowman{background:url(snowman.png) no-repeat;background-size:1.5em}.emojify.zap{background:url(zap.png) no-repeat;background-size:1.5em}.emojify.cyclone{background:url(cyclone.png) no-repeat;background-size:1.5em}.emojify.foggy{background:url(foggy.png) no-repeat;background-size:1.5em}.emojify.ocean{background:url(ocean.png) no-repeat;background-size:1.5em}.emojify.cat{background:url(cat.png) no-repeat;background-size:1.5em}.emojify.dog{background:url(dog.png) no-repeat;background-size:1.5em}.emojify.mouse{background:url(mouse.png) no-repeat;background-size:1.5em}.emojify.hamster{background:url(hamster.png) no-repeat;background-size:1.5em}.emojify.rabbit{background:url(rabbit.png) no-repeat;background-size:1.5em}.emojify.wolf{background:url(wolf.png) no-repeat;background-size:1.5em}.emojify.frog{background:url(frog.png) no-repeat;background-size:1.5em}.emojify.tiger{background:url(tiger.png) no-repeat;background-size:1.5em}.emojify.koala{background:url(koala.png) no-repeat;background-size:1.5em}.emojify.bear{background:url(bear.png) no-repeat;background-size:1.5em}.emojify.pig{background:url(pig.png) no-repeat;background-size:1.5em}.emojify.pig_nose{background:url(pig_nose.png) no-repeat;background-size:1.5em}.emojify.cow{background:url(cow.png) no-repeat;background-size:1.5em}.emojify.boar{background:url(boar.png) no-repeat;background-size:1.5em}.emojify.monkey_face{background:url(monkey_face.png) no-repeat;background-size:1.5em}.emojify.monkey{background:url(monkey.png) no-repeat;background-size:1.5em}.emojify.horse{background:url(horse.png) no-repeat;background-size:1.5em}.emojify.racehorse{background:url(racehorse.png) no-repeat;background-size:1.5em}.emojify.camel{background:url(camel.png) no-repeat;background-size:1.5em}.emojify.sheep{background:url(sheep.png) no-repeat;background-size:1.5em}.emojify.elephant{background:url(elephant.png) no-repeat;background-size:1.5em}.emojify.panda_face{background:url(panda_face.png) no-repeat;background-size:1.5em}.emojify.snake{background:url(snake.png) no-repeat;background-size:1.5em}.emojify.bird{background:url(bird.png) no-repeat;background-size:1.5em}.emojify.baby_chick{background:url(baby_chick.png) no-repeat;background-size:1.5em}.emojify.hatched_chick{background:url(hatched_chick.png) no-repeat;background-size:1.5em}.emojify.hatching_chick{background:url(hatching_chick.png) no-repeat;background-size:1.5em}.emojify.chicken{background:url(chicken.png) no-repeat;background-size:1.5em}.emojify.penguin{background:url(penguin.png) no-repeat;background-size:1.5em}.emojify.turtle{background:url(turtle.png) no-repeat;background-size:1.5em}.emojify.bug{background:url(bug.png) no-repeat;background-size:1.5em}.emojify.honeybee{background:url(honeybee.png) no-repeat;background-size:1.5em}.emojify.ant{background:url(ant.png) no-repeat;background-size:1.5em}.emojify.beetle{background:url(beetle.png) no-repeat;background-size:1.5em}.emojify.snail{background:url(snail.png) no-repeat;background-size:1.5em}.emojify.octopus{background:url(octopus.png) no-repeat;background-size:1.5em}.emojify.tropical_fish{background:url(tropical_fish.png) no-repeat;background-size:1.5em}.emojify.fish{background:url(fish.png) no-repeat;background-size:1.5em}.emojify.whale{background:url(whale.png) no-repeat;background-size:1.5em}.emojify.whale2{background:url(whale2.png) no-repeat;background-size:1.5em}.emojify.dolphin{background:url(dolphin.png) no-repeat;background-size:1.5em}.emojify.cow2{background:url(cow2.png) no-repeat;background-size:1.5em}.emojify.ram{background:url(ram.png) no-repeat;background-size:1.5em}.emojify.rat{background:url(rat.png) no-repeat;background-size:1.5em}.emojify.water_buffalo{background:url(water_buffalo.png) no-repeat;background-size:1.5em}.emojify.tiger2{background:url(tiger2.png) no-repeat;background-size:1.5em}.emojify.rabbit2{background:url(rabbit2.png) no-repeat;background-size:1.5em}.emojify.dragon{background:url(dragon.png) no-repeat;background-size:1.5em}.emojify.goat{background:url(goat.png) no-repeat;background-size:1.5em}.emojify.rooster{background:url(rooster.png) no-repeat;background-size:1.5em}.emojify.dog2{background:url(dog2.png) no-repeat;background-size:1.5em}.emojify.pig2{background:url(pig2.png) no-repeat;background-size:1.5em}.emojify.mouse2{background:url(mouse2.png) no-repeat;background-size:1.5em}.emojify.ox{background:url(ox.png) no-repeat;background-size:1.5em}.emojify.dragon_face{background:url(dragon_face.png) no-repeat;background-size:1.5em}.emojify.blowfish{background:url(blowfish.png) no-repeat;background-size:1.5em}.emojify.crocodile{background:url(crocodile.png) no-repeat;background-size:1.5em}.emojify.dromedary_camel{background:url(dromedary_camel.png) no-repeat;background-size:1.5em}.emojify.leopard{background:url(leopard.png) no-repeat;background-size:1.5em}.emojify.cat2{background:url(cat2.png) no-repeat;background-size:1.5em}.emojify.poodle{background:url(poodle.png) no-repeat;background-size:1.5em}.emojify.paw_prints{background:url(paw_prints.png) no-repeat;background-size:1.5em}.emojify.bouquet{background:url(bouquet.png) no-repeat;background-size:1.5em}.emojify.cherry_blossom{background:url(cherry_blossom.png) no-repeat;background-size:1.5em}.emojify.tulip{background:url(tulip.png) no-repeat;background-size:1.5em}.emojify.four_leaf_clover{background:url(four_leaf_clover.png) no-repeat;background-size:1.5em}.emojify.rose{background:url(rose.png) no-repeat;background-size:1.5em}.emojify.sunflower{background:url(sunflower.png) no-repeat;background-size:1.5em}.emojify.hibiscus{background:url(hibiscus.png) no-repeat;background-size:1.5em}.emojify.maple_leaf{background:url(maple_leaf.png) no-repeat;background-size:1.5em}.emojify.leaves{background:url(leaves.png) no-repeat;background-size:1.5em}.emojify.fallen_leaf{background:url(fallen_leaf.png) no-repeat;background-size:1.5em}.emojify.herb{background:url(herb.png) no-repeat;background-size:1.5em}.emojify.mushroom{background:url(mushroom.png) no-repeat;background-size:1.5em}.emojify.cactus{background:url(cactus.png) no-repeat;background-size:1.5em}.emojify.palm_tree{background:url(palm_tree.png) no-repeat;background-size:1.5em}.emojify.evergreen_tree{background:url(evergreen_tree.png) no-repeat;background-size:1.5em}.emojify.deciduous_tree{background:url(deciduous_tree.png) no-repeat;background-size:1.5em}.emojify.chestnut{background:url(chestnut.png) no-repeat;background-size:1.5em}.emojify.seedling{background:url(seedling.png) no-repeat;background-size:1.5em}.emojify.blossom{background:url(blossom.png) no-repeat;background-size:1.5em}.emojify.ear_of_rice{background:url(ear_of_rice.png) no-repeat;background-size:1.5em}.emojify.shell{background:url(shell.png) no-repeat;background-size:1.5em}.emojify.globe_with_meridians{background:url(globe_with_meridians.png) no-repeat;background-size:1.5em}.emojify.sun_with_face{background:url(sun_with_face.png) no-repeat;background-size:1.5em}.emojify.full_moon_with_face{background:url(full_moon_with_face.png) no-repeat;background-size:1.5em}.emojify.new_moon_with_face{background:url(new_moon_with_face.png) no-repeat;background-size:1.5em}.emojify.new_moon{background:url(new_moon.png) no-repeat;background-size:1.5em}.emojify.waxing_crescent_moon{background:url(waxing_crescent_moon.png) no-repeat;background-size:1.5em}.emojify.first_quarter_moon{background:url(first_quarter_moon.png) no-repeat;background-size:1.5em}.emojify.waxing_gibbous_moon{background:url(waxing_gibbous_moon.png) no-repeat;background-size:1.5em}.emojify.full_moon{background:url(full_moon.png) no-repeat;background-size:1.5em}.emojify.waning_gibbous_moon{background:url(waning_gibbous_moon.png) no-repeat;background-size:1.5em}.emojify.last_quarter_moon{background:url(last_quarter_moon.png) no-repeat;background-size:1.5em}.emojify.waning_crescent_moon{background:url(waning_crescent_moon.png) no-repeat;background-size:1.5em}.emojify.last_quarter_moon_with_face{background:url(last_quarter_moon_with_face.png) no-repeat;background-size:1.5em}.emojify.first_quarter_moon_with_face{background:url(first_quarter_moon_with_face.png) no-repeat;background-size:1.5em}.emojify.moon{background:url(moon.png) no-repeat;background-size:1.5em}.emojify.earth_africa{background:url(earth_africa.png) no-repeat;background-size:1.5em}.emojify.earth_americas{background:url(earth_americas.png) no-repeat;background-size:1.5em}.emojify.earth_asia{background:url(earth_asia.png) no-repeat;background-size:1.5em}.emojify.volcano{background:url(volcano.png) no-repeat;background-size:1.5em}.emojify.milky_way{background:url(milky_way.png) no-repeat;background-size:1.5em}.emojify.partly_sunny{background:url(partly_sunny.png) no-repeat;background-size:1.5em}.emojify.octocat{background:url(octocat.png) no-repeat;background-size:1.5em}.emojify.squirrel{background:url(squirrel.png) no-repeat;background-size:1.5em}.emojify.bamboo{background:url(bamboo.png) no-repeat;background-size:1.5em}.emojify.gift_heart{background:url(gift_heart.png) no-repeat;background-size:1.5em}.emojify.dolls{background:url(dolls.png) no-repeat;background-size:1.5em}.emojify.school_satchel{background:url(school_satchel.png) no-repeat;background-size:1.5em}.emojify.mortar_board{background:url(mortar_board.png) no-repeat;background-size:1.5em}.emojify.flags{background:url(flags.png) no-repeat;background-size:1.5em}.emojify.fireworks{background:url(fireworks.png) no-repeat;background-size:1.5em}.emojify.sparkler{background:url(sparkler.png) no-repeat;background-size:1.5em}.emojify.wind_chime{background:url(wind_chime.png) no-repeat;background-size:1.5em}.emojify.rice_scene{background:url(rice_scene.png) no-repeat;background-size:1.5em}.emojify.jack_o_lantern{background:url(jack_o_lantern.png) no-repeat;background-size:1.5em}.emojify.ghost{background:url(ghost.png) no-repeat;background-size:1.5em}.emojify.santa{background:url(santa.png) no-repeat;background-size:1.5em}.emojify.christmas_tree{background:url(christmas_tree.png) no-repeat;background-size:1.5em}.emojify.gift{background:url(gift.png) no-repeat;background-size:1.5em}.emojify.bell{background:url(bell.png) no-repeat;background-size:1.5em}.emojify.no_bell{background:url(no_bell.png) no-repeat;background-size:1.5em}.emojify.tanabata_tree{background:url(tanabata_tree.png) no-repeat;background-size:1.5em}.emojify.tada{background:url(tada.png) no-repeat;background-size:1.5em}.emojify.confetti_ball{background:url(confetti_ball.png) no-repeat;background-size:1.5em}.emojify.balloon{background:url(balloon.png) no-repeat;background-size:1.5em}.emojify.crystal_ball{background:url(crystal_ball.png) no-repeat;background-size:1.5em}.emojify.cd{background:url(cd.png) no-repeat;background-size:1.5em}.emojify.dvd{background:url(dvd.png) no-repeat;background-size:1.5em}.emojify.floppy_disk{background:url(floppy_disk.png) no-repeat;background-size:1.5em}.emojify.camera{background:url(camera.png) no-repeat;background-size:1.5em}.emojify.video_camera{background:url(video_camera.png) no-repeat;background-size:1.5em}.emojify.movie_camera{background:url(movie_camera.png) no-repeat;background-size:1.5em}.emojify.computer{background:url(computer.png) no-repeat;background-size:1.5em}.emojify.tv{background:url(tv.png) no-repeat;background-size:1.5em}.emojify.iphone{background:url(iphone.png) no-repeat;background-size:1.5em}.emojify.phone{background:url(phone.png) no-repeat;background-size:1.5em}.emojify.telephone{background:url(telephone.png) no-repeat;background-size:1.5em}.emojify.telephone_receiver{background:url(telephone_receiver.png) no-repeat;background-size:1.5em}.emojify.pager{background:url(pager.png) no-repeat;background-size:1.5em}.emojify.fax{background:url(fax.png) no-repeat;background-size:1.5em}.emojify.minidisc{background:url(minidisc.png) no-repeat;background-size:1.5em}.emojify.vhs{background:url(vhs.png) no-repeat;background-size:1.5em}.emojify.sound{background:url(sound.png) no-repeat;background-size:1.5em}.emojify.speaker{background:url(speaker.png) no-repeat;background-size:1.5em}.emojify.mute{background:url(mute.png) no-repeat;background-size:1.5em}.emojify.loudspeaker{background:url(loudspeaker.png) no-repeat;background-size:1.5em}.emojify.mega{background:url(mega.png) no-repeat;background-size:1.5em}.emojify.hourglass{background:url(hourglass.png) no-repeat;background-size:1.5em}.emojify.hourglass_flowing_sand{background:url(hourglass_flowing_sand.png) no-repeat;background-size:1.5em}.emojify.alarm_clock{background:url(alarm_clock.png) no-repeat;background-size:1.5em}.emojify.watch{background:url(watch.png) no-repeat;background-size:1.5em}.emojify.radio{background:url(radio.png) no-repeat;background-size:1.5em}.emojify.satellite{background:url(satellite.png) no-repeat;background-size:1.5em}.emojify.loop{background:url(loop.png) no-repeat;background-size:1.5em}.emojify.mag{background:url(mag.png) no-repeat;background-size:1.5em}.emojify.mag_right{background:url(mag_right.png) no-repeat;background-size:1.5em}.emojify.unlock{background:url(unlock.png) no-repeat;background-size:1.5em}.emojify.lock{background:url(lock.png) no-repeat;background-size:1.5em}.emojify.lock_with_ink_pen{background:url(lock_with_ink_pen.png) no-repeat;background-size:1.5em}.emojify.closed_lock_with_key{background:url(closed_lock_with_key.png) no-repeat;background-size:1.5em}.emojify.key{background:url(key.png) no-repeat;background-size:1.5em}.emojify.bulb{background:url(bulb.png) no-repeat;background-size:1.5em}.emojify.flashlight{background:url(flashlight.png) no-repeat;background-size:1.5em}.emojify.high_brightness{background:url(high_brightness.png) no-repeat;background-size:1.5em}.emojify.low_brightness{background:url(low_brightness.png) no-repeat;background-size:1.5em}.emojify.electric_plug{background:url(electric_plug.png) no-repeat;background-size:1.5em}.emojify.battery{background:url(battery.png) no-repeat;background-size:1.5em}.emojify.calling{background:url(calling.png) no-repeat;background-size:1.5em}.emojify.email{background:url(email.png) no-repeat;background-size:1.5em}.emojify.mailbox{background:url(mailbox.png) no-repeat;background-size:1.5em}.emojify.postbox{background:url(postbox.png) no-repeat;background-size:1.5em}.emojify.bath{background:url(bath.png) no-repeat;background-size:1.5em}.emojify.bathtub{background:url(bathtub.png) no-repeat;background-size:1.5em}.emojify.shower{background:url(shower.png) no-repeat;background-size:1.5em}.emojify.toilet{background:url(toilet.png) no-repeat;background-size:1.5em}.emojify.wrench{background:url(wrench.png) no-repeat;background-size:1.5em}.emojify.nut_and_bolt{background:url(nut_and_bolt.png) no-repeat;background-size:1.5em}.emojify.hammer{background:url(hammer.png) no-repeat;background-size:1.5em}.emojify.seat{background:url(seat.png) no-repeat;background-size:1.5em}.emojify.moneybag{background:url(moneybag.png) no-repeat;background-size:1.5em}.emojify.yen{background:url(yen.png) no-repeat;background-size:1.5em}.emojify.dollar{background:url(dollar.png) no-repeat;background-size:1.5em}.emojify.pound{background:url(pound.png) no-repeat;background-size:1.5em}.emojify.euro{background:url(euro.png) no-repeat;background-size:1.5em}.emojify.credit_card{background:url(credit_card.png) no-repeat;background-size:1.5em}.emojify.money_with_wings{background:url(money_with_wings.png) no-repeat;background-size:1.5em}.emojify.e-mail{background:url(e-mail.png) no-repeat;background-size:1.5em}.emojify.inbox_tray{background:url(inbox_tray.png) no-repeat;background-size:1.5em}.emojify.outbox_tray{background:url(outbox_tray.png) no-repeat;background-size:1.5em}.emojify.envelope{background:url(envelope.png) no-repeat;background-size:1.5em}.emojify.incoming_envelope{background:url(incoming_envelope.png) no-repeat;background-size:1.5em}.emojify.postal_horn{background:url(postal_horn.png) no-repeat;background-size:1.5em}.emojify.mailbox_closed{background:url(mailbox_closed.png) no-repeat;background-size:1.5em}.emojify.mailbox_with_mail{background:url(mailbox_with_mail.png) no-repeat;background-size:1.5em}.emojify.mailbox_with_no_mail{background:url(mailbox_with_no_mail.png) no-repeat;background-size:1.5em}.emojify.door{background:url(door.png) no-repeat;background-size:1.5em}.emojify.smoking{background:url(smoking.png) no-repeat;background-size:1.5em}.emojify.bomb{background:url(bomb.png) no-repeat;background-size:1.5em}.emojify.gun{background:url(gun.png) no-repeat;background-size:1.5em}.emojify.hocho{background:url(hocho.png) no-repeat;background-size:1.5em}.emojify.pill{background:url(pill.png) no-repeat;background-size:1.5em}.emojify.syringe{background:url(syringe.png) no-repeat;background-size:1.5em}.emojify.page_facing_up{background:url(page_facing_up.png) no-repeat;background-size:1.5em}.emojify.page_with_curl{background:url(page_with_curl.png) no-repeat;background-size:1.5em}.emojify.bookmark_tabs{background:url(bookmark_tabs.png) no-repeat;background-size:1.5em}.emojify.bar_chart{background:url(bar_chart.png) no-repeat;background-size:1.5em}.emojify.chart_with_upwards_trend{background:url(chart_with_upwards_trend.png) no-repeat;background-size:1.5em}.emojify.chart_with_downwards_trend{background:url(chart_with_downwards_trend.png) no-repeat;background-size:1.5em}.emojify.scroll{background:url(scroll.png) no-repeat;background-size:1.5em}.emojify.clipboard{background:url(clipboard.png) no-repeat;background-size:1.5em}.emojify.calendar{background:url(calendar.png) no-repeat;background-size:1.5em}.emojify.date{background:url(date.png) no-repeat;background-size:1.5em}.emojify.card_index{background:url(card_index.png) no-repeat;background-size:1.5em}.emojify.file_folder{background:url(file_folder.png) no-repeat;background-size:1.5em}.emojify.open_file_folder{background:url(open_file_folder.png) no-repeat;background-size:1.5em}.emojify.scissors{background:url(scissors.png) no-repeat;background-size:1.5em}.emojify.pushpin{background:url(pushpin.png) no-repeat;background-size:1.5em}.emojify.paperclip{background:url(paperclip.png) no-repeat;background-size:1.5em}.emojify.black_nib{background:url(black_nib.png) no-repeat;background-size:1.5em}.emojify.pencil2{background:url(pencil2.png) no-repeat;background-size:1.5em}.emojify.straight_ruler{background:url(straight_ruler.png) no-repeat;background-size:1.5em}.emojify.triangular_ruler{background:url(triangular_ruler.png) no-repeat;background-size:1.5em}.emojify.closed_book{background:url(closed_book.png) no-repeat;background-size:1.5em}.emojify.green_book{background:url(green_book.png) no-repeat;background-size:1.5em}.emojify.blue_book{background:url(blue_book.png) no-repeat;background-size:1.5em}.emojify.orange_book{background:url(orange_book.png) no-repeat;background-size:1.5em}.emojify.notebook{background:url(notebook.png) no-repeat;background-size:1.5em}.emojify.notebook_with_decorative_cover{background:url(notebook_with_decorative_cover.png) no-repeat;background-size:1.5em}.emojify.ledger{background:url(ledger.png) no-repeat;background-size:1.5em}.emojify.books{background:url(books.png) no-repeat;background-size:1.5em}.emojify.bookmark{background:url(bookmark.png) no-repeat;background-size:1.5em}.emojify.name_badge{background:url(name_badge.png) no-repeat;background-size:1.5em}.emojify.microscope{background:url(microscope.png) no-repeat;background-size:1.5em}.emojify.telescope{background:url(telescope.png) no-repeat;background-size:1.5em}.emojify.newspaper{background:url(newspaper.png) no-repeat;background-size:1.5em}.emojify.football{background:url(football.png) no-repeat;background-size:1.5em}.emojify.basketball{background:url(basketball.png) no-repeat;background-size:1.5em}.emojify.soccer{background:url(soccer.png) no-repeat;background-size:1.5em}.emojify.baseball{background:url(baseball.png) no-repeat;background-size:1.5em}.emojify.tennis{background:url(tennis.png) no-repeat;background-size:1.5em}.emojify.eightball{background:url(eightball.png) no-repeat;background-size:1.5em}.emojify.rugby_football{background:url(rugby_football.png) no-repeat;background-size:1.5em}.emojify.bowling{background:url(bowling.png) no-repeat;background-size:1.5em}.emojify.golf{background:url(golf.png) no-repeat;background-size:1.5em}.emojify.mountain_bicyclist{background:url(mountain_bicyclist.png) no-repeat;background-size:1.5em}.emojify.bicyclist{background:url(bicyclist.png) no-repeat;background-size:1.5em}.emojify.horse_racing{background:url(horse_racing.png) no-repeat;background-size:1.5em}.emojify.snowboarder{background:url(snowboarder.png) no-repeat;background-size:1.5em}.emojify.swimmer{background:url(swimmer.png) no-repeat;background-size:1.5em}.emojify.surfer{background:url(surfer.png) no-repeat;background-size:1.5em}.emojify.ski{background:url(ski.png) no-repeat;background-size:1.5em}.emojify.spades{background:url(spades.png) no-repeat;background-size:1.5em}.emojify.hearts{background:url(hearts.png) no-repeat;background-size:1.5em}.emojify.clubs{background:url(clubs.png) no-repeat;background-size:1.5em}.emojify.diamonds{background:url(diamonds.png) no-repeat;background-size:1.5em}.emojify.gem{background:url(gem.png) no-repeat;background-size:1.5em}.emojify.ring{background:url(ring.png) no-repeat;background-size:1.5em}.emojify.trophy{background:url(trophy.png) no-repeat;background-size:1.5em}.emojify.musical_score{background:url(musical_score.png) no-repeat;background-size:1.5em}.emojify.musical_keyboard{background:url(musical_keyboard.png) no-repeat;background-size:1.5em}.emojify.violin{background:url(violin.png) no-repeat;background-size:1.5em}.emojify.space_invader{background:url(space_invader.png) no-repeat;background-size:1.5em}.emojify.video_game{background:url(video_game.png) no-repeat;background-size:1.5em}.emojify.black_joker{background:url(black_joker.png) no-repeat;background-size:1.5em}.emojify.flower_playing_cards{background:url(flower_playing_cards.png) no-repeat;background-size:1.5em}.emojify.game_die{background:url(game_die.png) no-repeat;background-size:1.5em}.emojify.dart{background:url(dart.png) no-repeat;background-size:1.5em}.emojify.mahjong{background:url(mahjong.png) no-repeat;background-size:1.5em}.emojify.clapper{background:url(clapper.png) no-repeat;background-size:1.5em}.emojify.memo{background:url(memo.png) no-repeat;background-size:1.5em}.emojify.pencil{background:url(pencil.png) no-repeat;background-size:1.5em}.emojify.book{background:url(book.png) no-repeat;background-size:1.5em}.emojify.art{background:url(art.png) no-repeat;background-size:1.5em}.emojify.microphone{background:url(microphone.png) no-repeat;background-size:1.5em}.emojify.headphones{background:url(headphones.png) no-repeat;background-size:1.5em}.emojify.trumpet{background:url(trumpet.png) no-repeat;background-size:1.5em}.emojify.saxophone{background:url(saxophone.png) no-repeat;background-size:1.5em}.emojify.guitar{background:url(guitar.png) no-repeat;background-size:1.5em}.emojify.shoe{background:url(shoe.png) no-repeat;background-size:1.5em}.emojify.sandal{background:url(sandal.png) no-repeat;background-size:1.5em}.emojify.high_heel{background:url(high_heel.png) no-repeat;background-size:1.5em}.emojify.lipstick{background:url(lipstick.png) no-repeat;background-size:1.5em}.emojify.boot{background:url(boot.png) no-repeat;background-size:1.5em}.emojify.shirt{background:url(shirt.png) no-repeat;background-size:1.5em}.emojify.tshirt{background:url(tshirt.png) no-repeat;background-size:1.5em}.emojify.necktie{background:url(necktie.png) no-repeat;background-size:1.5em}.emojify.womans_clothes{background:url(womans_clothes.png) no-repeat;background-size:1.5em}.emojify.dress{background:url(dress.png) no-repeat;background-size:1.5em}.emojify.running_shirt_with_sash{background:url(running_shirt_with_sash.png) no-repeat;background-size:1.5em}.emojify.jeans{background:url(jeans.png) no-repeat;background-size:1.5em}.emojify.kimono{background:url(kimono.png) no-repeat;background-size:1.5em}.emojify.bikini{background:url(bikini.png) no-repeat;background-size:1.5em}.emojify.ribbon{background:url(ribbon.png) no-repeat;background-size:1.5em}.emojify.tophat{background:url(tophat.png) no-repeat;background-size:1.5em}.emojify.crown{background:url(crown.png) no-repeat;background-size:1.5em}.emojify.womans_hat{background:url(womans_hat.png) no-repeat;background-size:1.5em}.emojify.mans_shoe{background:url(mans_shoe.png) no-repeat;background-size:1.5em}.emojify.closed_umbrella{background:url(closed_umbrella.png) no-repeat;background-size:1.5em}.emojify.briefcase{background:url(briefcase.png) no-repeat;background-size:1.5em}.emojify.handbag{background:url(handbag.png) no-repeat;background-size:1.5em}.emojify.pouch{background:url(pouch.png) no-repeat;background-size:1.5em}.emojify.purse{background:url(purse.png) no-repeat;background-size:1.5em}.emojify.eyeglasses{background:url(eyeglasses.png) no-repeat;background-size:1.5em}.emojify.fishing_pole_and_fish{background:url(fishing_pole_and_fish.png) no-repeat;background-size:1.5em}.emojify.coffee{background:url(coffee.png) no-repeat;background-size:1.5em}.emojify.tea{background:url(tea.png) no-repeat;background-size:1.5em}.emojify.sake{background:url(sake.png) no-repeat;background-size:1.5em}.emojify.baby_bottle{background:url(baby_bottle.png) no-repeat;background-size:1.5em}.emojify.beer{background:url(beer.png) no-repeat;background-size:1.5em}.emojify.beers{background:url(beers.png) no-repeat;background-size:1.5em}.emojify.cocktail{background:url(cocktail.png) no-repeat;background-size:1.5em}.emojify.tropical_drink{background:url(tropical_drink.png) no-repeat;background-size:1.5em}.emojify.wine_glass{background:url(wine_glass.png) no-repeat;background-size:1.5em}.emojify.fork_and_knife{background:url(fork_and_knife.png) no-repeat;background-size:1.5em}.emojify.pizza{background:url(pizza.png) no-repeat;background-size:1.5em}.emojify.hamburger{background:url(hamburger.png) no-repeat;background-size:1.5em}.emojify.fries{background:url(fries.png) no-repeat;background-size:1.5em}.emojify.poultry_leg{background:url(poultry_leg.png) no-repeat;background-size:1.5em}.emojify.meat_on_bone{background:url(meat_on_bone.png) no-repeat;background-size:1.5em}.emojify.spaghetti{background:url(spaghetti.png) no-repeat;background-size:1.5em}.emojify.curry{background:url(curry.png) no-repeat;background-size:1.5em}.emojify.fried_shrimp{background:url(fried_shrimp.png) no-repeat;background-size:1.5em}.emojify.bento{background:url(bento.png) no-repeat;background-size:1.5em}.emojify.sushi{background:url(sushi.png) no-repeat;background-size:1.5em}.emojify.fish_cake{background:url(fish_cake.png) no-repeat;background-size:1.5em}.emojify.rice_ball{background:url(rice_ball.png) no-repeat;background-size:1.5em}.emojify.rice_cracker{background:url(rice_cracker.png) no-repeat;background-size:1.5em}.emojify.rice{background:url(rice.png) no-repeat;background-size:1.5em}.emojify.ramen{background:url(ramen.png) no-repeat;background-size:1.5em}.emojify.stew{background:url(stew.png) no-repeat;background-size:1.5em}.emojify.oden{background:url(oden.png) no-repeat;background-size:1.5em}.emojify.dango{background:url(dango.png) no-repeat;background-size:1.5em}.emojify.egg{background:url(egg.png) no-repeat;background-size:1.5em}.emojify.bread{background:url(bread.png) no-repeat;background-size:1.5em}.emojify.doughnut{background:url(doughnut.png) no-repeat;background-size:1.5em}.emojify.custard{background:url(custard.png) no-repeat;background-size:1.5em}.emojify.icecream{background:url(icecream.png) no-repeat;background-size:1.5em}.emojify.ice_cream{background:url(ice_cream.png) no-repeat;background-size:1.5em}.emojify.shaved_ice{background:url(shaved_ice.png) no-repeat;background-size:1.5em}.emojify.birthday{background:url(birthday.png) no-repeat;background-size:1.5em}.emojify.cake{background:url(cake.png) no-repeat;background-size:1.5em}.emojify.cookie{background:url(cookie.png) no-repeat;background-size:1.5em}.emojify.chocolate_bar{background:url(chocolate_bar.png) no-repeat;background-size:1.5em}.emojify.candy{background:url(candy.png) no-repeat;background-size:1.5em}.emojify.lollipop{background:url(lollipop.png) no-repeat;background-size:1.5em}.emojify.honey_pot{background:url(honey_pot.png) no-repeat;background-size:1.5em}.emojify.apple{background:url(apple.png) no-repeat;background-size:1.5em}.emojify.green_apple{background:url(green_apple.png) no-repeat;background-size:1.5em}.emojify.tangerine{background:url(tangerine.png) no-repeat;background-size:1.5em}.emojify.lemon{background:url(lemon.png) no-repeat;background-size:1.5em}.emojify.cherries{background:url(cherries.png) no-repeat;background-size:1.5em}.emojify.grapes{background:url(grapes.png) no-repeat;background-size:1.5em}.emojify.watermelon{background:url(watermelon.png) no-repeat;background-size:1.5em}.emojify.strawberry{background:url(strawberry.png) no-repeat;background-size:1.5em}.emojify.peach{background:url(peach.png) no-repeat;background-size:1.5em}.emojify.melon{background:url(melon.png) no-repeat;background-size:1.5em}.emojify.banana{background:url(banana.png) no-repeat;background-size:1.5em}.emojify.pear{background:url(pear.png) no-repeat;background-size:1.5em}.emojify.pineapple{background:url(pineapple.png) no-repeat;background-size:1.5em}.emojify.sweet_potato{background:url(sweet_potato.png) no-repeat;background-size:1.5em}.emojify.eggplant{background:url(eggplant.png) no-repeat;background-size:1.5em}.emojify.tomato{background:url(tomato.png) no-repeat;background-size:1.5em}.emojify.corn{background:url(corn.png) no-repeat;background-size:1.5em}.emojify.onezeronine{background:url(onezeronine.png) no-repeat;background-size:1.5em}.emojify.house{background:url(house.png) no-repeat;background-size:1.5em}.emojify.house_with_garden{background:url(house_with_garden.png) no-repeat;background-size:1.5em}.emojify.school{background:url(school.png) no-repeat;background-size:1.5em}.emojify.office{background:url(office.png) no-repeat;background-size:1.5em}.emojify.post_office{background:url(post_office.png) no-repeat;background-size:1.5em}.emojify.hospital{background:url(hospital.png) no-repeat;background-size:1.5em}.emojify.bank{background:url(bank.png) no-repeat;background-size:1.5em}.emojify.convenience_store{background:url(convenience_store.png) no-repeat;background-size:1.5em}.emojify.love_hotel{background:url(love_hotel.png) no-repeat;background-size:1.5em}.emojify.hotel{background:url(hotel.png) no-repeat;background-size:1.5em}.emojify.wedding{background:url(wedding.png) no-repeat;background-size:1.5em}.emojify.church{background:url(church.png) no-repeat;background-size:1.5em}.emojify.department_store{background:url(department_store.png) no-repeat;background-size:1.5em}.emojify.european_post_office{background:url(european_post_office.png) no-repeat;background-size:1.5em}.emojify.city_sunrise{background:url(city_sunrise.png) no-repeat;background-size:1.5em}.emojify.city_sunset{background:url(city_sunset.png) no-repeat;background-size:1.5em}.emojify.japanese_castle{background:url(japanese_castle.png) no-repeat;background-size:1.5em}.emojify.european_castle{background:url(european_castle.png) no-repeat;background-size:1.5em}.emojify.tent{background:url(tent.png) no-repeat;background-size:1.5em}.emojify.factory{background:url(factory.png) no-repeat;background-size:1.5em}.emojify.tokyo_tower{background:url(tokyo_tower.png) no-repeat;background-size:1.5em}.emojify.japan{background:url(japan.png) no-repeat;background-size:1.5em}.emojify.mount_fuji{background:url(mount_fuji.png) no-repeat;background-size:1.5em}.emojify.sunrise_over_mountains{background:url(sunrise_over_mountains.png) no-repeat;background-size:1.5em}.emojify.sunrise{background:url(sunrise.png) no-repeat;background-size:1.5em}.emojify.stars{background:url(stars.png) no-repeat;background-size:1.5em}.emojify.statue_of_liberty{background:url(statue_of_liberty.png) no-repeat;background-size:1.5em}.emojify.bridge_at_night{background:url(bridge_at_night.png) no-repeat;background-size:1.5em}.emojify.carousel_horse{background:url(carousel_horse.png) no-repeat;background-size:1.5em}.emojify.rainbow{background:url(rainbow.png) no-repeat;background-size:1.5em}.emojify.ferris_wheel{background:url(ferris_wheel.png) no-repeat;background-size:1.5em}.emojify.fountain{background:url(fountain.png) no-repeat;background-size:1.5em}.emojify.roller_coaster{background:url(roller_coaster.png) no-repeat;background-size:1.5em}.emojify.ship{background:url(ship.png) no-repeat;background-size:1.5em}.emojify.speedboat{background:url(speedboat.png) no-repeat;background-size:1.5em}.emojify.boat{background:url(boat.png) no-repeat;background-size:1.5em}.emojify.sailboat{background:url(sailboat.png) no-repeat;background-size:1.5em}.emojify.rowboat{background:url(rowboat.png) no-repeat;background-size:1.5em}.emojify.anchor{background:url(anchor.png) no-repeat;background-size:1.5em}.emojify.rocket{background:url(rocket.png) no-repeat;background-size:1.5em}.emojify.airplane{background:url(airplane.png) no-repeat;background-size:1.5em}.emojify.helicopter{background:url(helicopter.png) no-repeat;background-size:1.5em}.emojify.steam_locomotive{background:url(steam_locomotive.png) no-repeat;background-size:1.5em}.emojify.tram{background:url(tram.png) no-repeat;background-size:1.5em}.emojify.mountain_railway{background:url(mountain_railway.png) no-repeat;background-size:1.5em}.emojify.bike{background:url(bike.png) no-repeat;background-size:1.5em}.emojify.aerial_tramway{background:url(aerial_tramway.png) no-repeat;background-size:1.5em}.emojify.suspension_railway{background:url(suspension_railway.png) no-repeat;background-size:1.5em}.emojify.mountain_cableway{background:url(mountain_cableway.png) no-repeat;background-size:1.5em}.emojify.tractor{background:url(tractor.png) no-repeat;background-size:1.5em}.emojify.blue_car{background:url(blue_car.png) no-repeat;background-size:1.5em}.emojify.oncoming_automobile{background:url(oncoming_automobile.png) no-repeat;background-size:1.5em}.emojify.car{background:url(car.png) no-repeat;background-size:1.5em}.emojify.red_car{background:url(red_car.png) no-repeat;background-size:1.5em}.emojify.taxi{background:url(taxi.png) no-repeat;background-size:1.5em}.emojify.oncoming_taxi{background:url(oncoming_taxi.png) no-repeat;background-size:1.5em}.emojify.articulated_lorry{background:url(articulated_lorry.png) no-repeat;background-size:1.5em}.emojify.bus{background:url(bus.png) no-repeat;background-size:1.5em}.emojify.oncoming_bus{background:url(oncoming_bus.png) no-repeat;background-size:1.5em}.emojify.rotating_light{background:url(rotating_light.png) no-repeat;background-size:1.5em}.emojify.police_car{background:url(police_car.png) no-repeat;background-size:1.5em}.emojify.oncoming_police_car{background:url(oncoming_police_car.png) no-repeat;background-size:1.5em}.emojify.fire_engine{background:url(fire_engine.png) no-repeat;background-size:1.5em}.emojify.ambulance{background:url(ambulance.png) no-repeat;background-size:1.5em}.emojify.minibus{background:url(minibus.png) no-repeat;background-size:1.5em}.emojify.truck{background:url(truck.png) no-repeat;background-size:1.5em}.emojify.train{background:url(train.png) no-repeat;background-size:1.5em}.emojify.station{background:url(station.png) no-repeat;background-size:1.5em}.emojify.train2{background:url(train2.png) no-repeat;background-size:1.5em}.emojify.bullettrain_front{background:url(bullettrain_front.png) no-repeat;background-size:1.5em}.emojify.bullettrain_side{background:url(bullettrain_side.png) no-repeat;background-size:1.5em}.emojify.light_rail{background:url(light_rail.png) no-repeat;background-size:1.5em}.emojify.monorail{background:url(monorail.png) no-repeat;background-size:1.5em}.emojify.railway_car{background:url(railway_car.png) no-repeat;background-size:1.5em}.emojify.trolleybus{background:url(trolleybus.png) no-repeat;background-size:1.5em}.emojify.ticket{background:url(ticket.png) no-repeat;background-size:1.5em}.emojify.fuelpump{background:url(fuelpump.png) no-repeat;background-size:1.5em}.emojify.vertical_traffic_light{background:url(vertical_traffic_light.png) no-repeat;background-size:1.5em}.emojify.traffic_light{background:url(traffic_light.png) no-repeat;background-size:1.5em}.emojify.warning{background:url(warning.png) no-repeat;background-size:1.5em}.emojify.construction{background:url(construction.png) no-repeat;background-size:1.5em}.emojify.beginner{background:url(beginner.png) no-repeat;background-size:1.5em}.emojify.atm{background:url(atm.png) no-repeat;background-size:1.5em}.emojify.slot_machine{background:url(slot_machine.png) no-repeat;background-size:1.5em}.emojify.busstop{background:url(busstop.png) no-repeat;background-size:1.5em}.emojify.barber{background:url(barber.png) no-repeat;background-size:1.5em}.emojify.hotsprings{background:url(hotsprings.png) no-repeat;background-size:1.5em}.emojify.checkered_flag{background:url(checkered_flag.png) no-repeat;background-size:1.5em}.emojify.crossed_flags{background:url(crossed_flags.png) no-repeat;background-size:1.5em}.emojify.izakaya_lantern{background:url(izakaya_lantern.png) no-repeat;background-size:1.5em}.emojify.moyai{background:url(moyai.png) no-repeat;background-size:1.5em}.emojify.circus_tent{background:url(circus_tent.png) no-repeat;background-size:1.5em}.emojify.performing_arts{background:url(performing_arts.png) no-repeat;background-size:1.5em}.emojify.round_pushpin{background:url(round_pushpin.png) no-repeat;background-size:1.5em}.emojify.triangular_flag_on_post{background:url(triangular_flag_on_post.png) no-repeat;background-size:1.5em}.emojify.jp{background:url(jp.png) no-repeat;background-size:1.5em}.emojify.kr{background:url(kr.png) no-repeat;background-size:1.5em}.emojify.cn{background:url(cn.png) no-repeat;background-size:1.5em}.emojify.us{background:url(us.png) no-repeat;background-size:1.5em}.emojify.fr{background:url(fr.png) no-repeat;background-size:1.5em}.emojify.es{background:url(es.png) no-repeat;background-size:1.5em}.emojify.it{background:url(it.png) no-repeat;background-size:1.5em}.emojify.ru{background:url(ru.png) no-repeat;background-size:1.5em}.emojify.gb{background:url(gb.png) no-repeat;background-size:1.5em}.emojify.uk{background:url(uk.png) no-repeat;background-size:1.5em}.emojify.de{background:url(de.png) no-repeat;background-size:1.5em}.emojify.one{background:url(one.png) no-repeat;background-size:1.5em}.emojify.two{background:url(two.png) no-repeat;background-size:1.5em}.emojify.three{background:url(three.png) no-repeat;background-size:1.5em}.emojify.four{background:url(four.png) no-repeat;background-size:1.5em}.emojify.five{background:url(five.png) no-repeat;background-size:1.5em}.emojify.six{background:url(six.png) no-repeat;background-size:1.5em}.emojify.seven{background:url(seven.png) no-repeat;background-size:1.5em}.emojify.eight{background:url(eight.png) no-repeat;background-size:1.5em}.emojify.nine{background:url(nine.png) no-repeat;background-size:1.5em}.emojify.keycap_ten{background:url(keycap_ten.png) no-repeat;background-size:1.5em}.emojify.onetwothreefour{background:url(onetwothreefour.png) no-repeat;background-size:1.5em}.emojify.zero{background:url(zero.png) no-repeat;background-size:1.5em}.emojify.hash{background:url(hash.png) no-repeat;background-size:1.5em}.emojify.symbols{background:url(symbols.png) no-repeat;background-size:1.5em}.emojify.arrow_backward{background:url(arrow_backward.png) no-repeat;background-size:1.5em}.emojify.arrow_down{background:url(arrow_down.png) no-repeat;background-size:1.5em}.emojify.arrow_forward{background:url(arrow_forward.png) no-repeat;background-size:1.5em}.emojify.arrow_left{background:url(arrow_left.png) no-repeat;background-size:1.5em}.emojify.capital_abcd{background:url(capital_abcd.png) no-repeat;background-size:1.5em}.emojify.abcd{background:url(abcd.png) no-repeat;background-size:1.5em}.emojify.abc{background:url(abc.png) no-repeat;background-size:1.5em}.emojify.arrow_lower_left{background:url(arrow_lower_left.png) no-repeat;background-size:1.5em}.emojify.arrow_lower_right{background:url(arrow_lower_right.png) no-repeat;background-size:1.5em}.emojify.arrow_right{background:url(arrow_right.png) no-repeat;background-size:1.5em}.emojify.arrow_up{background:url(arrow_up.png) no-repeat;background-size:1.5em}.emojify.arrow_upper_left{background:url(arrow_upper_left.png) no-repeat;background-size:1.5em}.emojify.arrow_upper_right{background:url(arrow_upper_right.png) no-repeat;background-size:1.5em}.emojify.arrow_double_down{background:url(arrow_double_down.png) no-repeat;background-size:1.5em}.emojify.arrow_double_up{background:url(arrow_double_up.png) no-repeat;background-size:1.5em}.emojify.arrow_down_small{background:url(arrow_down_small.png) no-repeat;background-size:1.5em}.emojify.arrow_heading_down{background:url(arrow_heading_down.png) no-repeat;background-size:1.5em}.emojify.arrow_heading_up{background:url(arrow_heading_up.png) no-repeat;background-size:1.5em}.emojify.leftwards_arrow_with_hook{background:url(leftwards_arrow_with_hook.png) no-repeat;background-size:1.5em}.emojify.arrow_right_hook{background:url(arrow_right_hook.png) no-repeat;background-size:1.5em}.emojify.left_right_arrow{background:url(left_right_arrow.png) no-repeat;background-size:1.5em}.emojify.arrow_up_down{background:url(arrow_up_down.png) no-repeat;background-size:1.5em}.emojify.arrow_up_small{background:url(arrow_up_small.png) no-repeat;background-size:1.5em}.emojify.arrows_clockwise{background:url(arrows_clockwise.png) no-repeat;background-size:1.5em}.emojify.arrows_counterclockwise{background:url(arrows_counterclockwise.png) no-repeat;background-size:1.5em}.emojify.rewind{background:url(rewind.png) no-repeat;background-size:1.5em}.emojify.fast_forward{background:url(fast_forward.png) no-repeat;background-size:1.5em}.emojify.information_source{background:url(information_source.png) no-repeat;background-size:1.5em}.emojify.ok{background:url(ok.png) no-repeat;background-size:1.5em}.emojify.twisted_rightwards_arrows{background:url(twisted_rightwards_arrows.png) no-repeat;background-size:1.5em}.emojify.repeat{background:url(repeat.png) no-repeat;background-size:1.5em}.emojify.repeat_one{background:url(repeat_one.png) no-repeat;background-size:1.5em}.emojify.new{background:url(new.png) no-repeat;background-size:1.5em}.emojify.top{background:url(top.png) no-repeat;background-size:1.5em}.emojify.up{background:url(up.png) no-repeat;background-size:1.5em}.emojify.cool{background:url(cool.png) no-repeat;background-size:1.5em}.emojify.free{background:url(free.png) no-repeat;background-size:1.5em}.emojify.ng{background:url(ng.png) no-repeat;background-size:1.5em}.emojify.cinema{background:url(cinema.png) no-repeat;background-size:1.5em}.emojify.koko{background:url(koko.png) no-repeat;background-size:1.5em}.emojify.signal_strength{background:url(signal_strength.png) no-repeat;background-size:1.5em}.emojify.u5272{background:url(u5272.png) no-repeat;background-size:1.5em}.emojify.u5408{background:url(u5408.png) no-repeat;background-size:1.5em}.emojify.u55b6{background:url(u55b6.png) no-repeat;background-size:1.5em}.emojify.u6307{background:url(u6307.png) no-repeat;background-size:1.5em}.emojify.u6708{background:url(u6708.png) no-repeat;background-size:1.5em}.emojify.u6709{background:url(u6709.png) no-repeat;background-size:1.5em}.emojify.u6e80{background:url(u6e80.png) no-repeat;background-size:1.5em}.emojify.u7121{background:url(u7121.png) no-repeat;background-size:1.5em}.emojify.u7533{background:url(u7533.png) no-repeat;background-size:1.5em}.emojify.u7a7a{background:url(u7a7a.png) no-repeat;background-size:1.5em}.emojify.u7981{background:url(u7981.png) no-repeat;background-size:1.5em}.emojify.sa{background:url(sa.png) no-repeat;background-size:1.5em}.emojify.restroom{background:url(restroom.png) no-repeat;background-size:1.5em}.emojify.mens{background:url(mens.png) no-repeat;background-size:1.5em}.emojify.womens{background:url(womens.png) no-repeat;background-size:1.5em}.emojify.baby_symbol{background:url(baby_symbol.png) no-repeat;background-size:1.5em}.emojify.no_smoking{background:url(no_smoking.png) no-repeat;background-size:1.5em}.emojify.parking{background:url(parking.png) no-repeat;background-size:1.5em}.emojify.wheelchair{background:url(wheelchair.png) no-repeat;background-size:1.5em}.emojify.metro{background:url(metro.png) no-repeat;background-size:1.5em}.emojify.baggage_claim{background:url(baggage_claim.png) no-repeat;background-size:1.5em}.emojify.accept{background:url(accept.png) no-repeat;background-size:1.5em}.emojify.wc{background:url(wc.png) no-repeat;background-size:1.5em}.emojify.potable_water{background:url(potable_water.png) no-repeat;background-size:1.5em}.emojify.put_litter_in_its_place{background:url(put_litter_in_its_place.png) no-repeat;background-size:1.5em}.emojify.secret{background:url(secret.png) no-repeat;background-size:1.5em}.emojify.congratulations{background:url(congratulations.png) no-repeat;background-size:1.5em}.emojify.m{background:url(m.png) no-repeat;background-size:1.5em}.emojify.passport_control{background:url(passport_control.png) no-repeat;background-size:1.5em}.emojify.left_luggage{background:url(left_luggage.png) no-repeat;background-size:1.5em}.emojify.customs{background:url(customs.png) no-repeat;background-size:1.5em}.emojify.ideograph_advantage{background:url(ideograph_advantage.png) no-repeat;background-size:1.5em}.emojify.cl{background:url(cl.png) no-repeat;background-size:1.5em}.emojify.sos{background:url(sos.png) no-repeat;background-size:1.5em}.emojify.id{background:url(id.png) no-repeat;background-size:1.5em}.emojify.no_entry_sign{background:url(no_entry_sign.png) no-repeat;background-size:1.5em}.emojify.underage{background:url(underage.png) no-repeat;background-size:1.5em}.emojify.no_mobile_phones{background:url(no_mobile_phones.png) no-repeat;background-size:1.5em}.emojify.do_not_litter{background:url(do_not_litter.png) no-repeat;background-size:1.5em}.emojify.non-potable_water{background:url(non-potable_water.png) no-repeat;background-size:1.5em}.emojify.no_bicycles{background:url(no_bicycles.png) no-repeat;background-size:1.5em}.emojify.no_pedestrians{background:url(no_pedestrians.png) no-repeat;background-size:1.5em}.emojify.children_crossing{background:url(children_crossing.png) no-repeat;background-size:1.5em}.emojify.no_entry{background:url(no_entry.png) no-repeat;background-size:1.5em}.emojify.eight_spoked_asterisk{background:url(eight_spoked_asterisk.png) no-repeat;background-size:1.5em}.emojify.eight_pointed_black_star{background:url(eight_pointed_black_star.png) no-repeat;background-size:1.5em}.emojify.heart_decoration{background:url(heart_decoration.png) no-repeat;background-size:1.5em}.emojify.vs{background:url(vs.png) no-repeat;background-size:1.5em}.emojify.vibration_mode{background:url(vibration_mode.png) no-repeat;background-size:1.5em}.emojify.mobile_phone_off{background:url(mobile_phone_off.png) no-repeat;background-size:1.5em}.emojify.chart{background:url(chart.png) no-repeat;background-size:1.5em}.emojify.currency_exchange{background:url(currency_exchange.png) no-repeat;background-size:1.5em}.emojify.aries{background:url(aries.png) no-repeat;background-size:1.5em}.emojify.taurus{background:url(taurus.png) no-repeat;background-size:1.5em}.emojify.gemini{background:url(gemini.png) no-repeat;background-size:1.5em}.emojify.cancer{background:url(cancer.png) no-repeat;background-size:1.5em}.emojify.leo{background:url(leo.png) no-repeat;background-size:1.5em}.emojify.virgo{background:url(virgo.png) no-repeat;background-size:1.5em}.emojify.libra{background:url(libra.png) no-repeat;background-size:1.5em}.emojify.scorpius{background:url(scorpius.png) no-repeat;background-size:1.5em}.emojify.sagittarius{background:url(sagittarius.png) no-repeat;background-size:1.5em}.emojify.capricorn{background:url(capricorn.png) no-repeat;background-size:1.5em}.emojify.aquarius{background:url(aquarius.png) no-repeat;background-size:1.5em}.emojify.pisces{background:url(pisces.png) no-repeat;background-size:1.5em}.emojify.ophiuchus{background:url(ophiuchus.png) no-repeat;background-size:1.5em}.emojify.six_pointed_star{background:url(six_pointed_star.png) no-repeat;background-size:1.5em}.emojify.negative_squared_cross_mark{background:url(negative_squared_cross_mark.png) no-repeat;background-size:1.5em}.emojify.a{background:url(a.png) no-repeat;background-size:1.5em}.emojify.b{background:url(b.png) no-repeat;background-size:1.5em}.emojify.ab{background:url(ab.png) no-repeat;background-size:1.5em}.emojify.o2{background:url(o2.png) no-repeat;background-size:1.5em}.emojify.diamond_shape_with_a_dot_inside{background:url(diamond_shape_with_a_dot_inside.png) no-repeat;background-size:1.5em}.emojify.recycle{background:url(recycle.png) no-repeat;background-size:1.5em}.emojify.end{background:url(end.png) no-repeat;background-size:1.5em}.emojify.on{background:url(on.png) no-repeat;background-size:1.5em}.emojify.soon{background:url(soon.png) no-repeat;background-size:1.5em}.emojify.clock1{background:url(clock1.png) no-repeat;background-size:1.5em}.emojify.clock130{background:url(clock130.png) no-repeat;background-size:1.5em}.emojify.clock10{background:url(clock10.png) no-repeat;background-size:1.5em}.emojify.clock1030{background:url(clock1030.png) no-repeat;background-size:1.5em}.emojify.clock11{background:url(clock11.png) no-repeat;background-size:1.5em}.emojify.clock1130{background:url(clock1130.png) no-repeat;background-size:1.5em}.emojify.clock12{background:url(clock12.png) no-repeat;background-size:1.5em}.emojify.clock1230{background:url(clock1230.png) no-repeat;background-size:1.5em}.emojify.clock2{background:url(clock2.png) no-repeat;background-size:1.5em}.emojify.clock230{background:url(clock230.png) no-repeat;background-size:1.5em}.emojify.clock3{background:url(clock3.png) no-repeat;background-size:1.5em}.emojify.clock330{background:url(clock330.png) no-repeat;background-size:1.5em}.emojify.clock4{background:url(clock4.png) no-repeat;background-size:1.5em}.emojify.clock430{background:url(clock430.png) no-repeat;background-size:1.5em}.emojify.clock5{background:url(clock5.png) no-repeat;background-size:1.5em}.emojify.clock530{background:url(clock530.png) no-repeat;background-size:1.5em}.emojify.clock6{background:url(clock6.png) no-repeat;background-size:1.5em}.emojify.clock630{background:url(clock630.png) no-repeat;background-size:1.5em}.emojify.clock7{background:url(clock7.png) no-repeat;background-size:1.5em}.emojify.clock730{background:url(clock730.png) no-repeat;background-size:1.5em}.emojify.clock8{background:url(clock8.png) no-repeat;background-size:1.5em}.emojify.clock830{background:url(clock830.png) no-repeat;background-size:1.5em}.emojify.clock9{background:url(clock9.png) no-repeat;background-size:1.5em}.emojify.clock930{background:url(clock930.png) no-repeat;background-size:1.5em}.emojify.heavy_dollar_sign{background:url(heavy_dollar_sign.png) no-repeat;background-size:1.5em}.emojify.copyright{background:url(copyright.png) no-repeat;background-size:1.5em}.emojify.registered{background:url(registered.png) no-repeat;background-size:1.5em}.emojify.tm{background:url(tm.png) no-repeat;background-size:1.5em}.emojify.x{background:url(x.png) no-repeat;background-size:1.5em}.emojify.heavy_exclamation_mark{background:url(heavy_exclamation_mark.png) no-repeat;background-size:1.5em}.emojify.bangbang{background:url(bangbang.png) no-repeat;background-size:1.5em}.emojify.interrobang{background:url(interrobang.png) no-repeat;background-size:1.5em}.emojify.o{background:url(o.png) no-repeat;background-size:1.5em}.emojify.heavy_multiplication_x{background:url(heavy_multiplication_x.png) no-repeat;background-size:1.5em}.emojify.heavy_plus_sign{background:url(heavy_plus_sign.png) no-repeat;background-size:1.5em}.emojify.heavy_minus_sign{background:url(heavy_minus_sign.png) no-repeat;background-size:1.5em}.emojify.heavy_division_sign{background:url(heavy_division_sign.png) no-repeat;background-size:1.5em}.emojify.white_flower{background:url(white_flower.png) no-repeat;background-size:1.5em}.emojify.onehundred{background:url(onehundred.png) no-repeat;background-size:1.5em}.emojify.heavy_check_mark{background:url(heavy_check_mark.png) no-repeat;background-size:1.5em}.emojify.ballot_box_with_check{background:url(ballot_box_with_check.png) no-repeat;background-size:1.5em}.emojify.radio_button{background:url(radio_button.png) no-repeat;background-size:1.5em}.emojify.link{background:url(link.png) no-repeat;background-size:1.5em}.emojify.curly_loop{background:url(curly_loop.png) no-repeat;background-size:1.5em}.emojify.wavy_dash{background:url(wavy_dash.png) no-repeat;background-size:1.5em}.emojify.part_alternation_mark{background:url(part_alternation_mark.png) no-repeat;background-size:1.5em}.emojify.trident{background:url(trident.png) no-repeat;background-size:1.5em}.emojify.black_square{background:url(black_square.png) no-repeat;background-size:1.5em}.emojify.white_square{background:url(white_square.png) no-repeat;background-size:1.5em}.emojify.white_check_mark{background:url(white_check_mark.png) no-repeat;background-size:1.5em}.emojify.black_square_button{background:url(black_square_button.png) no-repeat;background-size:1.5em}.emojify.white_square_button{background:url(white_square_button.png) no-repeat;background-size:1.5em}.emojify.black_circle{background:url(black_circle.png) no-repeat;background-size:1.5em}.emojify.white_circle{background:url(white_circle.png) no-repeat;background-size:1.5em}.emojify.red_circle{background:url(red_circle.png) no-repeat;background-size:1.5em}.emojify.large_blue_circle{background:url(large_blue_circle.png) no-repeat;background-size:1.5em}.emojify.large_blue_diamond{background:url(large_blue_diamond.png) no-repeat;background-size:1.5em}.emojify.large_orange_diamond{background:url(large_orange_diamond.png) no-repeat;background-size:1.5em}.emojify.small_blue_diamond{background:url(small_blue_diamond.png) no-repeat;background-size:1.5em}.emojify.small_orange_diamond{background:url(small_orange_diamond.png) no-repeat;background-size:1.5em}.emojify.small_red_triangle{background:url(small_red_triangle.png) no-repeat;background-size:1.5em}.emojify.small_red_triangle_down{background:url(small_red_triangle_down.png) no-repeat;background-size:1.5em}.emojify.shipit{background:url(shipit.png) no-repeat;background-size:1.5em}"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=utf-8>\n  <title>Springseed</title>\n  <!-- TODO: Find out how to include this in setup.coffee -->\n  <script src=\"handlebars.runtime.js\"></script>\n  <script src=\"emojify.js\"></script>\n  <link rel=\"stylesheet\" href=\"sublime.css\">\n  <link rel=\"stylesheet\" href=\"application.css\">\n  <link rel=\"stylesheet\" href=\"font-awesome.min.css\">\n  <script src=\"application.js\"></script>\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"panel\">\n      <!-- <div id=\"decor\" class=\"nodrag\">\n        <img class=\"close\" src=\"img/close.png\"><img class=\"minimize\" src=\"img/minimize.png\"><img class=\"maximize\" src=\"img/maximize.png\">\n      </div>\n      <div id=\"loginbox\">\n        <span class=\"name\">Log In</span>\n        <span class=\"gopro\">go pro</span>\n      </div>\n      <!-- <div id=\"search\">\n        <input type=\"text\" placeholder=\"Search\">\n      </div> -->\n    </div>\n    <div id=\"parent\">\n      <aside id=\"sidebar\" class=\"panel\">\n        <div class=\"container\">\n          <span class=\"title\">notebooks</span>\n          <ul></ul>\n          <input type=\"text\" placeholder=\"New notebook...\">\n        </div>\n        <div id=\"settingsbar\">\n          <i id=\"settings\" class=\"fa fa-cog\" title=\"Settings\"></i>\n          <i id=\"sync\" class=\"fa fa-refresh\" title=\"Sync your notes\"></i>\n        </div>\n      </aside>\n      <section id=\"browser\" class=\"panel\">\n        <span class=\"title\">notes</span><span id=\"new\"><i class=\"fa fa-plus\"></i></span>\n        <ul></ul>\n      </section>\n      <section id=\"editor\" class=\"panel deselected\">\n        <header>\n          <div class=\"headerwrap\">\n            <div class=\"left\">\n              <i class=\"star fa fa-star-o\"></i><input type=\"text\" disabled>\n              <time></time>\n            </div>\n            <div class=\"right\">\n              <button class=\"toggle edit\" title=\"Edit note\"><i class=\"fa fa-pencil\"></i></button>\n              <button class=\"revert\" title=\"Revert changes\"><i class=\"fa fa-share\"></i></button>\n              <!-- <button class=\"share\"><i class=\"fa fa-upload\"></i></button> -->\n              <button class=\"delete\" title=\"Delete note\"><i class=\"fa fa-trash-o\"></i></button>\n            </div>\n          </div>\n        </header>\n        <section id=\"contentscroller\">\n          <textarea id=\"psuedoinput\"></textarea><!-- Used for the paste event -->\n          <section id=\"contentwrite\"><div class=\"wc\">0</div><section class=\"inner\" contenteditable></section></section>\n          <section id=\"contentread\"></section>\n        </section>\n      </section>\n      <div id=\"editorcontrols\"><button id=\"bold\"><img src=\"img/bold.png\"></button><button id=\"italics\"><img src=\"img/italic.png\"></button><button id=\"heading\"><img src=\"img/heading.png\"></button></div>\n    </div>\n  </div>\n<!-- Modals -->\n<section class=\"modal delete\">\n  <div class=\"delete-container\">\n    <span>Do you want to delete the note \"<span class=\"name\">Unknown</span>\"?</span><br/>\n    <button class=\"true special\">Yes</button>&nbsp;<button class=\"false special\">No</button>\n  </div>\n</section>\n<section class=\"modal newNote\">\n  <div class=\"newNote-container\">\n    <span>You have to first select a notebook and then create a note in it.</span><br/>\n    <button class=\"gotit special\">Got it</button>\n  </div>\n</section>\n<section class=\"modal revert\">\n  <div class=\"delete-container\">\n    <span>Are you sure you want to revert changes to this note?</span><br/>\n    <button class=\"true special\">Yes, revert it</button>&nbsp;<button class=\"false special\">No, keep editing</button>\n  </div>\n</section>\n<section class=\"modal syncmeta\">\n  <div class=\"syncmeta-container\">\n    <p>This is the first time you&#8217;re using this device to sync Springseed.</p>\n    <p>Would you like to load your notes from the cloud, or overwrite your cloud with the notes from this device?</p>\n    <button class=\"destroyclient special green\">Load notes from the cloud</button>&nbsp;<button class=\"destroyserver special\">Overwrite your cloud with your local notes</button>\n  </div>\n</section>\n<!-- Stolen from 1.0.x -->\n<section class=\"modal preferences\">\n  <div class=\"preferences-container\">\n    <nav class=\"tabs\">\n      <ul>\n        <!-- <li data-id=\"account\" class=\"current\">Account</li> -->\n        <li data-id=\"sync\" class=\"current\">Sync</li>\n        <li data-id=\"about\">About</li>\n      </ul>\n    </nav>\n    <div class=\"container\">\n      <!-- <div class=\"account current\">\n        <!-- <img src=\"img/icon.svg\" width=\"150\"> >\n        <div class=\"signedout\">\n          <p>Your Springseed Account can do amazing things. Learn more or register <a target=\"_blank\" href=\"http://accounts.springseed.com/register\">here</a>.</p>\n          <input type=\"text\" id=\"accusername\" placeholder=\"Username\">\n          <input type=\"password\" id=\"accpassword\" placeholder=\"Password\">\n          <button id=\"signin\" class=\"special\">Sign In</button>\n        </div>\n        <div class=\"signedin\">\n          <p>Signed in as <strong class=\"name\"></strong></p>\n          <div id=\"pro\" class=\"pro\"><h1>Go pro today!</h1><p>Springseed Pro is a one time payment of $8. This goes towards development of more pro freatures (and some free features). Pro also entitles you to try new features before anyone else. Isn't that great?</div>\n          <div id=\"alreadypro\" class=\"pro\"><h1>You're Pro!</h1><p>You. Are. Awesome. You're helping Springseed grow and develop into a much better piece of software. Thank you.</div>\n          <button id=\"signout\" class=\"special\">Sign Out</button>\n        </div>\n      </div> -->\n      <div class=\"sync current\">\n        <img src=\"img/dropbox.png\">\n        <div class=\"signedout\">\n          <p>Springseed can connect to Dropbox for access to notes on all your devices.</p>\n          <button id=\"signin\" class=\"special\">Sign In</button>\n        </div>\n        <div class=\"signedin\">\n          <p>Signed in as <strong class=\"username\"></strong></p>\n          <button id=\"signout\" class=\"special\">Sign Out</button>\n        </div>\n      </div>\n      <div class=\"about\">\n        <br>\n          <img src=\"img/icon.svg\" width=\"150\">\n          <h1>Springseed <small>2.0</small></h1>\n          <p>&copy; 2012-2014 Springseed</p>\n          <p><a href=\"http://getspringseed.com\">http://getspringseed.com</a></p>\n        <br><br>\n      </div>\n    </div>\n  </div>\n</section>\n<section class=\"modal deleteNotebook\">\n  <div class=\"delete-container\">\n    <span>Are you sure you want to delete the <span class=\"type\"></span> <i></i> and <span class=\"numberofNotes\"></span> note<span class=\"oneOrMore\">s</span> inside?</span><br>\n    <button class=\"true special\">Yes, delete it</button>&nbsp;<button class=\"false special\">No, keep it</button>\n  </div>\n</section>\n<section class=\"modal renameNotebook\">\n  <div class=\"rename-container\">\n    <input type=\"text\"><br>\n    <button class=\"true special\">Rename</button>&nbsp;<button class=\"false special\">Cancel</button>\n  </div>\n  </section>\n\n<section class=\"modal pleaseLogIn\">\n  <div class=\"delete-container\">\n    <span>You need to be logged in to do that.</span>\n    <button class=\"false special\">Okay.</button>\n  </div>\n</section>\n\n<!-- Popovers -->\n<section class=\"popover-mask\">\n  <div class=\"delete-popover\">\n    <div class=\"arrow\"></div><div class=\"container\">\n      <input id=\"addCat\" placeholder=\"add category\"><button id=\"deleteNotebook\">delete</button><button id=\"renameNotebook\">rename</button>\n    </div>\n  </div>\n  <div class=\"category-popover\">\n    <div class=\"arrow\"></div><div class=\"container\">\n     <input type=\"text\" placeholder=\"Category Name\"><button>Add</button>\n    </div>\n  </div>\n  <div class=\"share-popover\">\n    <div class=\"arrow\"></div><div class=\"container\">\n      <a href=\"#\"><button id=\"emailNote\">email</button></a><button id=\"printNote\">print</button>\n    </div>\n  </div>\n</section>\n</body>\n</html>\n"
  },
  {
    "path": "public/sublime.css",
    "content": "/*\n\nMonokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/\n\n*/\n\npre code {\n  display: block;\n  padding: 0.5em;\n  background: #23241f;\n  color: #f8f8f2;\n}\npre .tag,\npre code {\n  color: #f8f8f2;\n}\npre .keyword,\npre .function,\npre .literal,\npre .change,\npre .winutils,\npre .flow,\npre .lisp .title,\npre .clojure .built_in,\npre .nginx .title,\npre .tex .special {\n  color: #66d9ef;\n}\npre .variable,\npre .params {\n  color: #fd9720;\n}\npre .constant {\n  color: #66d9ef;\n}\npre .title,\npre .class .title,\npre .css .class {\n  color: #a6e22e;\n}\npre .attribute,\npre .symbol,\npre .symbol .string,\npre .tag .title,\npre .value,\npre .css .tag {\n  color: #f92672;\n}\npre .number,\npre .preprocessor,\npre .regexp {\n  color: #ae81ff;\n}\npre .tag .value,\npre .string,\npre .css .id,\npre .subst,\npre .haskell .type,\npre .ruby .class .parent,\npre .built_in,\npre .sql .aggregate,\npre .django .template_tag,\npre .django .variable,\npre .smalltalk .class,\npre .django .filter .argument,\npre .smalltalk .localvars,\npre .smalltalk .array,\npre .attr_selector,\npre .pseudo,\npre .addition,\npre .stream,\npre .envvar,\npre .apache .tag,\npre .apache .cbracket,\npre .tex .command,\npre .prompt {\n  color: #e6db74;\n}\npre .comment,\npre .javadoc,\npre .java .annotation,\npre .python .decorator,\npre .template_comment,\npre .pi,\npre .doctype,\npre .deletion,\npre .shebang,\npre .apache .sqbracket,\npre .tex .formula {\n  color: #75715e;\n}\npre .coffeescript .javascript,\npre .javascript .xml,\npre .tex .formula {\n  opacity: 0.5;\n}\npre .xml .javascript,\npre .xml .vbscript,\npre .xml .css,\npre .xml .cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "src/AboutWindow.coffee",
    "content": "# Springseed. Simply awesome note taking.\n# Copyright (c) 2014, Springseed Team\n# All Rights Reserved.\n\napp = require \"app\"\nBrowserWindow = require \"browser-window\"\n\nclass AboutWindow\n  constructor: (devtools) ->\n    @window = new BrowserWindow\n      'width': 400\n      'height': 300\n      'center': true\n      'resizable': false\n      'title': \"About Springseed\"\n\n    @window.loadUrl \"file://#{__dirname}/../public/about.html\"\n\n    @window.on \"closed\",  ->\n      @window = null # Dereference the window.\n\nmodule.exports = AboutWindow\n"
  },
  {
    "path": "src/Springseed.coffee",
    "content": "# Springseed. Simply awesome note taking.\n# Copyright (c) 2014, Springseed Team\n# All Rights Reserved.\n\napp = require \"app\"\nMenu = require \"menu\"\nBrowserWindow = require \"browser-window\"\nAboutWindow = require \"./AboutWindow\"\n\n# We need a global reference of the window because Node.js may GC if if we don't.\nwindow = null\n\nclass SpringseedWindow\n  constructor: ->\n    window = new BrowserWindow\n      'width': 1024\n      'height': 600\n      'min-width': 500\n      'min-height': 300\n      'center': true\n      'title': \"Springseed\"\n\n    console.log __dirname\n\n    window.loadUrl \"file://\"+__dirname+\"/../public/index.html\"\n\n    window.on \"closed\",  ->\n      window = null # Dereference the window.\n\n    if process.platform is \"darwin\"\n      @osxMenus()\n    else\n      @linuxMenus()\n\n  osxMenus: ->\n    tmpl = [{\n        label: \"Springseed\",\n        submenu: [{\n          label: \"Developer Tools\",\n          accelerator: \"Control+Alt+I\"\n          click: =>\n            window.openDevTools()\n          }, {\n          label: \"About Springseed\",\n          click: =>\n            new AboutWindow()\n          }, {\n          label: \"Quit\",\n          accelerator: \"Command+Q\",\n          click: =>\n            app.quit()\n      }]\n    }]\n  linuxMenus: ->\n    tmpl = [{\n        label: \"Springseed\",\n        submenu: [{\n          label: \"Developer Tools\",\n          accelerator: \"Control+Alt+I\"\n          click: =>\n            window.openDevTools()\n          }, {\n          label: \"About Springseed\",\n          click: =>\n            new AboutWindow()\n          }, {\n          label: \"Quit\",\n          accelerator: \"Ctrl+Q\",\n          click: =>\n            app.quit()\n      }]\n    }]\n\n    menu = Menu.buildFromTemplate tmpl\n    Menu.setApplicationMenu menu\n\nmodule.exports = SpringseedWindow\n"
  },
  {
    "path": "src/main.coffee",
    "content": "# Springseed. Simply awesome note taking.\n# Copyright (c) 2014, Springseed Team\n# All Rights Reserved.\n\napp = require \"app\"\nSpringseedWindow = require './Springseed'\n\napp.on 'ready', ->\n  window = new SpringseedWindow()\n\napp.on 'window-all-closed', ->\n  app.quit()\n\napp.on 'activate-with-no-open-windows', ->\n  window = new SpringseedWindow()\n"
  }
]