Including radio button along with checkbox when serializing the form. Closes #193

--- src/dropzone.coffee
+++ src/dropzone.coffee
@@ -943,7 +943,7 @@
         inputName = input.getAttribute "name"
         inputType = input.getAttribute "type"

-        if !inputType or inputType.toLowerCase() != "checkbox" or input.checked
+        if !inputType or (inputType.toLowerCase() != "checkbox" and inputType.toLowerCase() != "radio") or input.checked
           formData.append inputName, input.value


Adding the mongoose-timestamp module

Adding the mongoose-timestamp module

--- src/injector.coffee
+++ src/injector.coffee
@@ -6,7 +6,8 @@

   ioc.registerDependencies {
-    "mongooseSchema":require("mongoose").Schema
+    "mongooseSchema"    : require("mongoose").Schema
+    "mongooseTimestamp" : require "mongoose-timestamp"
   }

   ioc.registerFolders __dirname, [


new: TreeMap

new: TreeMap

error: pathspec 'src/prim-treemap.coffee' did not match any file(s) known to git

--- src/prim-treemap.coffee
+++ src/prim-treemap.coffee
@@ -0,0 +1,45 @@
+require 'coffee-mate/global'
+{typeclass, instance} = require './typeclass'
+{match, show, samples, sample, htmlInline, htmlBlock} = require './typespec'
+{genBlockBody} = require './helpers'
+
+class TreeMap
+	constructor: (kspec, vspec) ->
+		assert -> typeclass('TypeSpec').hasInstance(kspec.constructor)
+		assert -> typeclass('TypeSpec').hasInstance(vspec.constructor)
+		return {
+			constructor: TreeMap
+			kspec: kspec
+			vspec: vspec
+		}
+
+instance('TypeSpec')(TreeMap).where
+	match: (t) -> (v) ->
+		{kspec, vspec} = t
+		mk = match(kspec)
+		mv = match(t)
+		v? and v.constructor is Object and (
+			(
+				(
+					(tag = Object.keys(v)[0]) is 'node'
+				) and (
+					all(mk)(ks = Object.keys(v.node)) and all(mv)(map(seek v.node) ks)
+				)
+			) or (
+				tag is 'leaf' and match(vspec)(v.leaf)
+			)
+		)
+	show: ({kspec, vspec}) ->
+		"TreeMap #{show kspec} #{show vspec}"
+	samples: ({kspec, vspec}) ->
+		ks = list take(4) samples(kspec)
+		vs = list take(3) samples(vspec)
+		concat repeat [dict([[ks[0], dict([[ks[2], vs[0]], [ks[3], vs[1]]])], [ks[1], vs[2]]])]
+	htmlInline: ({kspec, vspec}) ->
+		"TreeMap #{htmlInline kspec} #{htmlInline vspec}"
+	htmlBlock: ({kspec, vspec}) ->
+		head: "TreeMap ("
+		body: genBlockBody('treemap', 'meta-field') {key: kspec, value: vspec}
+		tail: ")"
+
+module.exports = {TreeMap}


Fix formatting.

Fix formatting.

--- tests/dom_tests/phantom_runner.coffee
+++ tests/dom_tests/phantom_runner.coffee
@@ -8,7 +8,7 @@
   height: 600

 page.onConsoleMessage = (msg) ->
-    console.log msg
+  console.log msg

 system = require 'system'
 fs = require 'fs'
@@ -18,15 +18,15 @@
 dirname = pathParts.join(fs.separator)

 page.open dirname + 'dom_tests.html', (status) ->
-    if status != 'success'
-        console.log 'Unable to load tests.'
-        phantom.exit 1
+  if status != 'success'
+    console.log 'Unable to load tests.'
+    phantom.exit 1

-    testsFailed = page.evaluate ->
-      Tests.run()
-      return Tests.testsFailed
+  testsFailed = page.evaluate ->
+    Tests.run()
+    return Tests.testsFailed

-    if testsFailed > 0
-      phantom.exit 1
-    else
-      phantom.exit 0
+  if testsFailed > 0
+    phantom.exit 1
+  else
+    phantom.exit 0


fixed missing if

fixed missing if

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tokopedia/nodame.git/'


add front-matter parser

add front-matter parser

error: pathspec 'front_matter_parser.coffee' did not match any file(s) known to git

--- front_matter_parser.coffee
+++ front_matter_parser.coffee
@@ -0,0 +1,42 @@
+frontMatter  = require('json-front-matter')
+_            = require('underscore')
+
+requiredAttrs    = ['title', 'date', 'author']
+ignoredFileNames = ['README.md', 'index.md']
+
+isEmptyObject    = (obj)  -> !Object.getOwnPropertyNames(obj).length
+fileIsIgnored    = (fileName) ->
+  if ignoredFileNames.indexOf(fileName) >= 0 then return true else return false
+
+keys = (obj) -> Object.getOwnPropertyNames(obj)
+
+#
+# CONSTANTS
+#
+
+BUILD_SUCCESS = 1
+BUILD_FAILURE = 0
+
+
+FrontMatterParser =
+  parse: (file) ->
+    return if fileIsIgnored(file.name)
+    frontMatter.parseFile file.path, (err, fileText) ->
+
+      if err or isEmptyObject(fileText.attributes)
+        console.log 'build failure!'
+        console.log "Error parsing JSON front-matter for file '#{file.fullPath}'\n"
+        return BUILD_FAILURE
+
+      attrDiff    = _.difference requiredAttrs, keys(fileText.attributes)
+      missingAttr = _.intersection(attrDiff, requiredAttrs)
+      if missingAttr.length
+        console.log 'Build failure!'
+        console.log "File '#{file.fullPath}' did not contain required attributes in the front-matter."
+        console.log "Required attributres are #{requiredAttrs.join(', ')}. File was missing a value for the following attibute(s): #{missingAttr.join(', ')}.\n"
+        return BUILD_FAILURE
+
+    # console.log 'build success!'
+    BUILD_SUCCESS
+
+module.exports = FrontMatterParser


Remove unneeded test for Users collection

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ecbypi/besko.git/'


Fix translations not being used on first load

--- app/core/Router.coffee
+++ app/core/Router.coffee
@@ -1,4 +1,5 @@
 dynamicRequire = require('lib/dynamicRequire')
+locale = require 'locale/locale'

 go = (path, options) -> -> @routeDirectly path, arguments, options

@@ -246,7 +247,11 @@
       path = 'play/CampaignView'

     path = "views/#{path}" if not _.string.startsWith(path, 'views/')
-    dynamicRequire(path).then (ViewClass) =>
+    Promise.all([
+      dynamicRequire(path), # Load the view file
+      # The locale load is already initialized by `application`, just need the promise
+      locale.load(me.get('preferredLanguage', true))
+    ]).then ([ViewClass]) =>
       return go('NotFoundView') if not ViewClass
       view = new ViewClass(options, args...)  # options, then any path fragment args
       view.render()


Correcting Atom config file

Correcting Atom config file

error: pathspec 'atom/config.cson' did not match any file(s) known to git

--- atom/config.cson
+++ atom/config.cson
@@ -0,0 +1,8 @@
+"*":
+  "exception-reporting":
+    userId: "bce0a17e-0c1a-7b9a-3b80-b30140ccd0e7"
+  minimap:
+    plugins:
+      linter: true
+  welcome:
+    showOnStartup: false


Add simple test for SendGraph component

Add simple test for SendGraph component

error: pathspec 'spec/SendGraph.coffee' did not match any file(s) known to git

--- spec/SendGraph.coffee
+++ spec/SendGraph.coffee
@@ -0,0 +1,21 @@
+noflo = require 'noflo'
+chai = require 'chai' unless chai
+SendGraph = require '../components/SendGraph.coffee'
+
+describe 'SendGraph component', ->
+  c = null
+  url = null
+  beforeEach ->
+    c = SendGraph.getComponent()
+    out = noflo.internalSocket.createSocket()
+    c.outPorts.out.attach out
+
+  describe 'when instantiated', ->
+    it 'should have a "graph" inport', ->
+      chai.expect(c.inPorts.graph).to.be.an 'object'
+    it 'should have a "runtime" inport', ->
+      chai.expect(c.inPorts.runtime).to.be.an 'object'
+    it 'should have a "out" outport', ->
+      chai.expect(c.outPorts.out).to.be.an 'object'
+    it 'should have a "error" outport', ->
+      chai.expect(c.outPorts.error).to.be.an 'object'


error loading ctrl

error loading ctrl

error: pathspec 'src/coffee/directives/error_loading.coffee' did not match any file(s) known to git

--- src/coffee/directives/error_loading.coffee
+++ src/coffee/directives/error_loading.coffee
@@ -0,0 +1,24 @@
+##
+## error_loading.coffee
+##
+## Created by Frederic DELBOS - fred.delbos@gmail.com on Dec 18 2013.
+## This file is subject to the terms and conditions defined in
+## file 'LICENSE.txt', which is part of this source code package.
+##
+
+angular.module('CoolForm').
+  directive('coolformErrorLoading', ($templateCache) ->
+
+    l = (scope) ->
+      scope.load = ->
+        scope.reload()
+
+    return {
+      restrict: 'E'
+      scope:
+        reload: '='
+      template: $templateCache.get('coolForm.error_loading')
+      replace: true
+      link: l
+    }
+  )


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

error: pathspec 'src/engine.coffee' did not match any file(s) known to git

--- src/engine.coffee
+++ src/engine.coffee
@@ -0,0 +1,213 @@
+( ($) ->
+  defaults =
+    FPS: 33.3333
+    ambientLight: 1
+    backgroundColor: "#FFFFFF"
+    cameraTransform: Matrix.IDENTITY
+
+  shadowCanvas = $("<canvas width=640 height=480 />").powerCanvas()
+  hudCanvas = $("<canvas width=640 height=480 />").powerCanvas()
+
+  hudCanvas.font("bold 9pt consolas, 'Courier New', 'andale mono', 'lucida console', monospace")
+
+  ###*
+  The engine holds a bunch of game objects and fires off cool events.
+
+  @name Engine
+  @constructor
+  ###
+  window.Engine = (I) ->
+    I ||= {}
+
+    $.reverseMerge I, defaults
+
+    intervalId = null
+    savedState = null
+    age = 0
+    paused = false
+
+    queuedObjects = []
+    objects = []
+
+    update = ->
+      objects = objects.select (object) ->
+        object.update()
+
+      objects = objects.concat(queuedObjects)
+      queuedObjects = []
+
+      self.trigger "update"
+
+    drawDeveloperOverlay = (canvas) ->
+      #TODO: Move this into the debug draw method of the objects themselves
+      canvas.withTransform I.cameraTransform, (canvas) ->
+        objects.each (object) ->
+          canvas.fillColor 'rgba(255, 0, 0, 0.5)'
+          canvas.fillRect(object.bounds().x, object.bounds().y, object.bounds().width, object.bounds().height)
+
+      canvas.fillColor 'rgba(0, 0, 0, 0.5)'
+      canvas.fillRect(430, 10, 200, 60)
+      canvas.fillColor '#fff'
+      canvas.fillText("Developer Mode. Press Esc to resume", 440, 25)
+      canvas.fillText("Left click to add boxes", 440, 43)
+      canvas.fillText("Right click red boxes to edit properties", 440, 60)
+
+    draw = ->
+      if I.ambientLight < 1
+        shadowContext = shadowCanvas.context()
+        shadowContext.globalCompositeOperation = "source-over"
+        shadowCanvas.clear()
+        # Fill with shadows
+        shadowCanvas.fill("rgba(0, 0, 0, #{1 - I.ambientLight})")
+
+        # Etch out the light
+        shadowContext.globalCompositeOperation = "destination-out"
+        shadowCanvas.withTransform I.cameraTransform, (shadowCanvas) ->
+          objects.each (object, i) ->
+            if object.illuminate
+              shadowContext.globalAlpha = 1
+              object.illuminate(shadowCanvas)
+
+      canvas.withTransform I.cameraTransform, (canvas) ->
+        if I.backgroundColor
+          canvas.fill(I.backgroundColor)
+
+        objects.invoke("draw", canvas, hudCanvas)
+
+      if I.ambientLight < 1
+        shadows = shadowCanvas.element()
+        canvas.drawImage(shadows, 0, 0, shadows.width, shadows.height, 0, 0, shadows.width, shadows.height)
+
+      hud = hudCanvas.element()
+      canvas.drawImage hud, 0, 0, hud.width, hud.height, 0, 0, hud.width, hud.height
+
+      drawDeveloperOverlay(canvas) if paused
+
+    step = ->
+      unless paused
+        update()
+        age += 1
+
+      draw()
+
+    canvas = I.canvas || $("<canvas />").powerCanvas()
+
+    construct = (entityData) ->
+      if entityData.class
+        entityData.class.constantize()(entityData)
+      else
+        GameObject(entityData)
+
+    self = Core(I).extend
+      add: (entityData) ->
+        obj = construct entityData
+
+        if intervalId && !paused
+          queuedObjects.push obj
+        else
+          objects.push obj
+
+      construct: construct
+
+      #TODO: This is only used in testing and should be removed when possible
+      age: ->
+        age
+
+      #TODO: This is a bad idea in case access is attempted during update
+      objects: ->
+        objects
+
+      objectAt: (x, y) ->
+        targetObject = null
+        bounds =
+          x: x
+          y: y
+          width: 1
+          height: 1
+
+        self.eachObject (object) ->
+          targetObject = object if object.collides(bounds)
+
+        return targetObject
+
+      eachObject: (iterator) ->
+        objects.each iterator
+
+      find: (selector) ->
+        results = []
+
+        matcher = EngineSelector.generate(selector)
+
+        objects.each (object) ->
+          results.push object if matcher.match object
+
+        $.extend results, EngineSelector.instanceMethods
+
+      collides: (bounds, sourceObject) ->
+        objects.inject false, (collided, object) ->
+          collided || (object.solid() && (object != sourceObject) && object.collides(bounds))
+
+      rayCollides: (source, direction, sourceObject) ->
+        hits = objects.map (object) ->
+          hit = object.solid() && (object != sourceObject) && Collision.rayRectangle(source, direction, object.centeredBounds())
+          hit.object = object if hit
+
+          hit
+
+        nearestDistance = Infinity
+        nearestHit = null
+
+        hits.each (hit) ->
+          if hit && (d = hit.distance(source)) < nearestDistance
+            nearestDistance = d
+            nearestHit = hit
+
+        nearestHit
+
+      rewind: () ->
+
+
+      saveState: () ->
+        savedState = objects.map (object) ->
+          $.extend({}, object.I)
+
+      loadState: (newState) ->
+        if newState ||= savedState
+          objects = newState.map (objectData) ->
+            construct $.extend({}, objectData)
+
+      reload: () ->
+        objects = objects.map (object) ->
+          construct object.I
+
+      start: () ->
+        unless intervalId
+          intervalId = setInterval(() ->
+            step()
+          , 1000 / I.FPS)
+
+      stop: () ->
+        clearInterval(intervalId)
+        intervalId = null
+
+      play: ->
+        paused = false
+
+      pause: ->
+        paused = true
+
+      paused: ->
+        paused
+
+      setFramerate: (newFPS) ->
+        I.FPS = newFPS
+        self.stop()
+        self.start()
+
+    self.attrAccessor "ambientLight"
+    self.attrAccessor "backgroundColor"
+    self.attrAccessor "cameraTransform"
+    self.include Bindable
+
+    return self
+)(jQuery)


bug fixes

bug fixes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


remove useless offline view

remove useless offline view

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/UCSFMemoryAndAging/tabcat.git/'


Fixed teamSpells instantiation

Fixed teamSpells instantiation

--- app/views/play/level_view.coffee
+++ app/views/play/level_view.coffee
@@ -198,7 +198,8 @@
     for spellTeam, spells of @session.get('teamSpells') ? @otherSession?.get('teamSpells') ? {}
       continue if spellTeam is myTeam or not myTeam
       opponentSpells = opponentSpells.concat spells
-
+    if (not @session.get('teamSpells')) and @otherSession?.get('teamSpells')
+      @session.set('teamSpells',@otherSession.get('teamSpells'))
     opponentCode = @otherSession?.get('transpiledCode') or {}
     myCode = @session.get('code') or {}
     for spell in opponentSpells


Add PropTypes snippets

Add PropTypes snippets

/bin/sh: 1: Syntax error: "(" unexpected


remove galleries and institutions from aggregates temporarily

--- apps/artist_new/aggregations.coffee
+++ apps/artist_new/aggregations.coffee
@@ -1 +1 @@
-module.exports = ['price_range', 'gallery', 'medium', 'institution', 'period', 'total']+module.exports = ['price_range', 'medium', 'period', 'total']


apply active treatment on page load to non-ratings based questions

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/PLOS/open_evaluation.git/'


Add google analytics

Add google analytics

Adds a coffeescript file for google analytics.

error: pathspec 'app/assets/javascripts/google_analytics.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/google_analytics.js.coffee
+++ app/assets/javascripts/google_analytics.js.coffee
@@ -0,0 +1,43 @@
+class @GoogleAnalytics
+
+  @load: ->
+    # Google Analytics depends on a global _gaq array. window is the global scope.
+    window._gaq = []
+    window._gaq.push ["_setAccount", GoogleAnalytics.analyticsId()]
+
+    # Create a script element and insert it in the DOM
+    ga = document.createElement("script")
+    ga.type = "text/javascript"
+    ga.async = true
+    ga.src = ((if "https:" is document.location.protocol then "https://ssl" else "http://www")) + ".google-analytics.com/ga.js"
+    firstScript = document.getElementsByTagName("script")[0]
+    firstScript.parentNode.insertBefore ga, firstScript
+
+    # If Turbolinks is supported, set up a callback to track pageviews on page:change.
+    # If it isn't supported, just track the pageview now.
+    if typeof Turbolinks isnt 'undefined' and Turbolinks.supported
+      document.addEventListener "page:change", (->
+        GoogleAnalytics.trackPageview()
+      ), true
+    else
+      GoogleAnalytics.trackPageview()
+
+  @trackPageview: (url) ->
+    unless GoogleAnalytics.isLocalRequest()
+      if url
+        window._gaq.push ["_trackPageview", url]
+      else
+        window._gaq.push ["_trackPageview"]
+      window._gaq.push ["_trackPageLoadTime"]
+
+  @isLocalRequest: ->
+    GoogleAnalytics.documentDomainIncludes "local"
+
+  @documentDomainIncludes: (str) ->
+    document.domain.indexOf(str) isnt -1
+
+  @analyticsId: ->
+    # your google analytics ID(s) here...
+    'UA-30253445-1'
+
+GoogleAnalytics.load()


Add bad robot script.

Add bad robot script.

error: pathspec 'scripts/bad-robot.coffee' did not match any file(s) known to git

--- scripts/bad-robot.coffee
+++ scripts/bad-robot.coffee
@@ -0,0 +1,6 @@
+# Description:
+#   Boom.
+
+module.exports = (robot) ->
+  robot.respond /bad robot/i, (res) ->
+    res.send "I'm sorry."


Removed irrelvant variables

Removed irrelvant variables

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


I didn't find that anywhere

I didn't find that anywhere

So maybe this was the problem?
Let's see.
Anyway we will now have some motion up there.
I hope nobody gets nervous about that.

error: pathspec 'app/assets/javascripts/carousel.coffee' did not match any file(s) known to git

--- app/assets/javascripts/carousel.coffee
+++ app/assets/javascripts/carousel.coffee
@@ -0,0 +1,2 @@
+$ ->
+  $('.carousel').carousel()


sample apps

sample apps

error: pathspec 'apps.coffee' did not match any file(s) known to git

--- apps.coffee
+++ apps.coffee
@@ -0,0 +1,18 @@
+apps = [
+	"Box"
+	"Citrix GoToMeeting"
+	"Concur"
+	"Docusign"
+	"Dropbox for Business"
+	"Dynamics CRM"
+	"Google Apps"
+	"Jive"
+	"Office 365 Exchange Online"
+	"Office 365 SharePoint Online"
+	"Salesforce"
+	"Salesforce Sandbox"
+	"ServiceNow"
+	"Workday"
+	"Azure Management Portal"
+	"Azure Preview Portal"
+]


[api] mini server

[api] mini server

error: pathspec 'src/server.coffee' did not match any file(s) known to git

--- src/server.coffee
+++ src/server.coffee
@@ -0,0 +1,19 @@
+Redis    = require "redis"
+Skeleton = require "nextorigin-express-skeleton"
+Borracho = require "./express-bull"
+
+
+class ElBorrachoServer extends Skeleton
+  constructor: ->
+    @redis = Redis.createClient()
+    super address: "0.0.0.0"
+
+  bindRoutes: ->
+    @borracho = new Borracho redisClient: @redis
+    @app.use "/jobs", @borracho.router
+    @app.get "/", (req, res, next) -> res.sendFile path.join __dirname, "../", "public", "index.html"
+
+
+ebs = new ElBorrachoServer
+ebs.listen()
+


Generate event-firing methods with factory

Dynamically create datastore methods which are essentially just event
firing methods using a function factory and refactor event creation
and firing to be more DRY.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-core.git/'


Fix spec now that `Theme.load` returns a theme instead of an array

--- spec/app/theme-spec.coffee
+++ spec/app/theme-spec.coffee
@@ -3,20 +3,20 @@
 Theme = require 'theme'

 describe "@load(name)", ->
-  themes = null
+  theme = null

   beforeEach ->
     $("#jasmine-content").append $("

")

   afterEach ->
-    theme.deactivate() for theme in themes
+    theme.deactivate()

   describe "TextMateTheme", ->
     it "applies the theme's stylesheet to the current window", ->
       expect($(".editor").css("background-color")).not.toBe("rgb(20, 20, 20)")

       themePath = require.resolve(fs.join('fixtures', 'test.tmTheme'))
-      themes = Theme.load(themePath)
+      theme = Theme.load(themePath)
       expect($(".editor").css("background-color")).toBe("rgb(20, 20, 20)")

   describe "AtomTheme", ->
@@ -26,7 +26,7 @@
       expect($(".editor").css("padding-bottom")).not.toBe("103px")

       themePath = require.resolve(fs.join('fixtures', 'test-atom-theme'))
-      themes = Theme.load(themePath)
+      theme = Theme.load(themePath)
       expect($(".editor").css("padding-top")).toBe("101px")
       expect($(".editor").css("padding-right")).toBe("102px")
       expect($(".editor").css("padding-bottom")).toBe("103px")


add estonia border sign

add estonia border sign

error: pathspec 'dev/ee.cson' did not match any file(s) known to git

--- dev/ee.cson
+++ dev/ee.cson
@@ -0,0 +1,8 @@
+information_border_ee:
+  category: 'information'
+  name: 'European border crossing into Estonia'
+  elements: [
+    { type: 'square-rounded', color: 'blue' }
+    { type: 'europe_stars', color: 'yellow' }
+    { type: 'content-5', color: 'white', content: 'EESTI' }
+  ]


fixing atom::flow

fixing atom::flow

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kennethaa/dotfiles.git/'


remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sharkspeed/dororis.git/'


fix broken locale files

fix broken locale files

--- client/app/locales/en.coffee
+++ client/app/locales/en.coffee
@@ -68,14 +68,10 @@
     'konnector description sosh': "Download all your Sosh Bills. This konnector requires the Files application to store the bill PDF files."
     'konnector description electrabel': "Download all you Electrabel Bills. This konnector requires the Files application to store the bill PDF files."
     'konnector description orange': "Download all your Orange Bills. This konnector requires the Files application to store the bill PDF files."
-<<<<<<< HEAD
     'konnector description nest': "Save current temperature measured by your Nest thermostat."
     'konnector description numericable': "Download all your Numéricable Bills. This konnector requires the Files application to store the bill PDF files."
     'konnector description virginmobile': "Download all your Virgin Mobile  bills. This konnector requires the Files application to store the bill PDF files."
-
-=======
     'konnector description isen': "Students from ISEN engineer school can import their course materials and calendar."
->>>>>>> 54aabd3004d88f202484ca6901539acad21d5e4d

     # Konnectors' notifications
     'notification prefix': "Konnector %{name}:"


Solved the first problem ^^

Solved the first problem ^^

error: pathspec 'coffescript/01.coffee' did not match any file(s) known to git

--- coffescript/01.coffee
+++ coffescript/01.coffee
@@ -0,0 +1,7 @@
+answer = ->
+  result = 0
+  for num in [1..999]
+    result += num if num % 3 is 0 or num % 5 is 0
+  return result
+
+console.log answer()


Adds shared ntb mongodb connetion module

error: pathspec 'coffee/database.coffee' did not match any file(s) known to git

--- coffee/database.coffee
+++ coffee/database.coffee
@@ -0,0 +1,24 @@
+mongodb = require 'mongodb'
+
+#
+# Connect to database
+#
+# @param {@code String} collection - collection name
+# @param {@code Function} cb - callback function (err, db)
+#
+module.exports = (collection, cb) ->
+  collection = collection || 'ntb_07'
+
+  replSet = new mongodb.ReplSet [
+    new mongodb.Server '127.0.0.1', 27017, {}
+    , new mongodb.Server '127.0.0.1', 27018, {}
+    , new mongodb.Server '127.0.0.1', 27019, {}
+  ]
+
+  db = new mongodb.Db collection, replSet,
+    native_parser: true
+    journal      : true
+
+  db.open (err, db) ->
+    return cb err, db
+


Uncommented some zh-HANT section headers.

--- app/locale/zh-HANT.coffee
+++ app/locale/zh-HANT.coffee
@@ -322,7 +322,7 @@
     multiplayer_caption: "跟朋友一起玩!"
     auth_caption: "儲存進度."

-#  inventory:
+  inventory:
     choose_inventory: "裝備物品"
     equipped_item: "已裝備"
     available_item: "可使用"
@@ -334,7 +334,7 @@
     equip: "裝備"
     unequip: "脫下"

-#  buy_gems:
+  buy_gems:
     few_gems: "一些寶石"
     pile_gems: "一堆寶石"
     chest_gems: "一箱寶石"


feat(zendeskService): use sapiErrorHandler on http errors

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-ex-zendesk.git/'


Reducing user code problems view to recent 300

Loading 1000 took too long (~10min) in production.

--- app/views/admin/UserCodeProblemsView.coffee
+++ app/views/admin/UserCodeProblemsView.coffee
@@ -28,7 +28,7 @@
       lastMonth.setMonth lastMonth.getMonth() - 1

     conditions = [
-      ['limit', 1000]
+      ['limit', 300]
       ['sort', '-created']
       ['where', 'created']
       ['gte', lastMonth.toString()]


Css class for help hint was deleted in the checkbox tag

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NightingaleStudio/exam.js.git/'


Add Form

Add Form

error: pathspec 'assets/js/src/form.coffee' did not match any file(s) known to git

--- assets/js/src/form.coffee
+++ assets/js/src/form.coffee
@@ -0,0 +1,4 @@
+class Form
+  constructor: (@form_json) ->
+
+module.exports = Form


Replace input delay with query length check

Now instead of delaying all search calls we simply ignore
what’s being typed in the search input field until it’s 3 characters
at least.

But we have to let 0 characters fire a call so that the list of all
articles can be displayed when people remove their search query.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/cmckni3/orientation.git/'


Fixed the settings view putting undefineds in the level documents and causing validation errors.

--- app/views/editor/level/settings_tab_view.coffee
+++ app/views/editor/level/settings_tab_view.coffee
@@ -51,4 +51,5 @@
   onSettingsChanged: (e) =>
     $('.level-title').text @settingsTreema.data.name
     for key in @editableSettings
+      continue unless @settingsTreema.data[key] is undefined
       @level.set key, @settingsTreema.data[key]


layer.popAll method

layer.popAll method

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


Write package.json async and report error

--- src/publish.coffee
+++ src/publish.coffee
@@ -231,10 +231,10 @@
     catch error
       throw new Error("Error parsing package.json file: #{error.message}")

-  saveMetadata: (pack) ->
+  saveMetadata: (pack, callback) ->
     metadataPath = path.resolve('package.json')
     metadataJson = JSON.stringify(pack, null, 2)
-    fs.writeFileSync(metadataPath, "#{metadataJson}\n")
+    fs.writeFile(metadataPath, "#{metadataJson}\n", callback)

   loadRepository: ->
     currentDirectory = process.cwd()
@@ -259,7 +259,10 @@
     if name?.length > 0 and pack.name isnt name
       message = "Renaming #{pack.name} to #{name}"
       process.stdout.write("#{message}\n")
-      @setPackageName pack, name, =>
+      @setPackageName pack, name, (error) =>
+        if error?
+          return callback(error)
+
         @spawn 'git', ['add', 'package.json'], (code, stderr='', stdout='') =>
           unless code is 0
             addOutput = "#{stdout}\n#{stderr}".trim()
@@ -276,12 +279,8 @@
       callback()

   setPackageName: (pack, name, callback) ->
-    if pack.name is name
-      return callback(new Error('New package name matches old package name'))
-
     pack.name = name
-    @saveMetadata(pack)
-    callback()
+    @saveMetadata(pack, callback)

   # Run the publish command with the given options
   run: (options) ->


Remove fs

Remove fs

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Hiroto-K/MP3-Downloader.git/'


Fix undefined Grim references

Fix undefined Grim references

--- src/package-manager.coffee
+++ src/package-manager.coffee
@@ -5,7 +5,7 @@
 {Emitter} = require 'event-kit'
 fs = require 'fs-plus'
 Q = require 'q'
-{deprecate} = require 'grim'
+Grim = require 'grim'

 Package = require './package'
 ThemePackage = require './theme-package'
@@ -111,11 +111,11 @@
   on: (eventName) ->
     switch eventName
       when 'loaded'
-        deprecate 'Use PackageManager::onDidLoadAll instead'
+        Grim.deprecate 'Use PackageManager::onDidLoadAll instead'
       when 'activated'
-        deprecate 'Use PackageManager::onDidActivateInitialPackages instead'
+        Grim.deprecate 'Use PackageManager::onDidActivateInitialPackages instead'
       else
-        deprecate 'PackageManager::on is deprecated. Use event subscription methods instead.'
+        Grim.deprecate 'PackageManager::on is deprecated. Use event subscription methods instead.'
     EmitterMixin::on.apply(this, arguments)

   ###


Added content disposition and content type to request

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/renanhangai/servitude.git/'


Environments: error handling

Environments: error handling

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Use text selection style

Use text selection style

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nathan/lemma.git/'


Update en.coffee

Update en.coffee

--- app/locale/en.coffee
+++ app/locale/en.coffee
@@ -81,6 +81,7 @@
     awaiting_levels_adventurer_prefix: "We release five levels per week."
     awaiting_levels_adventurer: "Sign up as an Adventurer"
     awaiting_levels_adventurer_suffix: "to be the first to play new levels."
+    adjust_volume: "Adjust volume"
     choose_your_level: "Choose Your Level"  # The rest of this section is the old play view at /play-old and isn't very important.
     adventurer_prefix: "You can jump to any level below, or discuss the levels on "
     adventurer_forum: "the Adventurer forum"


Update ko.coffee

Update ko.coffee

--- app/locale/ko.coffee
+++ app/locale/ko.coffee
@@ -7,7 +7,7 @@
     cancel: "취소"
     save: "저장"
 #    publish: "Publish"
-#    create: "Create"
+    create: "생성"
     delay_1_sec: "1초"
     delay_3_sec: "3초"
     delay_5_sec: "5초"
@@ -431,7 +431,7 @@
 #    tip_forums: "Head over to the forums and tell us what you think!"
 #    tip_baby_coders: "In the future, even babies will be Archmages."
 #    tip_morale_improves: "Loading will continue until morale improves."
-#    tip_all_species: "We believe in equal opportunities to learn programming for all species."
+    tip_all_species: "우리는 모든 생물이 동등하게 프로그래밍을 배울 기회가 있어야 한다고 생각합니다."
 #    tip_reticulating: "Reticulating spines."
 #    tip_harry: "Yer a Wizard, "
 #    tip_great_responsibility: "With great coding skill comes great debug responsibility."
@@ -448,15 +448,15 @@
 #    time_current: "Now:"
 #    time_total: "Max:"
 #    time_goto: "Go to:"
-#    infinite_loop_try_again: "Try Again"
-#    infinite_loop_reset_level: "Reset Level"
+    infinite_loop_try_again: "다시 시도해보세요."
+    infinite_loop_reset_level: "레벨 리셋"
 #    infinite_loop_comment_out: "Comment Out My Code"

 #  keyboard_shortcuts:
 #    keyboard_shortcuts: "Keyboard Shortcuts"
-#    space: "Space"
-#    enter: "Enter"
-#    escape: "Escape"
+    space: "스페이스"
+    enter: "엔터"
+    escape: "Esc"
 #    cast_spell: "Cast current spell."
 #    continue_script: "Continue past current script."
 #    skip_scripts: "Skip past all skippable scripts."
@@ -655,7 +655,7 @@
     art_music: "뮤직"
     art_sound: "사운드"
     art_artwork: "원화"
-#    art_sprites: "Sprites"
+    art_sprites: "스프라이트"
 #    art_other: "Any and all other non-code creative works that are made available when creating Levels."
 #    art_access: "Currently there is no universal, easy system for fetching these assets. In general, fetch them from the URLs as used by the site, contact us for assistance, or help us in extending the site to make these assets more easily accessible."
 #    art_paragraph_1: "For attribution, please name and link to codecombat.com near where the source is used or where appropriate for the medium. For example:"
@@ -774,12 +774,12 @@
     ambassador_title_description: "(지원)"

 #  ladder:
-#    please_login: "Please log in first before playing a ladder game."
-#    my_matches: "My Matches"
-#    simulate: "Simulate"
-#    simulation_explanation: "By simulating games you can get your game ranked faster!"
-#    simulate_games: "Simulate Games!"
-#    simulate_all: "RESET AND SIMULATE GAMES"
+    please_login: "토너먼트 게임을 시작하기 앞서 로그인해주세요."
+    my_matches: "나의 경기들"
+    simulate: "시뮬레이션"
+    simulation_explanation: "시뮬레이션을 통해 더 빨리 랭킹 평가를 받을 수 있습니다."
+    simulate_games: "시뮬레이션 실행!"
+    simulate_all: "리셋하고 시뮬레이션 하기"
 #    games_simulated_by: "Games simulated by you:"
 #    games_simulated_for: "Games simulated for you:"
 #    games_simulated: "Games simulated"


Some important information

Some important information

--- app/locale/ms.coffee
+++ app/locale/ms.coffee
@@ -293,7 +293,7 @@
     version: "Versi"
     commit_msg: "Mesej Commit"
 #    history: "History"
-#    version_history_for: "Version History for: "
+    version_history_for: "Versi History untuk: "
     result: "Keputusan"
     results: "Keputusan-keputusan"
     description: "Deskripsi"


Fixed a small error

Fixed a small error

--- app/locale/nl.coffee
+++ app/locale/nl.coffee
@@ -228,7 +228,7 @@
     loading_ready: "Klaar!"
     tip_insert_positions: "Shift+Klik een punt op de kaart om het toe te voegen aan je spreuk editor."
     tip_toggle_play: "Verwissel speel/pauze met Ctrl+P."
-    tip_scrub_shortcut: "Ctrl+[ and Ctrl+] om terug te spoelen en vooruit te spoelen."
+    tip_scrub_shortcut: "Ctrl+[ en Ctrl+] om terug te spoelen en vooruit te spoelen."
     tip_guide_exists: "Klik op de handleiding bovenaan het scherm voor nuttige informatie."
     tip_open_source: "CodeCombat is 100% open source!"
     tip_beta_launch: "CodeCombat lanceerde zijn beta versie in Oktober, 2013."


ogre ==> ork and a serious spelling error

--- app/locale/nl.coffee
+++ app/locale/nl.coffee
@@ -288,7 +288,7 @@
     tip_debugging_program: "Als debuggen het proces is om bugs te verwijderen, dan moet programmeren het proces zijn om ze erin te stoppen. - Edsger W. Dijkstra"
     tip_forums: "Ga naar de forums en vertel ons wat je denkt!"
     tip_baby_coders: "Zelfs babies zullen in de toekomst een Tovenaar zijn."
-    tip_morale_improves: "Het spel zal blijven laden tot de moreel verbeterd."
+    tip_morale_improves: "Het spel zal blijven laden tot de moreel verbetert."
     tip_all_species: "Wij geloven in gelijke kansen voor alle wezens om te leren programmeren."
     tip_reticulating: "Paden aan het verknopen."
     tip_harry: "Je bent een tovenaar, "
@@ -664,7 +664,7 @@
     to_battle: "Naar het slagveld, ontwikkelaars!"
     modern_day_sorcerer: "Kan jij programmeren? Dat is pas stoer. Jij bent een moderne tovenaar! Is het niet tijd dat je jouw magische krachten gebruikt voor het besturen van jou minions in het slagveld? En nee, we praten hier niet over robots."
     arenas_are_here: "CodeCombat's kop aan kop multiplayer arena's zijn er."
-    ladder_explanation: "Kies jouw helden, betover jouw mensen of ogre legers, en beklim jouw weg naar de top in de ladder, door het verslagen van vriend en vijand. Daag nu je vrienden uit in de multiplayer programmeer arena's en verdien eeuwige roem. Indien je creatief bent, kan je zelfs"
+    ladder_explanation: "Kies jouw helden, betover jouw mensen of ork-legers, en beklim jouw weg naar de top in de ladder, door het verslagen van vriend en vijand. Daag nu je vrienden uit in de multiplayer programmeer arena's en verdien eeuwige roem. Indien je creatief bent, kan je zelfs"
     fork_our_arenas: "onze arenas forken"
     create_worlds: "en jouw eigen werelden creëren."
     javascript_rusty: "Jouw JavaScript is een beetje roestig? Wees niet bang, er is een"


Unlocked all levels again until we can figure out the achievement timing problems.

--- app/views/play/WorldMapView.coffee
+++ app/views/play/WorldMapView.coffee
@@ -68,7 +68,8 @@
       for level, index in campaign.levels
         level.x ?= 10 + 80 * Math.random()
         level.y ?= 10 + 80 * Math.random()
-        level.locked = index > 0 and not me.earnedLevel level.original
+        #level.locked = index > 0 and not me.earnedLevel level.original
+        level.locked = false  # Until we can solve the bug.
     context.levelStatusMap = @levelStatusMap
     context.levelPlayCountMap = @levelPlayCountMap
     context.isIPadApp = application.isIPadApp


Create keymap.cson

Create keymap.cson

error: pathspec 'keymap.cson' did not match any file(s) known to git

--- keymap.cson
+++ keymap.cson
@@ -0,0 +1,10 @@
+'.platform-win32, .platform-linux':
+  'alt-\\': 'unset!' # 'tree-view:toggle-focus'
+  'ctrl-|': 'unset!'
+  'ctrl-0': 'tree-view:reveal-active-file'
+
+'atom-workspace atom-text-editor:not([mini])':
+  'ctrl-up': 'unset!'
+  'ctrl-shift-up': 'editor:move-line-up'
+  'ctrl-down': 'unset!'
+  'ctrl-shift-down': 'editor:move-line-down'


Line length

Line length

--- background_scripts/commands.coffee
+++ background_scripts/commands.coffee
@@ -100,7 +100,8 @@
     historyNavigation:
       ["goBack", "goForward"]
     tabManipulation:
-      ["nextTab", "previousTab", "firstTab", "lastTab", "createTab", "duplicateTab", "removeTab", "restoreTab", "moveTabToNewWindow", "togglePinTab"]
+      ["nextTab", "previousTab", "firstTab", "lastTab", "createTab", "duplicateTab", "removeTab",
+       "restoreTab", "moveTabToNewWindow", "togglePinTab"]
     misc:
       ["showHelp"]


Update Atom version

Update Atom version

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/fuzza/dotfiles.git/'


tag button states are maintained after view render using userPrefs.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kristenhazard/epm-catalog.git/'


only setting default from date if dates are not specifiec on initialization

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lonelyplanet/rizzo.git/'


[codegen/emit] properly strip comments.

[codegen/emit] properly strip comments.

hack
hack
hack
HACK

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/demhydraz/cafe.git/'


Don't automatically focus when attach is called

Only focus when toggling the tree view or revealing
an active file.

This prevents the tree view from stealing focus when it
is attached during deserialization.

--- src/packages/tree-view/lib/tree-view.coffee
+++ src/packages/tree-view/lib/tree-view.coffee
@@ -72,15 +72,12 @@
     if @hasFocus()
       @detach()
     else
-      if @hasParent()
-        @focus()
-      else
-        @attach()
+      @attach() unless @hasParent()
+      @focus()

   attach: ->
     return unless project.getPath()
     rootView.horizontal.prepend(this)
-    @focus()

   detach: ->
     @scrollTopAfterAttach = @scrollTop()
@@ -134,6 +131,7 @@

   revealActiveFile: ->
     @attach()
+    @focus()

     return unless activeFilePath = rootView.getActiveEditor()?.getPath()


Correct tpb

Correct tpb

--- main.coffee
+++ main.coffee
@@ -7,7 +7,6 @@
 path = require 'path'
 http = require 'http'
 urltool = require 'url'
-tpb = require 'thepiratebay'
 childProcess = require 'child_process'
 fs = require 'fs'
 rimraf = require 'rimraf'
@@ -476,4 +475,4 @@
       console.log "Could not give PiTV the authority back!"

 omx.emitter.on 'complete', ->
-  remote.emit 'statePlaying', titlePlaying
+  remote.emit 'statePlaying', titlePlaying


added klout.coffee

added klout.coffee

error: pathspec 'src/scripts/klout.coffee' did not match any file(s) known to git

--- src/scripts/klout.coffee
+++ src/scripts/klout.coffee
@@ -0,0 +1,118 @@
+# Description
+#   Reports Klout score for a twitter handle.  If that person is part of the competitors
+#   list, the players whose score is greater will be reported. Default competitors are @attachmentsme
+#
+# Dependencies:
+#   You'll have to put in your own klout api key. Signup for one at http://klout.com/s/developers/home
+#
+# Configuration:
+#   The competitors list's name and id parameters can be modified to include 10 members.
+#   More than 10 will potentially cause trigger the per second rate limit with klout.
+#     <name> is a twitter name
+#     <id> is a klout id, not a twitter id. Use the interactive console to get this. http://developer.klout.com/io-docs
+#
+# Commands:
+#   klout <twitter name without @>
+#
+# Author:
+#   l_kang
+
+
+klout_api_key = "your_klout_api_key"
+
+module.exports = (robot) ->
+    robot.respond /.*(klout) [@]?(.+)$/i, (msg) ->
+        if klout_api_key == "your_klout_api_key"
+            msg.send "I wont report any scores until you get your own Klout api key"
+            return
+
+        name = msg.match[2]
+
+        done = checkList name, msg, (result)->
+            msg.send result
+        return if done
+
+        getKloutScoreByName name, msg, (p)->
+            if p.id == 0
+                msg.send "Sorry, I cant figure out who @#{name} is"
+            else
+                msg.send "Klout for @#{p.name} is #{p.score}"
+
+competitors = [{
+    "name": "l_kang"
+    "id": "1065822"
+    "score": 0
+},
+{
+    "name": "danreedx86"
+    "id": "37154701691656080"
+    "score": 0
+},
+{
+    "name": "benjamincoe"
+    "id": "85568398087782958"
+    "score": 0
+},
+{
+    "name": "jesse_miller"
+    "id": "529139"
+    "score": 0
+},
+{
+    "name": "joshkowaleski"
+    "id": "524476"
+    "score": 0
+},
+{
+    "name": "rissem"
+    "id": "41376826341708013"
+    "score": 0
+}]
+
+checkList = (pname, msg, callback)->
+    player = p for p in competitors when p.name == pname
+    return false if player == undefined
+    getKloutScores competitors, 0, msg, ()->
+        leaderNames = for p in competitors when p.score > player.score
+            " @#{p.name}"
+        if leaderNames.length == 0
+            tag = "Nobody is ahead of @#{player.name}!"
+        else if leaderNames.length == 1
+            tag = "#{leaderNames.join(',')} is ahead though."
+        else
+            tag = "#{leaderNames.join(',')} are ahead though."
+        callback "@#{player.name}'s Klout is #{player.score}. #{tag}"
+    true
+
+getKloutScores = ( hashlist, index, msg, doneCallback )->
+    return if hashlist.length == index
+    thisPlayer = hashlist[index]
+    url = "http://api.klout.com/v2/user.json/#{thisPlayer.id}/score?key=#{klout_api_key}"
+    msg.http(url)
+        .get() (error, response, body)->
+            scoreRecord = JSON.parse( body )
+            # console.log "scoreRecord: "
+            # console.log scoreRecord
+            thisPlayer.score = scoreRecord.score
+            if hashlist.length == index+1
+                doneCallback( thisPlayer )
+            else
+                getKloutScores( hashlist, index+1, msg, doneCallback )
+
+getKloutScoreByName = (name, msg, callback)->
+    url = "http://api.klout.com/v2/identity.json/twitter?key=#{klout_api_key}&screenName=#{name}"
+    msg.http(url)
+        .get() (error, response, body)->
+            player = [{
+                name:  name
+                id:    0
+                score: 0
+            }]
+            if error || response.statusCode != 200 || body == undefined
+                callback( player[0] )
+                return
+            kloutIdRec = JSON.parse( body )
+            player.id = kloutIdRec.id
+            getKloutScores player, 0, msg, callback
+
+


Remove trailing whitespace

Remove trailing whitespace

--- app/coffeescripts/Util.coffee
+++ app/coffeescripts/Util.coffee
@@ -27,7 +27,7 @@
   # This method is used to grab the model elements from object model by id.
   # The list is the list you want to iterate over and the id is what you want to find
   @getElement: (id, list) ->
-    _.find(list, (elem) ->  elem.get('id') == id)
+    _.find(list, (elem) ->  elem.get('id') == id)

   # creates a copy of of item array. The items array is a list menu items for context menus.
   @copy: (items) ->
@@ -51,4 +51,4 @@
       $('body').append(elemIF)
       )
     xhReq.send(new XMLSerializer().serializeToString(xml))
-  +


Removed spaces for coding convention

Removed spaces for coding convention

--- app/views/play/ladder/my_matches_tab.coffee
+++ app/views/play/ladder/my_matches_tab.coffee
@@ -102,7 +102,7 @@
     @$el.find('.rank-button').each (i, el) =>
       button = $(el)
       sessionID = button.data('session-id')
-      session = _.find @sessions.models, { id: sessionID }
+      session = _.find @sessions.models, {id: sessionID}
       rankingState = 'unavailable'
       if @readyToRank session
         rankingState = 'rank'
@@ -119,14 +119,14 @@
   rankSession: (e) ->
     button = $(e.target).closest('.rank-button')
     sessionID = button.data('session-id')
-    session = _.find @sessions.models, { id: sessionID }
+    session = _.find @sessions.models, {id: sessionID}
     return unless @readyToRank(session)

     @setRankingButtonText(button, 'submitting')
     success = => @setRankingButtonText(button, 'submitted')
     failure = => @setRankingButtonText(button, 'failed')

-    ajaxData = { session: sessionID, levelID: @level.id, originalLevelID: @level.attributes.original, levelMajorVersion: @level.attributes.version.major }
+    ajaxData = {session: sessionID, levelID: @level.id, originalLevelID: @level.attributes.original, levelMajorVersion: @level.attributes.version.major}
     console.log "Posting game for ranking from My Matches view."
     $.ajax '/queue/scoring', {
       type: 'POST'


old controller translated to coffeescript

error: pathspec 'controller.coffee' did not match any file(s) known to git

--- controller.coffee
+++ controller.coffee
@@ -0,0 +1,493 @@
+defaultConfig = (req) ->
+  owner = req.from
+  a = owner.split(":")
+  owner = a[a.length - 1].split("@")[0]
+
+    title: owner + "'s node"
+    description: "Where " + owner + " publishes things"
+    type: "http://www.w3.org/2005/Atom"
+    accessModel: "open"
+    publishModel: "subscribers"
+    creationDate: new Date().toISOString()
+applyRSM = (rsmQuery, results) ->
+  rsmQuery = rsmQuery or {}
+  rsmResult = count: results.length
+  if rsmQuery.after
+    while results.length > 0
+      key = results.shift()
+      if key == rsmQuery.after
+        break
+  if rsmQuery.before
+    while results.length > 0
+      key = results.pop()
+      if key == rsmQuery.before
+        break
+    if rsmQuery.count
+      results = results.slice(Math.max(0, results.length - rsmQuery.count))
+  if rsmQuery.count
+    results = results.slice(0, rsmQuery.count)
+  if results.length > 0
+    rsmResult.first = results[0]
+    rsmResult.last = results[results.length - 1]
+  Object.create(rsmResult: rsmResult, o: results)
+isAffiliationSubset = (subset, affiliation) ->
+  subset == affiliation or (AFFILIATION_SUBSETS.hasOwnProperty(affiliation) and AFFILIATION_SUBSETS[affiliation].indexOf(subset) >= 0)
+callFrontend = (hook, uri) ->
+  colonPos = uri.indexOf(":")
+  if colonPos > 0
+    proto = uri.substr(0, colonPos)
+    uri = uri.substr(colonPos + 1)
+  else
+    return
+  args = Array::.slice.call(arguments, 1)
+  frontend = frontends.hasOwnProperty(proto) and frontends[proto]
+  hookFun = frontend and frontend.hasOwnProperty(hook) and frontend[hook]
+  console.log
+    callFrontend: arguments
+    frontent: frontend
+    hookFun: hookFun
+    args: args
+
+  if hookFun
+    return hookFun.apply(frontend, args)
+objectIsEmpty = (o) ->
+  for k of o
+    if o.hasOwnProperty(k)
+      return false
+  true
+step = require("step")
+errors = require("./errors")
+normalize = require("./normalize")
+
+exports.setModel = (m) ->
+  model = m
+
+FEATURES =
+  "create-nodes": create:
+    requiredAffiliation: "owner"
+    transaction: (req, t, cb) ->
+      step ->
+        t.createNode req.node, this
+      , (err) ->
+        if err
+          throw err
+        t.setConfig req.node, defaultConfig(req), this
+      , (err) ->
+        if err
+          throw err
+        t.setAffiliation req.node, req.from, "owner", this
+      , (err) ->
+        if err
+          throw err
+        t.setSubscription req.node, req.from, "subscribed", this
+      , cb
+
+  subscribe:
+    subscribe:
+      transaction: (req, t, cb) ->
+        step ->
+          t.getConfig req.node, this
+        , (err, config_) ->
+          if err
+            throw err
+          config = config_
+          if not config.accessModel or config.accessModel == "open"
+            this null, "subscribed"
+          else
+            t.getSubscription req.node, req.from, this
+        , (err, subscription) ->
+          if err
+            throw err
+          unless subscription
+            switch config.accessModel
+              when "authorize"
+                this null, "pending"
+              else
+                throw new errors.Forbidden()
+          else
+            this null, subscription
+        , (err, subscription) ->
+          if err
+            throw err
+          req.subscription = subscription
+          t.setSubscription req.node, req.from, subscription, this
+        , (err) ->
+          if err
+            throw err
+          if req.subscription == "pending"
+            step ->
+              t.getOwners req.node, this
+            , (err, owners) ->
+              if err
+                throw err
+              req.owners = owners
+              this null, req.subscription
+            , this
+          else
+            this null, req.subscription
+        , cb
+
+      afterTransaction: (req) ->
+        if req.subscription == "pending" and req.owners
+          req.owners.forEach (owner) ->
+            callFrontend "approve", owner, req.node, req.from
+
+    unsubscribe: transaction: (req, t, cb) ->
+      nodeM = req.node.match(/^\/user\/(.+?)\/([a-zA-Z0-9\/\-]+)$/)
+      userM = req.from.match(/^(.+?):(.+)$/)
+      if nodeM and nodeM[1] == userM[2]
+        cb new errors.NotAllowed("Owners must not abandon their channels")
+        return
+      t.setSubscription req.node, req.from, "none", cb
+
+  publish: publish:
+    requiredAffiliation: "publisher"
+    transaction: (req, t, cb) ->
+      step ->
+        if objectIsEmpty(req.items)
+          this null, []
+        else
+          g = @group()
+          for id of req.items
+            if req.items.hasOwnProperty(id)
+              step ->
+                t.getItem req.node, id, this
+              , (err, oldItem) ->
+                reqItem = Object.create(req)
+                reqItem.item = req.items[id]
+                reqItem.itemId = id
+                reqItem.oldItem = oldItem
+                normalize.normalizeItem reqItem, this
+              , (err, reqNormalized) ->
+                if err
+                  throw err
+                t.writeItem req.from, req.node, reqNormalized.itemId, reqNormalized.item, this
+              , g()
+      , cb
+
+    subscriberNotification: (req, subscribers) ->
+      subscribers.forEach (subscriber) ->
+        callFrontend "notify", subscriber.user, req.node, req.items
+
+  "retract-items": retract:
+    requiredAffiliation: "publisher"
+    transaction: (req, t, cb) ->
+      step ->
+        if req.itemIds.length < 1
+          this null, []
+        else
+          g = @group()
+          req.itemIds.forEach (itemId) ->
+            t.deleteItem req.node, itemId, g()
+      , cb
+
+    subscriberNotification: (req, subscribers) ->
+      subscribers.forEach (subscriber) ->
+        callFrontend "retracted", subscriber.user, req.node, req.itemIds
+
+  "retrieve-items":
+    retrieve:
+      requiredAffiliation: "member"
+      transaction: (req, t, cb) ->
+        step ->
+          t.getItemIds req.node, this
+        , (err, ids_) ->
+          if err
+            throw err
+          ids = applyRSM(req.rsmQuery, ids_)
+          if ids.length < 1
+            this null, []
+          else
+            g = @group()
+            ids.forEach (id) ->
+              t.getItem req.node, id, g()
+        , (err, items) ->
+          if err
+            throw err
+          results = []
+
+          while (id = ids.shift()) and (item = items.shift())
+            results.push
+              id: id
+              item: item
+          results.rsmResult = ids.rsmResult
+          this null, results
+        , cb
+
+    replay: transaction: (req, t, cb) ->
+      t.getUpdatesByTime req.from, req.timeStart, req.timeEnd, req.notifyCb, cb
+
+  "retrieve-subscriptions": retrieve: transaction: (req, t, cb) ->
+    t.getSubscriptions req.from, cb
+
+  "retrieve-affiliations": retrieve: transaction: (req, t, cb) ->
+    t.getAffiliations req.from, cb
+
+  "manage-subscriptions":
+    retrieve:
+      requiredAffiliation: "member"
+      transaction: (req, t, cb) ->
+        t.getSubscribers req.node, cb
+
+    modify:
+      requiredAffiliation: "owner"
+      transaction: (req, t, cb) ->
+        step ->
+          if objectIsEmpty(req.subscriptions)
+            this null
+            return
+          g = @group()
+          for user of req.subscriptions
+            subscription = req.subscriptions[user]
+            switch subscription
+              when "subscribed"
+                t.setSubscription req.node, user, g()
+              when "none"
+                t.setSubscription req.node, user, g()
+              else
+                throw new errors.BadRequest(subscription + " is no subscription type")
+        , cb
+
+      afterTransaction: (req) ->
+        for user of req.subscriptions
+          callFrontend "subscriptionModified", user, req.subscriptions[user]
+
+  "modify-affiliations":
+    retrieve:
+      requiredAffiliation: "member"
+      transaction: (req, t, cb) ->
+        t.getAffiliated req.node, cb
+
+    modify:
+      requiredAffiliation: "owner"
+      transaction: (req, t, cb) ->
+        if objectIsEmpty(req.affiliations)
+          this null
+          return
+        step ->
+          g = @group()
+          for user of req.affiliations
+            affiliation = req.affiliations[user]
+            t.setAffiliation req.node, user, affiliation, g()
+        , cb
+
+  "config-node":
+    retrieve:
+      requiredAffiliation: "member"
+      transaction: (req, t, cb) ->
+        step ->
+          t.getConfig req.node, this
+        , (err, config) ->
+          unless config
+            config = defaultConfig(req)
+          this null, config
+        , cb
+
+    modify:
+      requiredAffiliation: "owner"
+      transaction: (req, t, cb) ->
+        step ->
+          t.getConfig req.node, this
+        , (err, config) ->
+          unless config
+            config = defaultConfig(req)
+          req.config = config
+          t.setConfig req.node,
+            title: req.title or config.title
+            description: req.description or config.description
+            type: req.type or config.type
+            accessModel: req.accessModel or config.accessModel
+            publishModel: req.publishModel or config.publishModel
+            creationDate: config.creationDate
+          , this
+        , cb
+
+      subscriberNotification: (req, subscribers) ->
+        subscribers.forEach (subscriber) ->
+          callFrontend "configured", subscriber.user, req.node, req.config
+
+  "get-pending":
+    "list-nodes": transaction: (req, t, cb) ->
+      t.getPendingNodes req.from, cb
+
+    "get-for-node":
+      requiredAffiliation: "owner"
+      transaction: (req, t, cb) ->
+        step ->
+          t.getPending req.node, this
+        , (err, users) ->
+          if err
+            throw err
+          req.pendingUsers = users
+          this null
+        , cb
+
+      afterTransaction: (req) ->
+        req.pendingUsers.forEach (user) ->
+          callFrontend "approve", req.from, req.node, user
+
+  register: register: transaction: (req, t, cb) ->
+    user = req.from
+    if (m = user.match(/^.+:(.+)$/))
+      user = m[1]
+    nodes = [ "channel", "mood", "subscriptions", "geo/current", "geo/future", "geo/previous" ].map((name) ->
+      "/user/" + user + "/" + name
+    )
+    step ->
+      g = @group()
+      nodes.forEach (node) ->
+        t.createNode node, g()
+    , (err) ->
+      if err
+        throw err
+      g = @group()
+      nodes.forEach (node) ->
+        t.setConfig node, defaultConfig(req), g()
+        t.setAffiliation node, req.from, "owner", g()
+        t.setSubscription node, req.from, "subscribed", g()
+    , cb
+
+  "browse-nodes":
+    list: transaction: (req, t, cb) ->
+      t.listNodes cb
+
+    "by-user": transaction: (req, t, cb) ->
+      if (m = req.node.match(/^\/user\/([^\/]+)$/))
+        t.listNodesByUser m[1], cb
+      else
+        throw new errors.NotFound("User not found")
+
+exports.pubsubFeatures = ->
+  result = []
+  for f of FEATURES
+    result.push f
+  result
+
+exports.request = (req) ->
+  feature = FEATURES[req.feature]
+  operation = feature and feature[req.operation]
+  req.affiliation = "none"
+  unless operation
+    req.callback new errors.FeatureNotImplemented("Operation not yet supported")
+    return
+  debug = (s) ->
+    console.log req.from + " >> " + req.feature + "/" + req.operation + ": " + s
+
+  if req.node and req.from
+    nodeM = req.node.match(/^\/user\/(.+?)\/([a-zA-Z0-9\/\-]+)$/)
+    userM = req.from.match(/^(.+?):(.+)$/)
+    if nodeM and nodeM[1] == userM[2]
+      req.affiliation = "owner"
+  model.transaction (err, t) ->
+    if err
+      req.callback err
+      return
+    steps = [ (err) ->
+      this null
+     ]
+    if operation.requiredAffiliation and not isAffiliationSubset(operation.requiredAffiliation, req.affiliation)
+      steps.push (err) ->
+        if err
+          throw err
+        t.getConfig req.node, this
+      , (err, config_) ->
+        if err
+          throw err
+        config = config_
+        t.getAffiliation req.node, req.from, this
+      , (err, affiliation) ->
+        if err
+          throw err
+        req.affiliation = affiliation or req.affiliation
+        t.getSubscription req.node, req.from, this
+      , (err, subscription) ->
+        if err
+          throw err
+        if req.affiliation == "none" and (not config.accessModel or config.accessModel == "open")
+          req.affiliation = "member"
+        else if req.affiliation == "member" and config.publishModel == "publishers" and subscription == "subscribed"
+          req.affiliation = "publisher"
+        if isAffiliationSubset(operation.requiredAffiliation, req.affiliation)
+          this()
+        else
+          this new errors.Forbidden(operation.requiredAffiliation + " required")
+
+    steps.push (err) ->
+      if err
+        throw err
+      debug "transaction"
+      operation.transaction req, t, this
+    , (err) ->
+      if err
+        throw err
+      debug "transaction done"
+      transactionResults = arguments
+      this null
+
+
+    if operation.subscriberNotification
+      steps.push (err) ->
+        if err
+          throw err
+        t.getSubscribers req.node, this
+      , (err, subscribers_) ->
+        if err
+          throw err
+        subscribers = subscribers_
+        this null
+    steps.push (err) ->
+      if err
+        that = this
+        debug "transaction rollback: " + (err.message or JSON.stringify(err))
+        t.rollback ->
+          that err
+      else
+        debug "transaction commit"
+        t.commit this
+
+    if operation.afterTransaction
+      steps.push (err) ->
+        if err
+          throw err
+        operation.afterTransaction req
+        this null
+    if operation.subscriberNotification
+      steps.push (err) ->
+        if err
+          throw err
+        operation.subscriberNotification req, subscribers
+        this null
+    steps.push (err) ->
+      debug "callback"
+      if err and req.callback
+        unless err.stack
+          err.stack = (err.message or err.condition or "Error") + " @ " + req.feature + "/" + req.operation
+        req.callback err
+      else if req.callback
+        req.callback.apply req, transactionResults
+
+    step.apply null, steps
+
+exports.getAllSubscribers = (cb) ->
+  model.transaction (err, t) ->
+    if err
+      cb err
+      return
+    t.getAllSubscribers (err, subscribers) ->
+      if err
+        t.rollback ->
+          cb err
+
+        return
+      t.commit ->
+        cb null, subscribers
+
+AFFILIATION_SUBSETS =
+  owner: [ "moderator", "publisher", "member", "none" ]
+  moderator: [ "publisher", "member", "none" ]
+  publisher: [ "member", "none" ]
+  member: [ "none" ]
+
+frontends = {}
+exports.hookFrontend = (proto, hooks) ->
+  frontends[proto] = hooks


Changes for comment stats

Changes for comment stats

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/deep0892/jitendrachatbot.git/'


Fix a poorly named directive

Fix a poorly named directive

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/cdig/q-n-eh.git/'


Unneeded Comments

Unneeded Comments

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/seanhealy/lib-themisui.git/'


Add assertions and suppress deprecation warnings in theme-manager-spec

The new expected behavior is now tested. The deprecated behavior is
also tested until we remove it later.

--- spec/theme-manager-spec.coffee
+++ spec/theme-manager-spec.coffee
@@ -134,15 +134,24 @@
       expect(-> atom.packages.activatePackage('a-theme-that-will-not-be-found')).toThrow()

   describe "::requireStylesheet(path)", ->
+    beforeEach ->
+      jasmine.snapshotDeprecations()
+
+    afterEach ->
+      jasmine.restoreDeprecationsSnapshot()
+
     it "synchronously loads css at the given path and installs a style tag for it in the head", ->
+      atom.styles.onDidAddStyleElement styleElementAddedHandler = jasmine.createSpy("styleElementAddedHandler")
       themeManager.onDidChangeStylesheets stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")
       themeManager.onDidAddStylesheet stylesheetAddedHandler = jasmine.createSpy("stylesheetAddedHandler")
+
       cssPath = atom.project.resolve('css.css')
       lengthBefore = $('head style').length

       themeManager.requireStylesheet(cssPath)
       expect($('head style').length).toBe lengthBefore + 1

+      expect(styleElementAddedHandler).toHaveBeenCalled()
       expect(stylesheetAddedHandler).toHaveBeenCalled()
       expect(stylesheetsChangedHandler).toHaveBeenCalled()

@@ -152,8 +161,10 @@
       expect(element[0].sheet).toBe stylesheetAddedHandler.argsForCall[0][0]

       # doesn't append twice
+      styleElementAddedHandler.reset()
       themeManager.requireStylesheet(cssPath)
       expect($('head style').length).toBe lengthBefore + 1
+      expect(styleElementAddedHandler).not.toHaveBeenCalled()

       $('head style[id*="css.css"]').remove()

@@ -196,6 +207,7 @@
       disposable = themeManager.requireStylesheet(cssPath)
       expect($(document.body).css('font-weight')).toBe("bold")

+      atom.styles.onDidRemoveStyleElement styleElementRemovedHandler = jasmine.createSpy("styleElementRemovedHandler")
       themeManager.onDidRemoveStylesheet stylesheetRemovedHandler = jasmine.createSpy("stylesheetRemovedHandler")
       themeManager.onDidChangeStylesheets stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")

@@ -203,6 +215,7 @@

       expect($(document.body).css('font-weight')).not.toBe("bold")

+      expect(styleElementRemovedHandler).toHaveBeenCalled()
       expect(stylesheetRemovedHandler).toHaveBeenCalled()
       stylesheet = stylesheetRemovedHandler.argsForCall[0][0]
       expect(stylesheet instanceof CSSStyleSheet).toBe true
@@ -213,12 +226,17 @@
   describe "base stylesheet loading", ->
     workspaceElement = null
     beforeEach ->
+      jasmine.snapshotDeprecations()
+
       workspaceElement = atom.views.getView(atom.workspace)
       jasmine.attachToDOM(workspaceElement)
       workspaceElement.appendChild document.createElement('atom-text-editor')

       waitsForPromise ->
         themeManager.activateThemes()
+
+    beforeEach ->
+      jasmine.restoreDeprecationsSnapshot()

     it "loads the correct values from the theme's ui-variables file", ->
       themeManager.onDidReloadAll reloadHandler = jasmine.createSpy()
@@ -269,7 +287,14 @@
           expect(workspaceElement).not.toHaveClass 'theme-atom-dark-syntax'

   describe "when the user stylesheet changes", ->
+    beforeEach ->
+      jasmine.snapshotDeprecations()
+
+    afterEach ->
+      jasmine.restoreDeprecationsSnapshot()
+
     it "reloads it", ->
+      [styleElementAddedHandler, styleElementRemovedHandler] = []
       [stylesheetRemovedHandler, stylesheetAddedHandler, stylesheetsChangedHandler] = []
       userStylesheetPath = path.join(temp.mkdirSync("atom"), 'styles.less')
       fs.writeFileSync(userStylesheetPath, 'body {border-style: dotted !important;}')
@@ -279,6 +304,9 @@
         themeManager.activateThemes()

       runs ->
+        atom.styles.onDidRemoveStyleElement styleElementRemovedHandler = jasmine.createSpy("styleElementRemovedHandler")
+        atom.styles.onDidAddStyleElement styleElementAddedHandler = jasmine.createSpy("styleElementAddedHandler")
+
         themeManager.onDidChangeStylesheets stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")
         themeManager.onDidRemoveStylesheet stylesheetRemovedHandler = jasmine.createSpy("stylesheetRemovedHandler")
         themeManager.onDidAddStylesheet stylesheetAddedHandler = jasmine.createSpy("stylesheetAddedHandler")
@@ -293,14 +321,19 @@
       runs ->
         expect($(document.body).css('border-style')).toBe 'dashed'

+        expect(styleElementRemovedHandler).toHaveBeenCalled()
+        expect(styleElementRemovedHandler.argsForCall[0][0].textContent).toContain 'dotted'
         expect(stylesheetRemovedHandler).toHaveBeenCalled()
         expect(stylesheetRemovedHandler.argsForCall[0][0].cssRules[0].style.border).toBe 'dotted'

+        expect(styleElementAddedHandler).toHaveBeenCalled()
+        expect(styleElementAddedHandler.argsForCall[0][0].textContent).toContain 'dashed'
         expect(stylesheetAddedHandler).toHaveBeenCalled()
         expect(stylesheetAddedHandler.argsForCall[0][0].cssRules[0].style.border).toBe 'dashed'

         expect(stylesheetsChangedHandler).toHaveBeenCalled()

+        styleElementRemovedHandler.reset()
         stylesheetRemovedHandler.reset()
         stylesheetsChangedHandler.reset()
         fs.removeSync(userStylesheetPath)
@@ -309,6 +342,8 @@
         themeManager.loadUserStylesheet.callCount is 2

       runs ->
+        expect(styleElementRemovedHandler).toHaveBeenCalled()
+        expect(styleElementRemovedHandler.argsForCall[0][0].textContent).toContain 'dashed'
         expect(stylesheetRemovedHandler).toHaveBeenCalled()
         expect(stylesheetRemovedHandler.argsForCall[0][0].cssRules[0].style.border).toBe 'dashed'
         expect($(document.body).css('border-style')).toBe 'none'


Add one more BigInt::sub test.

Add one more BigInt::sub test.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rfw/basilisk.git/'


Call dispose instead of unsubscribe on marker

--- src/display-buffer.coffee
+++ src/display-buffer.coffee
@@ -1084,7 +1084,7 @@
     return

   destroyed: ->
-    marker.unsubscribe() for id, marker of @markers
+    marker.disposables.dispose() for id, marker of @markers
     @scopedConfigSubscriptions.dispose()
     @unsubscribe()
     @tokenizedBuffer.destroy()


a alittle switch

a alittle switch

error: pathspec 'src/asymmetric.iced' did not match any file(s) known to git

--- src/asymmetric.iced
+++ src/asymmetric.iced
@@ -0,0 +1,10 @@
+
+C = require('./const').public_key_algorithms
+RSA = require './rsa'
+
+exports.get_class = (n) ->
+  switch n
+    when C.RSA, C.RSA_ENCRYPT_ONLY, C.RSA_SIGN_ONLY then RSA
+    when ELGAMAL then throw new Error "no support yet for ElGamal"
+    when DSA then throw new Error "no support yet for DSA"
+    else throw new Error "unknown public key system: #{n}"


ganti Logger.js ke Logger.coffee

ganti Logger.js ke Logger.coffee

error: pathspec 'Server/utils/Logger.coffee' did not match any file(s) known to git

--- Server/utils/Logger.coffee
+++ Server/utils/Logger.coffee
@@ -0,0 +1,29 @@
+winston = require 'winston'
+dateformat = require 'dateformat'
+winston.emitErrs = true
+
+logger = new winston.Logger
+    transports: [
+        new winston.transports.File
+            level: 'debug'
+            filename: "./logs/#{dateformat(Date(), 'dddd, mmmm dS, yyyy')}"
+            timestamp: true
+            handleExceptions: true
+            json: true
+            maxsize: 5242880
+            maxFiles: 5
+            colorize: false
+
+        new winston.transports.Console
+            level: 'debug'
+            timestamp: true
+            handleExceptions: true
+            json: false
+            colorize: false
+    ]
+    exitOnError: false
+
+module.exports = logger
+
+module.exports.stream = write: (message, encoding) ->
+    logger.info message


@softWrapで判定したのが@isSoftWrap()に変更になったことの対応 たぶん、v0.129当たりからこうじゃないと駄目っぽい

--- lib/japanese-wrap-manager.coffee
+++ lib/japanese-wrap-manager.coffee
@@ -93,7 +93,7 @@
       displayBuffer.originalFindWrapColumn = displayBuffer.findWrapColumn

     displayBuffer.findWrapColumn = (line, softWrapColumn=@getSoftWrapColumn()) ->
-      return unless @softWrap
+      return unless @isSoftWrapped()
       return @japaneseWrapManager.findJapaneseWrapColumn(line, softWrapColumn)

   # restore Display#findWrapColumn()


always switch to phone when calling a user

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/VoiSmart/Rocket.Chat.git/'


Simplify ScreenLine.translateColumn

Simplify ScreenLine.translateColumn

--- src/app/screen-line.coffee
+++ src/app/screen-line.coffee
@@ -59,28 +59,27 @@
     { skipAtomicTokens } = options
     sourceColumn = Math.min(sourceColumn, @textLength())

-    currentSourceColumn = 0
-    currentTargetColumn = 0
     isSourceColumnBeforeLastToken = false
+    tokenStartTargetColumn = 0
+    tokenStartSourceColumn = 0
+
     for token in @tokens
-      tokenStartTargetColumn = currentTargetColumn
-      tokenStartSourceColumn = currentSourceColumn
-      tokenEndSourceColumn = currentSourceColumn + token[sourceDeltaType]
-      tokenEndTargetColumn = currentTargetColumn + token[targetDeltaType]
-      if tokenEndSourceColumn > sourceColumn
-        isSourceColumnBeforeLastToken = true
-        break
-      currentSourceColumn = tokenEndSourceColumn
-      currentTargetColumn = tokenEndTargetColumn
+      tokenEndSourceColumn = tokenStartSourceColumn + token[sourceDeltaType]
+      tokenEndTargetColumn = tokenStartTargetColumn + token[targetDeltaType]
+      break if tokenEndSourceColumn > sourceColumn
+      tokenStartTargetColumn = tokenEndTargetColumn
+      tokenStartSourceColumn = tokenEndSourceColumn

-    if isSourceColumnBeforeLastToken and token?.isAtomic
-      if skipAtomicTokens and sourceColumn > tokenStartSourceColumn
+    sourceColumnIsInsideToken = tokenStartSourceColumn < sourceColumn < tokenEndSourceColumn
+
+    if token?.isAtomic and sourceColumnIsInsideToken
+      if skipAtomicTokens
         tokenEndTargetColumn
       else
         tokenStartTargetColumn
     else
-      remainingColumns = sourceColumn - currentSourceColumn
-      currentTargetColumn + remainingColumns
+      remainingColumns = sourceColumn - tokenStartSourceColumn
+      tokenStartTargetColumn + remainingColumns

   textLength: ->
     if @fold


Load snapshots from seaweedfs only after specified timestamp

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


Update linting settings

Update linting settings

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/samestep/env.git/'


Framework built out for Shodan

Framework built out for Shodan

error: pathspec 'src/scripts/shodan.coffee' did not match any file(s) known to git

--- src/scripts/shodan.coffee
+++ src/scripts/shodan.coffee
@@ -0,0 +1,18 @@
+# Description:
+#   Search Shodan for a string
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot shodan <string> - Search Shodan for any information about string
+#
+# Author:
+#   Scott J Roberts - @sroberts
+
+module.exports = (robot) ->
+  robot.respond /shodan (.*)/i, (msg) ->
+    shodan_term = msg.match[1].toLowerCase()


Where, where the hell is Bill?

Where, where the hell is Bill?

error: pathspec 'src/scripts/whereisbill.coffee' did not match any file(s) known to git

--- src/scripts/whereisbill.coffee
+++ src/scripts/whereisbill.coffee
@@ -0,0 +1,33 @@
+# Description:
+#   None
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   where is bill? - Tell us where, where the hell Bill is.
+#
+# Author:
+#   brandonvalentine
+
+places = [
+  "Well, maybe he went to get a sideways haircut",
+  "Maybe he went to get a striped shirt",
+  "Maybe he went to get some plastic shoes",
+  "Maybe he went to get some funny sunglasses",
+  "Well, maybe he went to get an Air Force parka",
+  "Maybe he went to get a Vespa scooter",
+  "Maybe he went to get a British flag",
+  "Maybe he went to go Mod Ska dancing",
+  "Well, maybe he went to get a mohawk",
+  "And maybe he went to get some gnarly thrash boots",
+  "Maybe he went to go ride his skateboard",
+  "Maybe he went to see the Circle Jerks "
+]
+
+module.exports = (robot) ->
+  robot.hear /where.*is.*bill/i, (msg) ->
+    msg.send msg.random places


we need moar chat history

we need moar chat history

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Qbuer/groovebasin.git/'


Add app initializers which sets window.Travis

We still use Travis in some places in the app and Travis var is not set when
using ember build. The initializer added in this commit sets it to the current
app instance

error: pathspec 'app/initializers/app.coffee' did not match any file(s) known to git

--- app/initializers/app.coffee
+++ app/initializers/app.coffee
@@ -0,0 +1,10 @@
+initialize = (container, app) ->
+  if typeof window != 'undefined'
+    window.Travis = app
+
+Initializer =
+  name: 'app'
+  initialize: initialize
+
+`export {initialize}`
+`export default Initializer`


Fixed a bug with the new goal view.

Fixed a bug with the new goal view.

--- app/lib/world/GoalManager.coffee
+++ app/lib/world/GoalManager.coffee
@@ -78,8 +78,8 @@
   # main instance gets them and updates their existing goal states,
   # passes the word along
   onNewWorldCreated: (e) ->
+    @world = e.world
     @updateGoalStates(e.goalStates) if e.goalStates?
-    @world = e.world

   updateGoalStates: (newGoalStates) ->
     for goalID, goalState of newGoalStates
@@ -109,6 +109,7 @@
       goals: @goals
       overallStatus: overallStatus
       timedOut: @world.totalFrames is @world.maxTotalFrames
+    console.log 'timed out', @world.totalFrames is @world.maxTotalFrames, @world.totalFrames, @world.maxTotalFrames, @world.frames.length
     Backbone.Mediator.publish('goal-manager:new-goal-states', event)

   checkOverallStatus: (ignoreIncomplete=false) ->


"Added more names for #53"

"Added more names for #53"

This time in alphabetical order and without comma's

--- app/lib/world/names.coffee
+++ app/lib/world/names.coffee
@@ -83,6 +83,7 @@
   'Ogre Witch': [
     # Female
     'Vyrryx'
+    'Yzzrith'
   ]
   'Ogre Chieftain': [
     # Female
@@ -91,6 +92,7 @@
   ]
   'Ogre Warlock': [
     # Male
+    'Vax'
     'Vyrryx'
   ]
   'Ogre Scout M': [


Fix init error causing default values to leak to other props.

Because default values were not being unset between property inits,
default values of previous properties would leak over to the next
property being initiated.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-core.git/'


Force SETCHOICES values to strings. [FIX #21]

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/fulcrumapp/fulcrum-expressions.git/'


work in progress

work in progress

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/arturoarevalo/pulstar.git/'


bug fix to qa-reports mass-update

bug fix to qa-reports mass-update

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leonidas/qa-dashboard.git/'


add Authenticity token to form and close button fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/RobertsGroza/kakimasu.git/'


add Xcode point

add Xcode point

error: pathspec 'data/points/xcode.coffee' did not match any file(s) known to git

--- data/points/xcode.coffee
+++ data/points/xcode.coffee
@@ -0,0 +1,6 @@
+id: "xcode"
+title: "Xcode"
+function: [ "editor" ]
+desc: "Xcode是苹果公司向开发人员提供的集成开发环境，用于开发Mac OS X和iOS的应用程序。"
+reference:
+  "Xcode 4 常用快捷键": "http://unmi.cc/xcode-4-shortcuts"


Modes; enter insert mode if the selection changes.

See discussion in #1415.

--- content_scripts/mode_find.coffee
+++ content_scripts/mode_find.coffee
@@ -12,6 +12,7 @@
 class PostFindMode extends InsertModeBlocker
   constructor: (findModeAnchorNode) ->
     element = document.activeElement
+    initialSelection = window.getSelection().toString()

     super
       name: "post-find"
@@ -20,6 +21,15 @@
       singleton: PostFindMode
       exitOnBlur: element
       suppressPrintableEvents: element
+      # If the selection changes (e.g. via paste, or the arrow keys), then the user is interacting with the
+      # element, so get out of the way and activate insert mode.  This implements 5c (without the input
+      # listener) as discussed in #1415.
+      keyup: =>
+        @alwaysContinueBubbling =>
+          if window.getSelection().toString() != initialSelection
+            @exit()
+            new InsertMode
+              targetElement: element

     return @exit() unless element and findModeAnchorNode


grunt-atom-shell-installer -> grunt-electron-installer

--- build/Gruntfile.coffee
+++ build/Gruntfile.coffee
@@ -23,7 +23,7 @@
   grunt.loadNpmTasks('grunt-contrib-less')
   grunt.loadNpmTasks('grunt-shell')
   grunt.loadNpmTasks('grunt-download-atom-shell')
-  grunt.loadNpmTasks('grunt-atom-shell-installer')
+  grunt.loadNpmTasks('grunt-electron-installer')
   grunt.loadNpmTasks('grunt-peg')
   grunt.loadTasks('tasks')


allow subscribe with token

allow subscribe with token

--- lib/MeshbluWebsocketHandler.coffee
+++ lib/MeshbluWebsocketHandler.coffee
@@ -55,6 +55,8 @@
       @sendFrame 'status', status

   subscribe: (data) =>
+    return @subscribeWithToken data if data.token
+
     @authDevice @uuid, @token, (error, device) =>
       return @sendError error.message, ['subscribe', data] if error?
       @getDevice data.uuid, (error, subscribedDevice) =>
@@ -65,6 +67,11 @@

           if subscribedDevice.owner? && subscribedDevice.owner == device.uuid
             @socketIOClient.emit 'subscribe', subscribedDevice.uuid
+
+  subscribeWithToken: (data) =>
+    authDevice data.uuid, data.token, (error, authedDevice) =>
+      return @sendError error.message, ['subscribe', data] if error? || !device?
+      @socketIOClient.emit 'subscribe', authedDevice.uuid

   unsubscribe: (data) =>
     @authDevice @uuid, @token, (error, device) =>


write CoffeeScript version

write CoffeeScript version

error: pathspec 'src/react-bootstrap.coffee' did not match any file(s) known to git

--- src/react-bootstrap.coffee
+++ src/react-bootstrap.coffee
@@ -0,0 +1,299 @@
+((root, factory) ->
+  if typeof define is 'function' and define.amd
+    define ['react'], factory
+  else if typeof exports is 'object'
+    module.exports = factory require('react')
+  else
+    root.Bootstrap = factory root.React
+  return
+) this, (React) ->
+
+  'use strict'
+
+  {button, div, form, input, label, li, p} = React.DOM
+
+  ###
+  # Utility functions
+  ###
+
+  assign = (target, sources...) ->
+
+    if target is 'undefined' or target is null
+      throw new TypeError 'Cannot convert argument to object'
+
+    dest = Object target
+
+    for source in sources when typeof source isnt 'undefined' and source isnt null
+      for key, val of source
+        if source.hasOwnProperty key
+          dest[key] = val
+
+    dest
+
+  isArray = (obj) -> typeof obj is 'object' and obj.constructor is Array
+
+  isFunction = (obj) -> typeof obj is 'function'
+
+  isRegExp = (obj) -> typeof obj is 'object' and obj.constructor is RegExp
+
+  ###
+  # Helpers
+  ###
+
+  buildHelpBlock = (text) ->
+    return null unless text
+    (p {className: 'help-block'}, text)
+
+
+  class ClassName
+
+    constructor: (@words = []) ->
+
+    add: (word) ->
+      return unless word
+      @words = @words.concat word.split(' ')
+      return
+
+    has: (criteria) ->
+      exists = false
+
+      return exists unless criteria
+
+      # if the criteria is a regular expression
+      if isRegExp.test criteria
+        exist = true for w in @words where criteria.test word
+
+      # if the criteria is a string (word)
+      else exists = @words.indexOf(criteria) > -1
+
+      exists
+
+    remove: (word) ->
+      return unless word
+      @words.splice(@words.indexOf word) if @words.indexOf(word) > -1
+      return
+
+    toString: -> @words.join(' ').trim()
+
+  buildHelpBlock = (text) ->
+    return null unless text
+    (p { className: 'help-block' }, text)
+
+  Button = React.createClass
+
+    render: ->
+      props = assign {}, @props, type: button
+
+      className = new ClassName [@props.className, 'btn']
+
+      # default to `btn-default` if no style is set
+      unless className.has /btn-(danger|default|info|primary|success|warning)/
+        className.add 'btn-default'
+
+      props.className = className.toString()
+
+      (button props)
+
+  Checkbox = React.createClass
+
+    getInitialState: -> checked: @props.checked or false
+
+    render: ->
+      # NOTE: We remove `label` and `children` properties
+      #       since those are not for the root element
+      props = assign {}, @props, {children: null, label: null, type: 'checkbox'}
+
+      className = new ClassName props.className
+
+      # if inline-checkbox
+      if className.has "#{props.type}-inline"
+
+        # remove inline class from the input properties
+        className.remove "#{props.type}-inline"
+
+        (label {className: "#{props.type}-inline"}, [
+          (input props)
+          (@props.label or @props.children or '')
+        ])
+
+      # unless inline-checkbox
+      else
+
+        (div {className: props.type}, [
+          (label null, [
+            (input props)
+            (@props.label or @props.children or '')
+          ])
+        ])
+
+  Form = React.createClass
+
+    render: -> (form {id: @props.id, className: @props.className, role: 'form'}, @props.children)
+
+  Select = React.createClass
+
+    getInitialState: ->
+      collapsed: true
+      value: @props.value or undefined
+
+    render: ->
+      className = new ClassName [
+        @props.className
+        'react-ui'
+        'react-ui-select'
+      ]
+
+      className.add('react-ui-is-collapsed') if @state.collapsed
+
+      (div {className: className.toString()}, [
+        (div {onClick: @onClick}, [
+          (label null, @getLabel())
+          (span())
+          (Input {type: 'text', onKeyPress: @onKeyPress})
+        ])
+        (ul null, @renderOptions())
+      ])
+
+    ###
+    # Get's the selected option text
+    ###
+    getLabel: ->
+      return '' unless @state.value
+
+      i      = 0
+      label  = undefined
+      len    = @props.options.length
+      option = undefined
+
+      while i < len
+        option = @props.options[i]
+        if option.value is @state.value
+          label = option.label
+          break
+        i++
+      label or ''
+
+    onClick: (event) -> @setState collapsed: not @state.collapsed
+
+    onKeyPress: (event) -> event.preventDefault()
+
+    onOptionClick: (value) ->
+      @setState value: value
+      setTimeout => @props.onChange(@state.value) if @props.onChange
+
+    renderOptions: ->
+      @props.options.map (option, i) =>
+
+        className = if option.value is @state.value then 'react-ui-is-selected' else ''
+
+        onClick = =>
+          @onOptionClick option.value
+          return
+
+        (li { key: i, className: className, onClick: onClick }, option.text)
+
+
+  RadioButton = React.createClass
+
+    getInitialState: -> checked: @props.checked or false
+
+    render: ->
+      # NOTE: We remove `label` and `children` properties
+      #       since those are not for the root element
+      props = assign {}, @props, {children: null, label: null, type: 'radio'}
+
+      className = new ClassName props.className
+
+      # inline style
+      if className.has "#{props.type}-inline"
+
+        # remove inline class from the input properties
+        className.remove "#{props.type}-inline"
+
+        (label className: "#{props.type}-inline", [
+          (Input props)
+          (@props.label or @props.children or '')
+        ])
+
+      # non inline style
+      else
+
+        (div {className: props.type}, [
+          (label null, [
+            (input props)
+            (@props.label or @props.children or '')
+          ])
+          (buildHelpBlock props.help)
+        ])
+
+  Input = React.createClass
+
+    render: ->
+      props = assign {type: 'text'}, @props
+
+      # add `form-control` class for the following input types:
+      inputTypes = [
+        'text'
+        'email'
+        'password'
+      ]
+      className = new ClassName props.className
+      className.add('form-control') if inputTypes.indexOf(props.type) > -1
+
+      props.className = className.toString()
+
+      (input props)
+
+  TextInput = React.createClass
+
+    getInitialState: ->
+      id: @props.id or "text-input-#{Date.now()}"
+      value: @props.value
+
+    render: ->
+
+      props = assign {ref: 'input'}, @props
+
+      # save the reference for change event since
+      # it may be overriden in the properties
+      @_inputRef = props.ref
+
+      className = new ClassName @props.className
+      className.remove 'form-group'
+
+      if @props.validate
+        className.add (if error = @validate() then 'has-error' else 'has-success')
+
+      props.className = className.toString()
+
+      (div {className: 'form-group'}, [
+        (@renderLabel())
+        (Input props)
+        (@renderHelp())
+      ])
+
+    onChange: (event) ->
+      @setState value: @refs[@_inputRef].value
+      if isFunction @props.onChange
+        setTimeout -> @props.onChange event
+      return
+
+    renderLabel: ->
+      return null unless @props.label
+      (label {htmlFor: @state.id}, @props.label)
+
+    renderHelp: ->
+      return null unless @props.helpBlock
+      (span {className: 'help-block'}, @props.helpBlock)
+
+    validate: ->
+      @props.validate @state.value if isFunction @props.validate
+
+  Button      : Button
+  Checkbox    : Checkbox
+  Form        : Form
+  Input       : Input
+  RadioButton : RadioButton
+  Select      : Select
+  TextInput   : TextInput
+


Added beavers assemble command

Added beavers assemble command

error: pathspec 'src/scripts/beavers.coffee' did not match any file(s) known to git

--- src/scripts/beavers.coffee
+++ src/scripts/beavers.coffee
@@ -0,0 +1,17 @@
+# Description:
+#   beavers assemble - The one and only
+#
+# Commands:
+#   hubot beavers assemble - Beavers assemble image
+#
+# Author:
+#   Ryan Tomlinson
+
+beavers = [
+  "http://cdn.meme.am/instances/500x/58267772.jpg"
+]
+
+module.exports = (robot) ->
+
+  robot.respond /beavers assemble/i, (msg) ->
+    msg.send msg.random beavers


Fixed #911

Fixed #911

--- app/schemas/models/level.coffee
+++ app/schemas/models/level.coffee
@@ -130,7 +130,7 @@

   surface: c.object {title: "Surface", description: "Commands to issue to the Surface itself."},
     focus: c.object {title: "Camera", description: "Focus the camera on a specific point on the Surface.", format:'viewport'},
-      target: {anyOf: [PointSchema, thang, {type: 'null'}], title: "Target", description: "Where to center the camera view."}
+      target: {anyOf: [PointSchema, thang, {type: 'null'}], title: "Target", description: "Where to center the camera view.", default: {x:0, y:0}}
       zoom: {type: 'number', minimum: 0, exclusiveMinimum: true, maximum: 64, title: "Zoom", description: "What zoom level to use."}
       duration: {type:'number', minimum: 0, title: "Duration", description: "in ms"}
       bounds: c.array {title:'Boundary', maxItems: 2, minItems: 2, default:[{x:0,y:0}, {x:46, y:39}], format: 'bounds'}, PointSchema


Bugfix

Bugfix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ICTU/self-healer.git/'


:green_heart: Clear pending frames on folding specs

--- spec/text-editor-component-spec.coffee
+++ spec/text-editor-component-spec.coffee
@@ -824,7 +824,8 @@

         describe "when the component is destroyed", ->
           it "stops listening for folding events", ->
-            nextAnimationFrame()
+            nextAnimationFrame() unless nextAnimationFrame is noAnimationFrame # clear pending frame request if needed
+
             component.destroy()

             lineNumber = component.lineNumberNodeForScreenRow(1)


remove process error

remove process error

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NewSpring/norma-sass.git/'


Let BS handle file watching

Let BS handle file watching

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NewSpring/norma-browser-sync.git/'