Client: Tests: Remove unneeded test case

--- client/app/test/searchcontroller.test.coffee
+++ client/app/test/searchcontroller.test.coffee
@@ -113,16 +113,6 @@

   describe '::searchAccountsMongo', ->

-    it 'should call with seed argument', ->
-
-      { search } = kd.singletons
-
-      expect.spyOn search, 'searchAccountsMongo'
-
-      search.searchAccountsMongo SEED
-
-      expect(search.searchAccountsMongo).toHaveBeenCalledWith SEED
-
     it 'should filter current user from the results', (done) ->

       { search } = kd.singletons


Minor changes

Minor changes

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/clochix/cozy-calendar.git/'


Add textarea

Add textarea

error: pathspec 'client/lanes/components/shared/TextArea.cjsx' did not match any file(s) known to git

--- client/lanes/components/shared/TextArea.cjsx
+++ client/lanes/components/shared/TextArea.cjsx
@@ -0,0 +1,14 @@
+class Lanes.Components.TextArea extends Lanes.React.Component
+
+    mixins: [
+        Lanes.Components.Form.InputFieldMixin
+    ]
+
+    renderInputField: (props, handlers) ->
+        className = _.classnames(props.className, 'form-control')
+        <textarea
+            {...props}
+            {...handlers}
+            className={className}
+            onChange={@fieldMixinSetValue}
+        />


add a new coffeescript file

add a new coffeescript file

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

--- cf/local_storage.coffee
+++ cf/local_storage.coffee
@@ -0,0 +1,3 @@
+class LocalStorage
+  constructor: () ->
+


Reset ready flags when date time is cleared

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/Bogdan-p/bookingbug-angular.git/'


test (Module) Stub test cases to fill in later

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/steroids.git/'


Adds model changes

Adds model changes

--- api/apps/articles/model.coffee
+++ api/apps/articles/model.coffee
@@ -78,6 +78,7 @@
   fair_id: @objectId().allow(null)
   auction_id: @objectId().allow(null)
   vertical_id: @objectId().allow(null)
+  section_ids: @array().items(@objectId()).default([])
   biography_for_artist_id: @objectId().allow(null)
   featured: @boolean().default(false)
   exclude_google_news: @boolean().default(false)
@@ -96,6 +97,7 @@
   limit: @number().max(Number API_MAX).default(Number API_PAGE_SIZE)
   offset: @number()
   vertical_id: @objectId()
+  section_id: @objectId()
   artist_id: @objectId()
   artwork_id: @objectId()
   fair_ids: @array()
@@ -144,6 +146,7 @@
     query.show_ids = ObjectId input.show_id if input.show_id
     query.auction_id = ObjectId input.auction_id if input.auction_id
     query.vertical_id = ObjectId input.vertical_id if input.vertical_id
+    query.section_ids = ObjectId input.section_id if input.section_id
     query.biography_for_artist_id = ObjectId input.biography_for_artist_id if input.biography_for_artist_id

     query.$or = [
@@ -195,6 +198,7 @@
           author_id: ObjectId(article.author_id) if article.author_id
           fair_id: ObjectId(article.fair_id) if article.fair_id
           vertical_id: ObjectId(article.vertical_id) if article.vertical_id
+          section_ids: article.section_ids.map(ObjectId) if article.section_ids
           auction_id: ObjectId(article.auction_id) if article.auction_id
           partner_ids: article.partner_ids.map(ObjectId) if article.partner_ids
           show_ids: article.show_ids.map(ObjectId) if article.show_ids


page encoding can mismatch with url

page encoding can mismatch with url

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/prognostikos/uploadcare-widget.git/'


RPC unit tests

RPC unit tests

error: pathspec 'app/coffee/modules/packages/comm/rpc/test-unit.coffee' did not match any file(s) known to git

--- app/coffee/modules/packages/comm/rpc/test-unit.coffee
+++ app/coffee/modules/packages/comm/rpc/test-unit.coffee
@@ -0,0 +1,45 @@
+
+describe 'rpc', ->
+
+	rpc = null
+
+	beforeEach ->
+
+		inject [
+			'comm/rpc'
+			(_rpc_) -> rpc = _rpc_
+		]
+
+	it 'should send and receive data back from rpc calls', ->
+
+		inject [
+			'$rootScope', 'comm/socket'
+			($rootScope, socket) ->
+
+				socket.catchEmit 'rpc://test', (data, fn) -> fn result: 420
+
+				promise = rpc.call 'test'
+				promise.then (result) -> expect(result).toBe 420
+				promise.catch (errors) -> expect(true).toBe false
+
+				$rootScope.$apply()
+		]
+
+
+	it 'should handle errors gracefully', (done) ->
+
+		inject [
+			'$rootScope', 'comm/socket'
+			($rootScope, socket) ->
+
+				socket.catchEmit 'rpc://test', (data, fn) ->
+					fn errors: [code: 420]
+
+				promise = rpc.call 'test'
+				promise.then (result) -> expect(true).toBe false
+				promise.catch (error) -> expect(error).toBeDefined()
+
+				$rootScope.$apply()
+		]
+
+


Renamed password reset token to reset-token to avoid conflicts with the csrf token

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/alpire/picoCTF-web.git/'


Update Comment

Update Comment

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -118,9 +118,8 @@
   # ### Get Statistics for All Queues Asynchronously

   # `statistics` is an asynchronous method. The only arg of the callback
-  # function is an array containing statistics of all queues. The actual
-  # dirty work is handed to objects of class `Queue`'s `statistics`
-  # method.
+  # function is an array containing statistics of all queues. The actual dirty
+  # work is handed to objects of class `Queue`'s `statistics` method.
   #
   #     fairy.statistics (stats) ->
   #       console.log "Stats of #{stats.length} queues: ", stats


Refactor Statistics Structure, Add Total Groups

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -568,6 +568,7 @@
         finished_tasks: statistics.finished or 0
         average_pending_time: Math.round(statistics.total_pending_time * 100 / statistics.finished) / 100
         average_processing_time: Math.round(statistics.total_processing_time * 100 / statistics.finished) / 100
+        blocked: {}
       if not result.finished_tasks
         result.average_pending_time = '-'
         result.average_processing_time = '-'
@@ -583,11 +584,10 @@
       # tasks is:
       #
       # `pending = total - finished - processing - failed - blocked`
+      result.blocked.groups = multi_res[4].length
       multi2 = @redis.multi()
       multi2.llen "#{@key 'QUEUED'}:#{group}" for group in multi_res[4]
       multi2.exec (multi2_err, multi2_res) ->
-        result.blocked =
-          groups: multi_res[4].length
-          tasks: multi2_res.reduce(((a, b) -> a + b), - multi_res[4].length)
+        result.blocked.tasks = multi2_res.reduce(((a, b) -> a + b), - result.blocked.groups)
         result.pending_tasks = result.total.tasks - result.finished_tasks - result.processing_tasks - result.failed_tasks - result.blocked.tasks
         callback result


redis

redis

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

--- src/scripts/redis-brain.coffee
+++ src/scripts/redis-brain.coffee
@@ -0,0 +1,28 @@
+Url   = require "url"
+Redis = require "redis"
+
+# sets up hooks to persist the brain into redis.
+module.exports = (robot) ->
+  info   = Url.parse process.env.REDISTOGO_URL || 'redis://localhost:6379'
+  client = Redis.createClient(info.port, info.hostname)
+
+  if info.auth
+    client.auth info.auth.split(":")[1]
+
+  client.on "error", (err) ->
+    robot.logger.error err
+
+  client.on "connect", ->
+    robot.logger.debug "Successfully connected to Redis"
+
+    client.get "hubot:storage", (err, reply) ->
+      if err
+        throw err
+      else if reply
+        robot.brain.mergeData JSON.parse(reply.toString())
+
+  robot.brain.on 'save', (data) ->
+    client.set 'hubot:storage', JSON.stringify data
+
+  robot.brain.on 'close', ->
+    client.quit()


Add tests for creating a directory.

Add tests for creating a directory.

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

--- src/spec/createdir.spec.coffee
+++ src/spec/createdir.spec.coffee
@@ -0,0 +1,20 @@
+_ = require 'underscore'
+path = require 'path'
+Promise = require 'bluebird'
+CreateDir = require '../lib/createdir'
+{ExtendedLogger} = require 'sphere-node-utils'
+Config = require '../config'
+
+describe 'CreateDir', ->
+
+  beforeEach ->
+    @testPath = path.join(__dirname,'../exports')
+    @logger = new ExtendedLogger
+    @createDir = new CreateDir @logger, @testPath, false
+
+  it 'should pass the correct path', (done) ->
+    @createDir.run()
+    .then (result) =>
+      expect(@testPath)
+      done()
+    .catch (e) -> done e


Fixing the documentation

Fixing the documentation

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/'


wait with rank updates for the twitch list 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/Mikuia/Mikuia.git/'


AvatarView: Instead fallback to 404 fallback to correct default avatar image on our CDN which fixes the issue with 404's from Gravatar in Chrome console

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/'


app/buttonwithmenu: add close modal check condition

--- client/app/lib/components/buttonwithmenu/index.coffee
+++ client/app/lib/components/buttonwithmenu/index.coffee
@@ -20,12 +20,12 @@
     super props

     @state = { isMenuOpen: @props.isMenuOpen }
-
-
+
+
   componentWillReceiveProps: (nextProps) ->
-
+
     { isMenuOpen } = nextProps
-
+
     @setState { isMenuOpen }

@@ -42,6 +42,7 @@
   listDidMount: (_list) ->

     button = ReactDOM.findDOMNode @refs.button
+    return @setState isMenuOpen: no  unless button
     list = ReactDOM.findDOMNode _list
     buttonRect = button.getBoundingClientRect()


:lipstick:

:lipstick:

--- spec/app/git-spec.coffee
+++ spec/app/git-spec.coffee
@@ -36,4 +36,4 @@

     it "returns false for a non-ignored path", ->
       repo = new Git(require.resolve('fixtures/git/ignore.git'))
-      expect(repo.isIgnored('b.txt')).toBeFalsy()+      expect(repo.isIgnored('b.txt')).toBeFalsy()


Show the progress bar when importing bank statements.

--- app/assets/javascripts/rahani/views/statements/form.js.coffee
+++ app/assets/javascripts/rahani/views/statements/form.js.coffee
@@ -28,22 +28,22 @@
         data.append('file', files[0])
       data.append('account_id', @options.account.get('id'))

-      $.ajax
-        url: '/api/statements'
-        data: data
-        cache: false
-        contentType: false
-        processData: false
-        type: 'POST'
-        success: =>
-          @trigger 'save'
-          @ui.button.button('reset')
-
-        error: (resp)=>
-          if resp.status == 422
+      Pace.track =>
+        $.ajax
+          url: '/api/statements'
+          data: data
+          cache: false
+          contentType: false
+          processData: false
+          type: 'POST'
+          success: =>
+            @trigger 'save'
             @ui.button.button('reset')
-            errors = JSON.parse(resp.responseText).errors
-            @model.validationError = errors
-            @model.trigger "invalid", @model, errors, {validationError: errors}
+          error: (resp)=>
+            if resp.status == 422
+              @ui.button.button('reset')
+              errors = JSON.parse(resp.responseText).errors
+              @model.validationError = errors
+              @model.trigger "invalid", @model, errors, {validationError: errors}

       false


add gulpfile

add gulpfile

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

--- gulpfile.coffee
+++ gulpfile.coffee
@@ -0,0 +1,11 @@
+gulp = require 'gulp'
+Carte = require './lib/carte'
+path = 'public/app.js'
+
+carte = new Carte()
+
+gulp.task 'build', ->
+  carte.build watch: false, path: path
+
+gulp.task 'watch', ->
+  carte.build watch: true, path: path


[web] Fixed a slight failure with the supporter heart on featured channels


工单的数据库结构 in #7

工单的数据库结构 in #7

error: pathspec 'DOC/DB/tickets.cson' did not match any file(s) known to git

--- DOC/DB/tickets.cson
+++ DOC/DB/tickets.cson
@@ -0,0 +1,17 @@
+_id: ObjectID('525284cc2cebb6d0008b4567')
+account_id: ObjectID('525284cc2cebb6d0008b4567')
+created_at: ISODate('2013-02-22T03:03:37.312Z')
+updated_at: ISODate('2013-02-22T03:03:37.312Z')
+title: 'Ticket Title'
+content: 'Ticket Content(Markdown)'
+content_html: 'Ticket Conetnt(HTML)'
+attribute: {}
+replys: [
+  _id: ObjectID('525284cc2cebb6d0008b4567')
+  reply_to: ObjectID('525284cc2cebb6d0008b4567')
+  account_id: ObjectID('525284cc2cebb6d0008b4567')
+  created_at: ISODate('2013-02-22T03:03:37.312Z')
+  content: 'Reply Content(Markdown)'
+  content_html: 'Reply Conetnt(HTML)'
+  attribute: {}
+]


+ 发群消息接口

+ 发群消息接口

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/hohogpb/qqbot.git/'


A bit of cleanup of commented code.

A bit of cleanup of commented code.

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/usermindinc/hubot-jira-reporter.git/'


added clay davis sheit command

added clay davis sheit command

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

--- src/scripts/sheits.coffee
+++ src/scripts/sheits.coffee
@@ -0,0 +1,28 @@
+# Description:
+# When you get some bad news sometimes you got to let it out.
+#
+# Dependencies:
+# None
+#
+# Configuration:
+# None
+#
+# Commands:
+# sheeeit - Display an image or animated gif
+#
+# Author:
+# danishkhan
+#
+
+sheits = [
+  "http://www.circlenoir.com/forums/attachment.php?attachmentid=478&stc=1#.jpg",
+  "http://media.skateboard.com.au/forum/images/davis_sheeeit.jpg",
+  "http://www.gifsoup.com/webroot/animatedgifs1/2019075_o.gif",
+  "http://i417.photobucket.com/albums/pp258/reddreadrevolver/sheeeit.gif",
+  "http://behance.vo.llnwd.net/profiles3/111050/projects/252777/1110501249152745.jpg"
+]
+
+module.exports = (robot) ->
+  robot.hear /sh(e+)(i+)(t+)/, (msg) ->
+  msg.send msg.random sheits
+


i have a theory

i have a theory

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


Added tests

Added tests

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

--- test/test.coffee
+++ test/test.coffee
@@ -0,0 +1,76 @@
+assert = require 'assert'
+Queue = require '../lib/queue'
+
+describe 'Queue', ->
+
+	describe '#constructor', ->
+		it 'should result in an empty queue', ->
+			q = new Queue
+			assert.equal q.length(), 0
+			assert.strictEqual q.peek(), undefined
+
+	describe '#enqueue', ->
+		it 'should add an item to the end of the queue', ->
+			q = new Queue
+			q.enqueue 'hello'
+			assert.equal q.length(), 1
+			assert.equal q.peek(), 'hello'
+			q.enqueue 'there'
+			assert.equal q.length(), 2
+			assert.equal q.peek(), 'hello'
+			q.dequeue()
+			assert.equal q.peek(), 'there'
+
+	describe '#dequeue', ->
+		it 'should return the first item from the queue', ->
+			q = new Queue
+			q.enqueue 'hello'
+			q.enqueue 'there'
+			assert.equal q.peek(), q.dequeue()
+
+		it 'should remove the first item from the queue', ->
+			q = new Queue
+			q.enqueue 'hello'
+			q.enqueue 'there'
+			assert.equal q.length(), 2 # Sanity check
+			q.dequeue()
+			assert.equal q.length(), 1
+			assert.equal q.peek(), 'there'
+
+		it 'should return undefined if the queue is empty', ->
+			q = new Queue
+			assert.strictEqual q.dequeue(), undefined
+
+	describe '#peek', ->
+		it 'should return the first item in the queue', ->
+			q = new Queue
+			q.enqueue 'hello'
+			q.enqueue 'there'
+			assert.equal q.peek(), 'hello'
+			q.dequeue()
+			assert.equal q.peek(), 'there'
+
+		it 'should not alter the queue', ->
+			q = new Queue
+			q.enqueue 'hello'
+			q.enqueue 'there'
+			assert.equal q.length(), 2 # Sanity check
+			assert.equal q.peek(), q.peek()
+			assert.equal q.length(), 2
+
+		it 'should return undefined if the queue is empty', ->
+			q = new Queue
+			assert.strictEqual q.dequeue(), undefined
+
+	describe '#length', ->
+		it 'should return the number of items in the queue', ->
+			q = new Queue
+			assert.equal q.length(), 0
+			q.enqueue 'hello'
+			assert.equal q.length(), 1
+			q.enqueue 'there'
+			assert.equal q.length(), 2
+			q.dequeue()
+			assert.equal q.length(), 1
+			q.dequeue()
+			assert.equal q.length(), 0


fix the if/elsiness of the maps, and add the location marker

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/'


Updated colour for the maps

Updated colour for the maps


....probably should chain that emit.

....probably should chain that emit.

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/damianb/crimson.git/'


Added boardData

Added boardData

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

--- client/coffee/boardData.coffee
+++ client/coffee/boardData.coffee
@@ -0,0 +1,66 @@
+[
+    # Box 0
+    {}
+
+  , # Box 1
+    success_function: "jumpTo"
+    success_function_args: 3
+    fail_function: "waitTurn"
+    fail_function_args: 1
+
+  , # Box 2
+    {}
+
+  , # Box 3
+    fail_function: "jumpTo"
+    fail_function_args: 0
+
+  , # Box 4
+    fail_function: "waitTurns"
+    fail_function_args: 2
+
+  , # Box 5
+    success_function: "jumpTo"
+    success_function_args: 7
+    fail_function: "jumpTo"
+    fail_function_args: 3
+
+  , # Box 6
+    fail_function: "waitTurns"
+    fail_function_args: 1
+
+  , # Box 7
+    fail_function: "jumpTo"
+    fail_function_args: 6
+
+  , # Box 8
+    fail_function: "waitTurns"
+    fail_function_args: 1
+
+  , # Box 9
+    success_function: "jumpTo"
+    success_function_args: 11
+
+  , # Box 10
+    fail_function: "jumpTo"
+    fail_function_args: 8
+
+  , # Box 11
+    fail_function: "jumpTo"
+    fail_function_args: 8
+
+  , # Box 12
+    fail_function: "jumpTo"
+    fail_function_args: 11
+
+  , # Box 13
+    fail_function: "waitTurns"
+    fail_function_args: 3
+
+  , # Box 14
+    fail_function: "jumpTo"
+    fail_function_args: 0
+
+  , # Box 15
+    {}
+]


Initial spec

Initial spec

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

--- spec/genx_spec.coffee
+++ spec/genx_spec.coffee
@@ -0,0 +1,14 @@
+genx = require '../build/default/genx'
+
+describe 'genx', ->
+
+  describe 'Writer', ->
+    w = null
+
+    beforeEach ->
+      w = new genx.Writer()
+
+    describe 'declareElement', ->
+      it 'raises an exception if there is the wrong number of arguments', ->
+        expect(-> w.declareElement()).toThrow('Wrong number of arguments to declareElement')
+        expect(-> w.declareElement(true, true, true)).toThrow('Wrong number of arguments to declareElement')


something

something

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/stormpack-core/stormpack-client-js.git/'


:wrench: Update atom language-make snippets

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/ooJerryLeeoo/dotfiles.git/'


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/'


Add some tests for the field types that aren't compatible with SETVALUE()

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/'


Added tests for getActiveFiles() and getFilesWithStatus()

--- test/test.coffee
+++ test/test.coffee
@@ -930,6 +930,65 @@
         ), 10

+    describe "getActiveFiles()", ->
+      it "should return all files with the status Dropzone.UPLOADING or Dropzone.QUEUED", (done) ->
+        mock1 = getMockFile()
+        mock2 = getMockFile()
+        mock3 = getMockFile()
+        mock4 = getMockFile()
+
+        dropzone.options.accept = (file, _done) -> file.done = _done
+        dropzone.uploadFile = ->
+        dropzone.options.parallelUploads = 2
+
+        dropzone.addFile mock1
+        dropzone.addFile mock2
+        dropzone.addFile mock3
+        dropzone.addFile mock4
+
+        dropzone.getActiveFiles().should.eql [ ]
+
+        mock1.done()
+        mock3.done()
+        mock4.done()
+
+        setTimeout (->
+          dropzone.getActiveFiles().should.eql [ mock1, mock3, mock4 ]
+          mock1.status.should.equal Dropzone.UPLOADING
+          mock3.status.should.equal Dropzone.UPLOADING
+          mock2.status.should.equal Dropzone.ADDED
+          mock4.status.should.equal Dropzone.QUEUED
+          done()
+        ), 10
+
+
+    describe "getFilesWithStatus()", ->
+      it "should return all files with provided status", ->
+        mock1 = getMockFile()
+        mock2 = getMockFile()
+        mock3 = getMockFile()
+        mock4 = getMockFile()
+
+        dropzone.options.accept = (file, _done) -> file.done = _done
+        dropzone.uploadFile = ->
+
+        dropzone.addFile mock1
+        dropzone.addFile mock2
+        dropzone.addFile mock3
+        dropzone.addFile mock4
+
+        dropzone.getFilesWithStatus(Dropzone.ADDED).should.eql [ mock1, mock2, mock3, mock4 ]
+
+        mock1.status = Dropzone.UPLOADING
+        mock3.status = Dropzone.QUEUED
+        mock4.status = Dropzone.QUEUED
+
+        dropzone.getFilesWithStatus(Dropzone.ADDED).should.eql [ mock2 ]
+        dropzone.getFilesWithStatus(Dropzone.UPLOADING).should.eql [ mock1 ]
+        dropzone.getFilesWithStatus(Dropzone.QUEUED).should.eql [ mock3, mock4 ]
+
+
+

   describe "file handling", ->
     mockFile = null


flexible fsm json url

flexible fsm json url

--- httpdd.fsm.html.coffee
+++ httpdd.fsm.html.coffee
@@ -1,3 +1,5 @@
+jsonFsmUrl = window.location.search.substr 1
+jsonFsmUrl = if jsonFsmUrl.length then jsonFsmUrl else 'httpdd.fsm.json'
 $.ajaxSetup cache: false

 stmts = []
@@ -348,7 +350,7 @@

 # RUN

-$.getJSON 'httpdd.fsm.json', (httpdd) ->
+$.getJSON jsonFsmUrl, (httpdd) ->
   stmts = httpdd.statements

   for stmt in stmts


remove dead code

remove dead code

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/clochix/cozy-emails.git/'


IconButton component

IconButton component

error: pathspec 'client/lanes/components/shared/IconButton.cjsx' did not match any file(s) known to git

--- client/lanes/components/shared/IconButton.cjsx
+++ client/lanes/components/shared/IconButton.cjsx
@@ -0,0 +1,9 @@
+class Lanes.Components.IconButton extends Lanes.React.BaseComponent
+
+    render: ->
+        buttonProps = _.omit(@props, 'icon', 'iconProps')
+        buttonProps.className = _.classnames(buttonProps.className, 'flush')
+        console.log buttonProps, @props
+        <BS.Button {...buttonProps}>
+            <LC.Icon type={@props.icon} lg {...@props.iconProps} />
+        </BS.Button>


Easy switch to mongo db in tests

Easy switch to mongo db in tests

--- test/test-database.coffee
+++ test/test-database.coffee
@@ -1,10 +1,17 @@
-Datastore = require 'nedb'

 class TestDatabase
   @open: (callback=->) =>
-    datastore = new Datastore
-      inMemoryOnly: true
-      autoload: true
-      onload: => callback null, {devices: datastore}
+    if process.env.USE_MONGO
+      mongojs = require 'mongojs'
+      db = mongojs 'meshblu-test', ['devices']
+      db.devices.remove (error) =>
+        callback error, db
+    else
+      Datastore = require 'nedb'
+      datastore = new Datastore
+        inMemoryOnly: true
+        autoload: true
+        onload: => callback null, {devices: datastore}
+

 module.exports = TestDatabase


fix broken test.

fix broken 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/robey/carrot16.git/'


Make generated validation methods return boolean value.

All generated validation methods (e.g. _ok(), _error(), etc.) return
a boolean value to indicate the success/failure of the validation. All
methods return `true` except for the "error" state method which returns
`false`.

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/'


Removed extra constructor. Changed tabs to 2spaces

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 emoji-me script

add emoji-me script

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

--- src/scripts/emoji-me.coffee
+++ src/scripts/emoji-me.coffee
@@ -0,0 +1,83 @@
+# Description:
+#   Hubot picks random emojis.
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot emoji me - Returns a random emoji
+#   hubot emoji spin me - Spin the emoji slots
+#   hubot emoji card me - Returns a random card against humanity with emoji
+#
+# Author:
+#   sandbochs
+
+emoji = "bowtie,smile,laughing,blush,smiley,relaxed,smirk,heart_eyes,kissing_heart,kissing_closed_eyes,flushed,relieved,satisfied,grin,wink,stuck_out_tongue_winking_eye,stuck_out_tongue_closed_eyes,grinning,kissing,kissing_smiling_eyes,stuck_out_tongue,sleeping,worried,frowning,anguished,open_mouth,grimacing,confused,hushed,expressionless,unamused,sweat_smile,sweat,disappointed_relieved,weary,pensive,disappointed,confounded,fearful,cold_sweat,persevere,cry,sob,joy,astonished,scream,neckbeard,tired_face,angry,rage,triumph,sleepy,yum,mask,sunglasses,dizzy_face,imp,smiling_imp,neutral_face,no_mouth,innocent,alien,yellow_heart,blue_heart,purple_heart,heart,green_heart,broken_heart,heartbeat,heartpulse,two_hearts,revolving_hearts,cupid,sparkling_heart,sparkles,star,star2,dizzy,boom,collision,anger,exclamation,question,grey_exclamation,grey_question,zzz,dash,sweat_drops,notes,musical_note,fire,hankey,poop,shit,+1,thumbsup,-1,thumbsdown,ok_hand,punch,facepunch,fist,v,wave,hand,open_hands,point_up,point_down,point_left,point_right,raised_hands,pray,point_up_2,clap,muscle,metal,fu,walking,runner,running,couple,family,two_men_holding_hands,two_women_holding_hands,dancer,dancers,ok_woman,no_good,information_desk_person,raised_hand,bride_with_veil,person_with_pouting_face,person_frowning,bow,couplekiss,couple_with_heart,massage,haircut,nail_care,boy,girl,woman,man,baby,older_woman,older_man,person_with_blond_hair,man_with_gua_pi_mao,man_with_turban,construction_worker,cop,angel,princess,smiley_cat,smile_cat,heart_eyes_cat,kissing_cat,smirk_cat,scream_cat,crying_cat_face,joy_cat,pouting_cat,japanese_ogre,japanese_goblin,see_no_evil,hear_no_evil,speak_no_evil,guardsman,skull,feet,lips,kiss,droplet,ear,eyes,nose,tongue,love_letter,bust_in_silhouette,busts_in_silhouette,speech_balloon,thought_balloon,feelsgood,finnadie,goberserk,godmode,hurtrealbad,rage1,rage2,rage3,rage4,suspect,trollface,sunny,umbrella,cloud,snowflake,snowman,zap,cyclone,foggy,ocean,cat,dog,mouse,hamster,rabbit,wolf,frog,tiger,koala,bear,pig,pig_nose,cow,boar,monkey_face,monkey,horse,racehorse,camel,sheep,elephant,panda_face,snake,bird,baby_chick,hatched_chick,hatching_chick,chicken,penguin,turtle,bug,honeybee,ant,beetle,snail,octopus,tropical_fish,fish,whale,whale2,dolphin,cow2,ram,rat,water_buffalo,tiger2,rabbit2,dragon,goat,rooster,dog2,pig2,mouse2,ox,dragon_face,blowfish,crocodile,dromedary_camel,leopard,cat2,poodle,paw_prints,bouquet,cherry_blossom,tulip,four_leaf_clover,rose,sunflower,hibiscus,maple_leaf,leaves,fallen_leaf,herb,mushroom,cactus,palm_tree,evergreen_tree,deciduous_tree,chestnut,seedling,blossom,ear_of_rice,shell,globe_with_meridians,sun_with_face,full_moon_with_face,new_moon_with_face,new_moon,waxing_crescent_moon,first_quarter_moon,waxing_gibbous_moon,full_moon,waning_gibbous_moon,last_quarter_moon,waning_crescent_moon,last_quarter_moon_with_face,first_quarter_moon_with_face,moon,earth_africa,earth_americas,earth_asia,volcano,milky_way,partly_sunny,octocat,squirrel,bamboo,gift_heart,dolls,school_satchel,mortar_board,flags,fireworks,sparkler,wind_chime,rice_scene,jack_o_lantern,ghost,santa,christmas_tree,gift,bell,no_bell,tanabata_tree,tada,confetti_ball,balloon,crystal_ball,cd,dvd,floppy_disk,camera,video_camera,movie_camera,computer,tv,iphone,phone,telephone,telephone_receiver,pager,fax,minidisc,vhs,sound,speaker,mute,loudspeaker,mega,hourglass,hourglass_flowing_sand,alarm_clock,watch,radio,satellite,loop,mag,mag_right,unlock,lock,lock_with_ink_pen,closed_lock_with_key,key,bulb,flashlight,high_brightness,low_brightness,electric_plug,battery,calling,email,mailbox,postbox,bath,bathtub,shower,toilet,wrench,nut_and_bolt,hammer,seat,moneybag,yen,dollar,pound,euro,credit_card,money_with_wings,e-mail,inbox_tray,outbox_tray,envelope,incoming_envelope,postal_horn,mailbox_closed,mailbox_with_mail,mailbox_with_no_mail,door,smoking,bomb,gun,hocho,pill,syringe,page_facing_up,page_with_curl,bookmark_tabs,bar_chart,chart_with_upwards_trend,chart_with_downwards_trend,scroll,clipboard,calendar,date,card_index,file_folder,open_file_folder,scissors,pushpin,paperclip,black_nib,pencil2,straight_ruler,triangular_ruler,closed_book,green_book,blue_book,orange_book,notebook,notebook_with_decorative_cover,ledger,books,bookmark,name_badge,microscope,telescope,newspaper,football,basketball,soccer,baseball,tennis,8ball,rugby_football,bowling,golf,mountain_bicyclist,bicyclist,horse_racing,snowboarder,swimmer,surfer,ski,spades,hearts,clubs,diamonds,gem,ring,trophy,musical_score,musical_keyboard,violin,space_invader,video_game,black_joker,flower_playing_cards,game_die,dart,mahjong,clapper,memo,pencil,book,art,microphone,headphones,trumpet,saxophone,guitar,shoe,sandal,high_heel,lipstick,boot,shirt,tshirt,necktie,womans_clothes,dress,running_shirt_with_sash,jeans,kimono,bikini,ribbon,tophat,crown,womans_hat,mans_shoe,closed_umbrella,briefcase,handbag,pouch,purse,eyeglasses,fishing_pole_and_fish,coffee,tea,sake,baby_bottle,beer,beers,cocktail,tropical_drink,wine_glass,fork_and_knife,pizza,hamburger,fries,poultry_leg,meat_on_bone,spaghetti,curry,fried_shrimp,bento,sushi,fish_cake,rice_ball,rice_cracker,rice,ramen,stew,oden,dango,egg,bread,doughnut,custard,icecream,ice_cream,shaved_ice,birthday,cake,cookie,chocolate_bar,candy,lollipop,honey_pot,apple,green_apple,tangerine,lemon,cherries,grapes,watermelon,strawberry,peach,melon,banana,pear,pineapple,sweet_potato,eggplant,tomato,corn,house,house_with_garden,school,office,post_office,hospital,bank,convenience_store,love_hotel,hotel,wedding,church,department_store,european_post_office,city_sunrise,city_sunset,japanese_castle,european_castle,tent,factory,tokyo_tower,japan,mount_fuji,sunrise_over_mountains,sunrise,stars,statue_of_liberty,bridge_at_night,carousel_horse,rainbow,ferris_wheel,fountain,roller_coaster,ship,speedboat,boat,sailboat,rowboat,anchor,rocket,airplane,helicopter,steam_locomotive,tram,mountain_railway,bike,aerial_tramway,suspension_railway,mountain_cableway,tractor,blue_car,oncoming_automobile,car,red_car,taxi,oncoming_taxi,articulated_lorry,bus,oncoming_bus,rotating_light,police_car,oncoming_police_car,fire_engine,ambulance,minibus,truck,train,station,train2,bullettrain_front,bullettrain_side,light_rail,monorail,railway_car,trolleybus,ticket,fuelpump,vertical_traffic_light,traffic_light,warning,construction,beginner,atm,slot_machine,busstop,barber,hotsprings,checkered_flag,crossed_flags,izakaya_lantern,moyai,circus_tent,performing_arts,round_pushpin,triangular_flag_on_post,jp,kr,cn,us,fr,es,it,ru,gb,uk,de".split(',')
+lose_responses = ['You lose!']
+win_responses = ['You win!']
+black_cards = "TSA guidelines now prohibit __________ on airplanes.<>It's a pity that kids these days are all getting involved with __________.<>In 1,000 years, when paper money is but a distant memory, __________ will be our currency.<>Major League Baseball has banned __________ for giving players an unfair advantage.<>What is Batman's guilty pleasure?<>Next from J.K. Rowling: Harry Potter and the Chamber of __________.<>I'm sorry, Professor, but I couldn't complete my homework because of __________.<>What did I bring back from Mexico?<>__________? There's an app for that.<>Betcha can't have just one!<>What's my anti-drug?<>While the United States raced the Soviet Union to the moon, the Mexican government funneled millions of pesos into research on __________.<>In the new Disney Channel Original Movie, Hannah Montana struggles with __________ for the first time.<>What's my secret power?<>What's the new fad diet?<>What did Vin Diesel eat for dinner?<>When Pharaoh remained unmoved, Moses called down a Plague of __________.<>How am I maintaining my relationship status?<>What's the crustiest?<>When I'm in prison, I'll have __________ smuggled in.<>After Hurricane Katrina, Sean Penn brought __________ to the people of New Orleans.<>Instead of coal, Santa now gives the bad children __________.<>Life was difficult for cavemen before __________.<>What's Teach for America using to inspire inner city students to succeed?<>Who stole the cookies from the cookie jar?<>In Michael Jackson's final moments, he thought about __________.<>White people like __________.<>Why do I hurt all over?<>A romantic candlelit dinner would be incomplete without __________.<>What will I bring back in time to convince people that I am a powerful wizard?<>BILLY MAYS HERE FOR __________.<>The class field trip was completely ruined by __________.<>What's a girl's best friend?<>I wish I hadn't lost the instruction manual for __________.<>When I am President of the United States, I will create the Department of __________.<>What are my parents hiding from me?<>What never fails to liven up the party?<>What gets better with age?<>__________: good to the last drop.<>I got 99 problems but __________ ain't one.<>It's a trap!<>MTV's new reality show features eight washed-up celebrities living with __________.<>What would grandma find disturbing, yet oddly charming?<>What's the most emo?<>During sex, I like to think about __________.<>What ended my last relationship?<>What's that sound?<>__________. That's how I want to die.<>Why am I sticky?<>What's the next Happy MealÂ® toy?<>What's there a ton of in heaven?<>I do not know with what weapons World War III will be fought, but World War IV will be fought with __________.<>What will always get you laid?<>__________: kid tested, mother approved.<>Why can't I sleep at night?<>What's that smell?<>What helps Obama unwind?<>This is the way the world ends \ This is the way the world ends \ Not with a bang but with __________.<>Coming to Broadway this season, __________: The Musical.<>Anthropologists have recently discovered a primitive tribe that worships __________.<>But before I kill you, Mr. Bond, I must show you __________.<>Studies show that lab rats navigate mazes 50% faster after being exposed to __________.<>Due to a PR fiasco, Walmart no longer offers __________.<>When I am a billionaire, I shall erect a 50-foot statue to commemorate __________.<>In an attempt to reach a wider audience, the Smithsonian Museum of Natural History has opened an interactive exhibit on __________.<>War! What is it good for?<>What gives me uncontrollable gas?<>What do old people smell like?<>Sorry everyone, I just __________.<>Alternative medicine is now embracing the curative powers of __________.<>The U.S. has begun airdropping __________ to the children of Afghanistan.<>What does Dick Cheney prefer?<>During Picasso's often-overlooked Brown Period, he produced hundreds of paintings of __________.<>What don't you want to find in your Chinese food?<>I drink to forget __________.<>TSA guidelines now prohibit __________ on airplanes.<>It's a pity that kids these days are all getting involved with __________.<>In 1,000 years, when paper money is but a distant memory, __________ will be our currency.<>Major League Baseball has banned __________ for giving players an unfair advantage.<>What is Batman's guilty pleasure?<>Next from J.K. Rowling: Harry Potter and the Chamber of __________.<>I'm sorry, Professor, but I couldn't complete my homework because of __________.<>What did I bring back from Mexico?<>__________? There's an app for that.<>__________. Betcha can't have just one!<>What's my anti-drug?<>While the United States raced the Soviet Union to the moon, the Mexican government funneled millions of pesos into research on __________.<>In the new Disney Channel Original Movie, Hannah Montana struggles with __________ for the first time. <>What's my secret power?<>What's the new fad diet?<>What did Vin Diesel eat for dinner?<>When Pharaoh remained unmoved, Moses called down a Plague of __________.<>How am I maintaining my relationship status?<>What's the crustiest?<>In L.A. County Jail, word is you can trade 200 cigarettes for __________.<>After the earthquake, Sean Penn brought __________ to the people of Haiti.<>Instead of coal, Santa now gives the bad children __________.<>Life for American Indians was forever changed when the White Man introduced them to __________.<>What's Teach for America using to inspire inner city students to succeed?<>Maybe she's born with it. Maybe it's __________.<>In Michael Jackson's final moments, he thought about __________.<>White people like __________.<>Why do I hurt all over?<>A romantic, candlelit dinner would be incomplete without __________.<>What will I bring back in time to convince people that I am a powerful wizard?<>BILLY MAYS HERE FOR __________.<>The class field trip was completely ruined by __________.<>What's a girl's best friend?<>Dear Abby, I'm having some trouble with __________ and would like your advice.<>When I am President of the United States, I will create the Department of __________.<>What are my parents hiding from me?<>What never fails to liven up the party?<>What gets better with age?<>__________: Good to the last drop.<>I got 99 problems but __________ ain't one.<>__________. It's a trap!<>MTV's new reality show features eight washed-up celebrities living with __________.<>What would grandma find disturbing, yet oddly charming?<>What's the most emo?<>During sex, I like to think about __________.<>What ended my last relationship?<>What's that sound?<>__________. That's how I want to die.<>Why am I sticky?<>What's the next Happy Meal toy?<>What's there a ton of in heaven?<>I do not know with what weapons World War III will be fought, but World War IV will be fought with __________.<>What will always get you laid?<>__________: Kid-tested, mother-approved.<>Why can't I sleep at night?<>What's that smell?<>What helps Obama unwind?<>This is the way the world ends / This is the way the world ends / Not with a bang but with __________.<>Coming to Broadway this season, __________: The Musical.<>Anthropologists have recently discovered a primitive tribe that worships __________.<>But before I kill you, Mr. Bond, I must show you __________.<>Studies show that lab rats navigate mazes 50% faster after being exposed to __________.<>Next on ESPN2: The World Series of __________.<>When I am a billionaire, I shall erect a 50-foot statue to commemorate __________.<>In an attempt to reach a wider audience, the Smithsonian Museum of Natural History has opened an interactive exhibit on __________.<>War! What is it good for?<>What gives me uncontrollable gas?<>What do old people smell like?<>What am I giving up for Lent?<>Alternative medicine is now embracing the curative powers of __________.<>What did the US airdrop to the children of Afghanistan?<>What does Dick Cheney prefer?<>During Picasso's often-overlooked Brown Period, he produced hundreds of paintings of __________.<>What don't you want to find in your Chinese food?<>I drink to forget __________.<>__________. High five, bro.<>He who controls __________ controls the world.<>The CIA now interrogates enemy agents by repeatedly subjecting them to __________.<>In Rome, there are whisperings that the Vatican has a secret room devoted to __________.<>Science will never explain the origin of __________.<>When all else fails, I can always masturbate to __________.<>I learned the hard way that you can't cheer up a grieving friend with __________.<>In its new tourism campaign, Detroit proudly proclaims that it has finally eliminated __________.<>The socialist governments of Scandinavia have declared that access to __________ is a basic human right.<>In his new self-produced album, Kanye West raps over the sounds of __________.<>What's the gift that keeps on giving?<>This season on Man vs. Wild, Bear Grylls must survive in the depths of the Amazon with only __________ and his wits. <>When I pooped, what came out of my butt?<>In the distant future, historians will agree that __________ marked the beginning of America's decline.<>What has been making life difficult at the nudist colony?<>And I would have gotten away with it, too, if it hadn't been for __________.<>What brought the orgy to a grinding halt?<>That's right, I killed __________. How, you ask? __________.<>And the Academy Award for __________ goes to __________.<>For my next trick, I will pull __________ out of __________.<>In his new summer comedy, Rob Schneider is __________ trapped in the body of __________.<>When I was tripping on acid, __________ turned into __________.<>__________ is a slippery slope that leads to __________.<>In a world ravaged by __________, our only solace is __________.<>In M. Night Shyamalan's new movie, Bruce Willis discovers that __________ had really been __________ all along.<>I never truly understood __________ until I encountered __________.<>Rumor has it that Vladimir Putin's favorite dish is __________ stuffed with __________.<>LifetimeÂ® presents __________, the story of __________.<>What's the next superhero/sidekick duo?".split('<>')
+
+module.exports = (robot) ->
+  robot.respond /emoji( me)?$/i, (message) ->
+    message.send random_emoji()
+  robot.respond /emoji spin( me)?/i, (message) ->
+    message.send spin_emoji()
+  robot.respond /emoji card( me)?/i, (message) ->
+    message.send card_emoji()
+
+random_emoji = (num = 1) ->
+  return ":#{emoji[random_index(emoji)]}:" if num == 1
+
+  emojis = []
+
+  while emojis.length < num
+    r_emoji = emoji[random_index(emoji)]
+    emojis.push(":#{r_emoji}:") unless includes(emojis, r_emoji)
+
+  emojis
+
+spin_emoji = ->
+  pool = random_emoji 4
+  spin = []
+  counts = [0, 0, 0, 0]
+  win = false
+
+  while spin.length < 3
+    index = random_index(pool)
+    spin.push pool[index]
+    counts[index] += 1
+
+  for count in counts
+    win = true if count == 3
+
+  if win == true
+    response = win_responses[random_index(win_responses)]
+  else
+    response = lose_responses[random_index(lose_responses)]
+
+  "#{spin.join(' |')} : #{response}"
+
+card_emoji = ->
+  replaced = false
+  card = black_cards[random_index(black_cards)].split(' ')
+
+  for word in card
+    if word.match(/_{10}/)
+      card[_i] = random_emoji()
+      replaced = true
+
+  card.push " #{random_emoji()}" if replaced == false
+  card.join " "
+
+
+random_index = (array) ->
+  Math.floor(Math.random() * array.length)
+
+includes = (array, element) ->
+  for el in array
+    return true if el == element
+
+  false


Use getter in user svc on fetch

Use getter in user svc on fetch

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/xaun/transac.git/'


add is_my_account filter

add is_my_account filter

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

--- app/js/filters/is_my_account.coffee
+++ app/js/filters/is_my_account.coffee
@@ -0,0 +1,4 @@
+angular.module("app").filter "is_my_account", ()->
+    (account) ->
+        console.log(account.is_my_account)
+        account.is_my_account


debug times

debug times

--- chrome/content/zotero-better-bibtex/cache.coffee
+++ chrome/content/zotero-better-bibtex/cache.coffee
@@ -261,7 +261,7 @@

       if m = /^library(:([0-9]+))?$/.exec(ae.collection)
         items = Zotero.Items.get(false, m[2])
-        if items.length == 0
+        if !items || items.length == 0
           skip.done.push(ae.id)
           continue
       else


Assigned delegate to var for readability

Via Sinan

--- client/app/lib/providers/snapshotlistitem.coffee
+++ client/app/lib/providers/snapshotlistitem.coffee
@@ -139,8 +139,9 @@

     kloud.deleteSnapshot {machineId, snapshotId}
       .then =>
-        @getDelegate().emit 'DeleteSnapshot', this
-        @getDelegate().removeItem this
+        listView = @getDelegate()
+        listView.emit 'DeleteSnapshot', this
+        listView.removeItem this
       .catch (err) -> kd.warn err

@@ -167,7 +168,8 @@
       return kd.warn err  if err
       @toggleEditable()
       @setLabel label
-      @getDelegate().emit 'RenameSnapshot', this, label
+      listView = @getDelegate()
+      listView.emit 'RenameSnapshot', this, label

     # If data is a jsnapshot, we don't need to fetch it
     if data instanceof JSnapshot


client: remove invitationWithNoEmail util

Signed-off-by: Umut Sirin <4055abbc0e40a1254e715b952ccd414607e0b365@gmail.com>

--- client/app/lib/util/invitationWithNoEmail.coffee
+++ client/app/lib/util/invitationWithNoEmail.coffee
@@ -1,31 +0,0 @@
-remote  = require 'app/remote'
-
-module.exports = (data, currentGroup, callback) ->
-
-  id = data.getId()
-  { profile : { email, firstName, lastName } } = data
-  invitations = [ { email, firstName, lastName, role : 'member' } ]
-
-  remote.api.JInvitation.create
-    invitations : invitations
-    noEmail     : yes
-    returnCodes : yes
-  , (err, res) ->
-
-    return callback err  if err
-    return callback { message: 'Something went wrong, please try again!' }  unless res
-
-    invite = res[0]
-    invite.status = 'accepted'
-    invite.accept().then (response) ->
-
-      options =
-        id: id
-        removeUserFromTeam: no
-
-      currentGroup.unblockMember id, (err) ->
-
-        return callback err  if err
-        callback null, response
-
-    .catch (err) -> callback err


FileFinder: Better method renaming.

FileFinder: Better method renaming.

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/'


Add path

Add path

--- lib/save-dialog.coffee
+++ lib/save-dialog.coffee
@@ -1,5 +1,6 @@
 Dialog = require './dialog'
 Project = require './project'
+path = require 'path'

 module.exports =
 class SaveDialog extends Dialog


Fix lint error.

Fix lint 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/RobotSnacks/stout-server.git/'


Tweak CKEditor look&feel

Tweak CKEditor look&feel

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

--- app/assets/javascripts/ckeditor/config.js.coffee
+++ app/assets/javascripts/ckeditor/config.js.coffee
@@ -0,0 +1,20 @@
+
+CKEDITOR.editorConfig = (config) ->
+  config.language = 'en'
+#  config.width = '725'
+  config.height = '450'
+  config.toolbar_Pure = [
+    { name: 'document',    items: [ 'Source','-','Save','Preview','-','Templates' ] },
+    { name: 'clipboard',   items: [ 'Undo','Redo' ] },
+    { name: 'editing',     items: [ 'Find','Replace','-','SpellChecker', 'Scayt' ] },
+    { name: 'tools',       items: [ 'Maximize', 'ShowBlocks' ] }
+    '/',
+    { name: 'basicstyles', items: [ 'Bold','Italic','Underline','Strike','Subscript','Superscript','-','RemoveFormat' ] },
+    { name: 'paragraph',   items: [ 'NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','-','JustifyLeft','JustifyCenter','JustifyBlock' ] },
+    { name: 'insert',      items: [ 'Link','Unlink','Anchor', 'Image','Table','HorizontalRule','SpecialChar' ] },
+    '/',
+    { name: 'styles',      items: [ 'Styles','Format','Font','FontSize' ] },
+    { name: 'colors',      items: [ 'TextColor','BGColor' ] },
+  ]
+  config.toolbar = 'Pure'
+  true


replace hyphens to commas when converting date

--- app/assets/javascripts/due_date_select.js.coffee
+++ app/assets/javascripts/due_date_select.js.coffee
@@ -26,8 +26,7 @@
       addDueDate = ->
         # Create the post date
         value = $("input[name='#{fieldName}']").val()
-        valueSplit = value.split '-'
-        date = new Date(valueSplit[0], parseInt(valueSplit[1]) - 1, valueSplit[2])
+        date = new Date value.replace(new RegExp('-', 'g'), ',')
         mediumDate = $.datepicker.formatDate 'M d, yy', date

         data = {}


typeahead fix

typeahead 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/treasures-io/main.git/'


Fix file uploads to work after error

Fix file uploads to work after 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/bmedx/modulestore.git/'


Add second menu item

Add second menu item

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/cpcrowley/vis-hist.git/'


Added a .nav-item class to the pois to inherit styles

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/'


Fix suspected typo.

Fix suspected typo.

--- core/htdocs_source/src/pods/oxifield-main/component.coffee
+++ core/htdocs_source/src/pods/oxifield-main/component.coffee
@@ -54,7 +54,7 @@
       keysize = @get("content.keysize")

       if keysize
-        return 'col-md-' + size
+        return 'col-md-' + keysize
       else
         return 'col-md-2'


Fix update server

Fix update server

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/Morgy93/Rocket.Chat.Cordova.git/'


removed unused example

removed unused example

--- documentation/coffee/array_comprehensions.coffee
+++ documentation/coffee/array_comprehensions.coffee
@@ -2,7 +2,4 @@
 lunch: food.eat() for food in ['toast', 'cheese', 'wine'].

 # Zebra-stripe a table.
-highlight(row) for row, i in table if i % 2 is 0.
-
-# Check the first one hundred combinations.
-lockpick(combinations[i]) for i in [1..100].+highlight(row) for row, i in table if i % 2 is 0.


Update ar.coffee

Update ar.coffee

First translation session

--- app/locale/ar.coffee
+++ app/locale/ar.coffee
@@ -6,12 +6,12 @@
     play: "إلعب" # The big play button that opens up the campaign view.
     old_browser: "اه أوه، متصفحك قديم جدا لتشغيل CodeCombat. آسف!" # Warning that shows up on really old Firefox/Chrome/Safari
     old_browser_suffix: "يمكنك محاولة على أي حال، لكنه ربما لن يعمل."
-#    ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval."
+    ipad_browser: "الخبر السيئ: لا يمكنك تشغيل اللعبة في المتصفح على الآيباد ، الخبر الجيد: تطبيق اللعبة للآيباد جاهز و في إنتظار موافقة آبل."
     campaign: "حملة"
     for_beginners: "للمبتدئين"
     multiplayer: "متعدد اللاعبين" # Not currently shown on home page
     for_developers: "للمطوّرين" # Not currently shown on home page.
-#    or_ipad: "Or download for iPad"
+    or_ipad: "أو حمِّل من أجل الآيباد"

   nav:
     play: "إلعب" # The top nav bar entry where players choose which levels to play
@@ -53,40 +53,40 @@
     players: "لاعبين" # Hover over a level on /play
     hours_played: "ساعات اللّعب" # Hover over a level on /play
 #    items: "Items" # Tooltip on item shop button from /play
-#    unlock: "Unlock" # For purchasing items and heroes
-#    confirm: "Confirm"
-#    owned: "Owned" # For items you own
-#    locked: "Locked"
-#    purchasable: "Purchasable" # For a hero you unlocked but haven't purchased
-#    available: "Available"
+    unlock: "فتح" # For purchasing items and heroes
+    confirm: "تأكيد"
+    owned: "ممتَلَك" # For items you own
+    locked: "مقفل"
+    purchasable: "للشراء" # For a hero you unlocked but haven't purchased
+    available: "متوفر"
 #    skills_granted: "Skills Granted" # Property documentation details
 #    heroes: "Heroes" # Tooltip on hero shop button from /play
 #    achievements: "Achievements" # Tooltip on achievement list button from /play
-#    account: "Account" # Tooltip on account button from /play
-#    settings: "Settings" # Tooltip on settings button from /play
-#    next: "Next" # Go from choose hero to choose inventory before playing a level
+    account: "حساب" # Tooltip on account button from /play
+    settings: "الإعدادات" # Tooltip on settings button from /play
+    next: "التالي" # Go from choose hero to choose inventory before playing a level
 #    change_hero: "Change Hero" # Go back from choose inventory to choose hero
 #    choose_inventory: "Equip Items"
 #    buy_gems: "Buy Gems"
-#    campaign_desert: "Desert Campaign"
-#    campaign_forest: "Forest Campaign"
-#    campaign_dungeon: "Dungeon Campaign"
-#    subscription_required: "Subscription Required"
-#    free: "Free"
-#    subscribed: "Subscribed"
-#    older_campaigns: "Older Campaigns"
-#    anonymous: "Anonymous Player"
+    campaign_desert: "حملة في الصحراء"
+    campaign_forest: "حملة في الغابة"
+    campaign_dungeon: "حملة في البرج"
+    subscription_required: "الإشتراك إلزامي"
+    free: "مجاني"
+    subscribed: "مسجَّل"
+    older_campaigns: "حملات أقدم"
+    anonymous: "لاعب مجهول"
     level_difficulty: "الصعوبة:"
     campaign_beginner: "حملة المبتدئين"
 #    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"
+    adjust_volume: "تعديل الصوت"
     choose_your_level: "اختر مستواك" # The rest of this section is the old play view at /play-old and isn't very important.
     adventurer_prefix: "يمكنك القفز إلى أي مستوى أدناه، أو مناقشة المستويات على "
     adventurer_forum: "منتدى المغامر"
     adventurer_suffix: "."
-#    campaign_old_beginner: "Old Beginner Campaign"
+    campaign_old_beginner: "حملات أقدم من أجل المبتدئين"
     campaign_old_beginner_description: "... فيها تتعلم سحر البرمجة."
     campaign_dev: "مستويات أصعب عشوائية"
     campaign_dev_description: "... فيها تتعلم واجهة بينما  تفعل شيئا أصعب قليلا."


Update subscribe parent copy

Update subscribe parent copy

--- app/locale/en.coffee
+++ app/locale/en.coffee
@@ -345,7 +345,7 @@
     parents: "For Parents"
     parents_title: "Your child will learn to code."
     parents_blurb1: "With CodeCombat, your child learns by writing real code. They start by learning simple commands, and progress to more advanced topics."
-    parents_blurb2: "For 9.99/mo, they get new challenges and personal email support from professional programmers."
+    parents_blurb2: "For 9.99/mo, they get new challenges every week and personal email support from professional programmers."
     parents_blurb3: "No Risk: 100% money back guarantee, easy 1-click unsubscribe."
     subscribe_button: "Subscribe Now"
     stripe_description: "Monthly Subscription"


Snippets for atom

Snippets for atom

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


Teeworlds connector

Teeworlds connector

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

--- app/teeworlds.coffee
+++ app/teeworlds.coffee
@@ -0,0 +1,16 @@
+config = require './config'
+TeeworldsEcon = require 'teeworlds-econ'
+
+{ host, port, password } = config.teeworlds
+
+throw new Error('Teeworlds password is undefind') unless password
+
+teeworlds = new TeeworldsEcon host, port, password
+
+teeworlds.on 'error', (err) ->
+  console.log err.message
+
+console.log 'Connecting to Teeworlds server...'
+teeworlds.connect()
+
+module.exports = teeworlds


Fixing typo

Fixing typo

--- lib/init.coffee
+++ lib/init.coffee
@@ -12,7 +12,7 @@
       default: false
     honorStyleSettings:
       type: 'boolean'
-      description: 'Honor standard/semistandard settings on pacakge.json'
+      description: 'Honor standard/semistandard settings on package.json'
       default: true

   activate: ->


removed unused brackets

removed unused brackets

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/Bogdan-p/bookingbug-angular.git/'


add module angular-file-upload

add module angular-file-upload

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/microweb10/forsale.git/'


Refactored

Refactored


Delay printing until after the load event

Signed-off-by: Peter Kröner <4b8373d016f277527198385ba72fda0feb5da015@peterkroener.de>

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/SirPepe/Pik7.git/'


add client service

add client service

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

--- app/js/services/client.coffee
+++ app/js/services/client.coffee
@@ -0,0 +1,6 @@
+class Client
+
+    status:
+        network_connection: 0
+
+angular.module("app").service("Client", ["$q", "$log", "RpcService", "$interval", Client])


adding coffee file back into repo

adding coffee file back into repo

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

--- browserdetect.coffee
+++ browserdetect.coffee
@@ -0,0 +1,124 @@
+define ->
+  class BrowserDetect
+    @platform: ->
+      os             = BrowserDetect.searchString(BrowserDetect.dataOS()) or "An unknown OS"
+      result         = BrowserDetect.searchString(BrowserDetect.dataBrowser())
+      browserName    = result.identity or "An unknown browser"
+      versionLabel   = result.version
+
+      browserVersion = BrowserDetect.searchVersion(versionLabel, navigator.userAgent) or
+        BrowserDetect.searchVersion(versionLabel, navigator.appVersion) or
+          "an unknown version"
+
+      return {browser: browserName, version: browserVersion, OS: os.identity}
+
+    @searchString: (data) ->
+      for datum in data
+        dataString = if (typeof datum.string == 'undefined') then null else datum.string
+        dataProp   = if (typeof datum.prop == 'undefined') then null else datum.prop
+
+        if dataString
+          if dataString.indexOf(datum.subString) != -1
+            return {identity: datum.identity, version: datum.versionSearch or datum.identity}
+        else if dataProp
+          return {identity: datum.identity, version: datum.versionSearch or datum.identity}
+
+      return {identity: '', version: ''}
+
+    @searchVersion: (versionLabel, dataString) ->
+      index = dataString.indexOf(versionLabel)
+      return if index == -1
+      return parseFloat(dataString.substring(index + versionLabel.length + 1))
+
+    @dataBrowser: (data) ->
+      data || [
+        {
+          string: navigator.userAgent,
+          subString: "Chrome",
+          identity: "Chrome"
+        },
+        {
+          string: navigator.userAgent,
+          subString: "OmniWeb",
+          versionSearch: "OmniWeb/",
+          identity: "OmniWeb"
+        },
+        {
+          string: navigator.vendor,
+          subString: "Apple",
+          identity: "Safari",
+          versionSearch: "Version"
+        },
+        {
+          prop: window.opera,
+          identity: "Opera"
+        },
+        {
+          string: navigator.vendor,
+          subString: "iCab",
+          identity: "iCab"
+        },
+        {
+          string: navigator.vendor,
+          subString: "KDE",
+          identity: "Konqueror"
+        },
+        {
+          string: navigator.userAgent,
+          subString: "Firefox",
+          identity: "Firefox"
+        },
+        {
+          string: navigator.vendor,
+          subString: "Camino",
+          identity: "Camino"
+        },
+        {  # for newer Netscapes (6+)
+          string: navigator.userAgent,
+          subString: "Netscape",
+          identity: "Netscape"
+        },
+        {
+          string: navigator.userAgent,
+          subString: "MSIE",
+          identity: "Explorer",
+          versionSearch: "MSIE"
+        },
+        {
+          string: navigator.userAgent,
+          subString: "Gecko",
+          identity: "Mozilla",
+          versionSearch: "rv"
+        },
+        {
+          # for older Netscapes (4-)
+          string: navigator.userAgent,
+          subString: "Mozilla",
+          identity: "Netscape",
+          versionSearch: "Mozilla"
+        }
+      ]
+
+    @dataOS: (data) ->
+      data || [
+        {
+          string: navigator.platform,
+          subString: "Win",
+          identity: "Windows"
+        },
+        {
+          string: navigator.platform,
+          subString: "Mac",
+          identity: "Mac"
+        },
+        {
+           string: navigator.userAgent,
+           subString: "iPhone",
+           identity: "iPhone/iPod"
+        },
+        {
+          string: navigator.platform
+          subString: "Linux",
+          identity: "Linux"
+        }
+      ]


use comprehension to create dataset

use comprehension to create dataset

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/fbergin/timeline-stats.git/'


:bug:Fix admin dashboard typo

:bug:Fix admin dashboard typo

--- app/views/admin/AnalyticsSubscriptionsView.coffee
+++ app/views/admin/AnalyticsSubscriptionsView.coffee
@@ -187,7 +187,7 @@
       color: 'red'
       strokeWidth: 1
     lineMetadata[netSubsID] =
-      description: '7-day Average Net Subscriptions (started - ended)'
+      description: '7-day Average Net Subscriptions (started - cancelled)'
       color: 'black'
       strokeWidth: 4


Fixed #2181, I hope.

Fixed #2181, I hope.

--- app/views/play/common/LadderSubmissionView.coffee
+++ app/views/play/common/LadderSubmissionView.coffee
@@ -56,27 +56,26 @@
     failure = (jqxhr, textStatus, errorThrown) =>
       console.log jqxhr.responseText
       @setRankingButtonText 'failed' unless @destroyed
-    transpiledCode = @transpileSession()
+    @transpileSession (transpiledCode) =>

-    ajaxData =
-      session: @session.id
-      levelID: @level.id
-      originalLevelID: @level.get('original')
-      levelMajorVersion: @level.get('version').major
-      transpiledCode: transpiledCode
+      ajaxData =
+        session: @session.id
+        levelID: @level.id
+        originalLevelID: @level.get('original')
+        levelMajorVersion: @level.get('version').major
+        transpiledCode: transpiledCode

-    $.ajax '/queue/scoring', {
-      type: 'POST'
-      data: ajaxData
-      success: success
-      error: failure
-    }
+      $.ajax '/queue/scoring', {
+        type: 'POST'
+        data: ajaxData
+        success: success
+        error: failure
+      }

-  transpileSession: ->
+  transpileSession: (callback) ->
     submittedCode = @session.get('code')
     codeLanguage = @session.get('codeLanguage') or 'javascript'
     @session.set('submittedCodeLanguage', codeLanguage)
-    @session.save()  # TODO: maybe actually use a callback to make sure this works?
     transpiledCode = {}
     for thang, spells of submittedCode
       transpiledCode[thang] = {}
@@ -85,7 +84,7 @@
         aetherOptions = createAetherOptions functionName: spellID, codeLanguage: codeLanguage
         aether = new Aether aetherOptions
         transpiledCode[thang][spellID] = aether.transpile spell
-    transpiledCode
+    @session.save null, success: -> callback transpiledCode

   onHelpSimulate: ->
     @playSound 'menu-button-click'


Remove comments

Remove comments

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


WIP lazyload js

WIP lazyload js


24 hour time

24 hour time

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/limratana/superset.git/'


Add codec_utils.coffee

Add codec_utils.coffee

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

--- codec_utils.coffee
+++ codec_utils.coffee
@@ -0,0 +1,19 @@
+module.exports =
+  # ISO 14496-3 - Table 1.16
+  getSamplingFreqIndex: (sampleRate) ->
+    switch sampleRate
+      when 96000 then 0x0
+      when 88200 then 0x1
+      when 64000 then 0x2
+      when 48000 then 0x3
+      when 44100 then 0x4
+      when 32000 then 0x5
+      when 24000 then 0x6
+      when 22050 then 0x7
+      when 16000 then 0x8
+      when 12000 then 0x9
+      when 11025 then 0xa
+      when  8000 then 0xb
+      when  7350 then 0xc
+      else
+        throw new Error "Unknown sample rate: #{sampleRate}"


Cleanup login class

Cleanup login class

--- resources/assets/coffee/_classes/user-login.coffee
+++ resources/assets/coffee/_classes/user-login.coffee
@@ -23,34 +23,11 @@
     $(document).on 'ajax:success', '.js-login-form', @loginSuccess
     $(document).on 'ajax:error', '.js-login-form', @loginError

-    $(document).on 'click', '.js-user-link', (event) =>
-      event.preventDefault()
-      osu.timeout 0, @show
+    $(document).on 'click', '.js-user-link', @showOnClick
+    $(document).on 'click', '.js-login-required--click', @showToContinue

-    $(document).on 'click', '.js-login-required--click', (event) =>
-      return if currentUser.id?
-      event.preventDefault()
-      osu.timeout 0, => @show event.target
-
-    $(document).on 'ajax:error', (event, xhr) =>
-      return unless xhr.status == 401
-      @show event.target
-
-    # for pages which require authentication
-    # and being visited directly from outside
-    $(document).on 'ready turbolinks:load', ->
-      return unless window.showLoginModal
-
-      window.showLoginModal = null
-      @show()
-
-
-  show: (target) =>
-    @clickAfterLogin = target
-
-    $.scrollTo 0, 500
-    @nav.currentMode('user')
-    @nav.showPopup()
+    $(document).on 'ajax:error', @showOnError
+    $(document).on 'ready turbolinks:load', @showOnLoad

   hide: =>
@@ -80,3 +57,36 @@
         @clickAfterLogin.click()
     else
       osu.reloadPage()
+
+
+  show: (target) =>
+    @clickAfterLogin = target
+
+    $.scrollTo 0, 500
+    @nav.currentMode('user')
+    @nav.showPopup()
+
+
+  showOnClick: (event) =>
+    event.preventDefault()
+    osu.timeout 0, @show
+
+
+  showOnError: (event, xhr) =>
+    return unless xhr.status == 401
+    @show event.target
+
+
+  # for pages which require authentication
+  # and being visited directly from outside
+  showOnLoad: =>
+      return unless window.showLoginModal
+
+      window.showLoginModal = null
+      @show()
+
+
+  showToContinue: (event) =>
+    return if currentUser.id?
+    event.preventDefault()
+    osu.timeout 0, => @show event.target


After job finished, re-render again

After job finished, re-render again

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/kenliau/Zooey.git/'


Added blue bottle me script

Added blue bottle me script

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

--- src/scripts/bluebottle.coffee
+++ src/scripts/bluebottle.coffee
@@ -0,0 +1,27 @@
+# Description:
+#   Fetches an image of the Mint Plaza Blue Bottle Line.
+#
+# Dependencies:
+#   "cheerio": "0.7.0"
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot blue bottle me - gets an image of the line at the Mint Plaza Blue Bottle Coffee
+#
+# Author:
+#   sloanesturz
+
+cheerio = require('cheerio')
+
+module.exports = (robot) ->
+
+  robot.respond /blue bottle me/i, (msg) ->
+    msg.http('http://bb.zaarly.com/').get() (err, res, body) ->
+      if res.statusCode != 200
+        msg.send "Couldn't access http://bb.zaarly.com. No coffee for you!"
+      else
+        $ = cheerio.load(body)
+        url = $('body').attr('style').match(/url\('(.+)'\)/)[1]
+        msg.send url


Initial Russian translation

Initial Russian translation

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/clochix/cozy-home.git/'


updated config to keep up with sauce changes

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/7163FCFAB/spaghetti.git/'


Acknoledge me, you poopdick

Acknoledge me, you poopdick

--- scripts/tell.coffee
+++ scripts/tell.coffee
@@ -27,7 +27,8 @@
      else
        localstorage[room][username] = tellmessage
      return
-
+    robot.reply "Ok, I'll tell #{username}"
+
    # When a user enters, check if someone left them a message
    robot.enter (msg) ->
      username = msg.message.user.name


search fixes

search 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/'


Rough work on translating bindings again

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/damianb/crimson.git/'


JS bug fix

JS bug 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/bmedx/modulestore.git/'


client: rename var

client: rename var

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/'


NavigationMachineItem: Minor code styling.


Don't use utf8 encoding to import files (allow binaries)

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/'


Add importing files

Add importing files


Add cat me/bomb

Add cat me/bomb

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

--- scripts/cat.coffee
+++ scripts/cat.coffee
@@ -0,0 +1,30 @@
+# Description
+#   random cat gifs as a service for your cat gif driven development
+#   source for the service: https://github.com/flores/moarcats
+#   most of the below is lifted from corgime.coffee
+#   (taken from github/hubot-scripts/src/scripts/moarcatsme.coffee)
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot moarcats me - links http://edgecats.net, which serves a random cat gif
+#   hubot moarcats bomb <n> - gives <n> cat gifs
+#
+# Author:
+#   flores
+
+module.exports = (robot) ->
+  robot.respond /cat me/i, (msg) ->
+    msg.http("http://edgecats.net/random").get() (err, res, body) ->
+      msg.send body
+
+  robot.respond /cat bomb( (\d+))?/i, (msg) ->
+    count = msg.match[2] || 2
+    for cat in [1..count]
+      msg.http("http://edgecats.net/random")
+        .get() (err, res, body) ->
+          msg.send body


Client: Add missing file. Derp.

Client: Add missing file. Derp.

error: pathspec 'client/app/js/concerns/loading_message.coffee' did not match any file(s) known to git

--- client/app/js/concerns/loading_message.coffee
+++ client/app/js/concerns/loading_message.coffee
@@ -0,0 +1,3 @@
+PokeBattle.events.on "connect", ->
+  $loading = $(".loading-container")
+  $loading.fadeOut(-> $loading.remove())


chore(bootstrap):use production backend for devel

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-wr-google-drive.git/'


Traduction de l'anglais vers l'arabe 0.4

--- app/locale/ar.coffee
+++ app/locale/ar.coffee
@@ -152,7 +152,7 @@
     fork: "إنسخ"
     play: "إلعب" # When used as an action verb, like "Play next level"
     retry: "إعادة"
-#    actions: "Actions"
+    actions: "Actions"
     info: "معلومات"
     help: "مساعدة"
     watch: "مشاهدة"
@@ -260,19 +260,19 @@
     victory_go_home: "اذهب للمنزل" # Only in old-style levels.
     victory_review: "إخبرنا المزيد!" # Only in old-style levels.
 #    victory_hour_of_code_done: "Are You Done?"
-#    victory_hour_of_code_done_yes: "Yes, I'm finished with my Hour of Code™!"
+    victory_hour_of_code_done_yes: "نعم، أنا مع الانتهاء من ساعتي من قانون ™!"
 #    victory_experience_gained: "XP Gained"
-#    victory_gems_gained: "Gems Gained"
-#    victory_new_item: "New Item"
-#    victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
-#    victory_become_a_viking: "Become a Viking"
-#    guide_title: "Guide"
-#    tome_minion_spells: "Your Minions' Spells" # Only in old-style levels.
-#    tome_read_only_spells: "Read-Only Spells" # Only in old-style levels.
-#    tome_other_units: "Other Units" # Only in old-style levels.
-#    tome_cast_button_run: "Run"
-#    tome_cast_button_running: "Running"
-#    tome_cast_button_ran: "Ran"
+#    victory_gems_gained: "الأحجار الكريمة المكتسبة"
+    victory_new_item: "عنصر جديد"
+    victory_viking_code_school: "يدخن المقدسة، وكان ذلك على مستوى الثابت الذي فاز فقط! إذا لم تكن بالفعل مطور برامج، يجب أن تكون. كنت فقط حصلت على المسار السريع لقبوله مع مدرسة فايكنغ المدونة، حيث يمكنك أن تأخذ المهارات الخاصة بك إلى المستوى التالي وتصبح مطور ويب محترف في 14 أسبوعا."
+    victory_become_a_viking: "تصبح فايكنغ"
+    guide_title: "دليل"
+    tome_minion_spells: "نوبات التوابع الخاصة بك" # Only in old-style levels.
+    tome_read_only_spells: "Read-Only Spells" # Only in old-style levels.
+    tome_other_units: "وحدات أخرى" # Only in old-style levels.
+    tome_cast_button_run: "Run"
+    tome_cast_button_running: "تشغيل"
+    tome_cast_button_ran: "ران"
 #    tome_submit_button: "Submit"
 #    tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
 #    tome_select_method: "Select a Method"
@@ -394,16 +394,16 @@
 #    unequip: "Unequip"

 #  buy_gems:
-#    few_gems: "A few gems"
-#    pile_gems: "Pile of gems"
-#    chest_gems: "Chest of gems"
-#    purchasing: "Purchasing..."
+    few_gems: " عدد قليل من الأحجار الكريمة"
+    pile_gems: "كومة من الأحجار الكريمة"
+    chest_gems: "الصدر من الأحجار الكريمة"
+    purchasing: "شراء ..."
 #    declined: "Your card was declined"
 #    retrying: "Server error, retrying."
 #    prompt_title: "Not Enough Gems"
 #    prompt_body: "Do you want to get more?"
-#    prompt_button: "Enter Shop"
-#    recovered: "Previous gems purchase recovered. Please refresh the page."
+    prompt_button: "أدخل متجر"
+    recovered: "الأحجار الكريمة السابقة أون استردادها. يرجى تحديث الصفحة."
 #    price: "x3500 / mo"

 #  subscribe:
@@ -687,7 +687,7 @@
     forum_page: "منتدانا"
     forum_suffix: "بدلا من ذلك."
 #    faq_prefix: "There's also a"
-#    faq: "FAQ"
+    faq: "FAQ"
 #    subscribe_prefix: "If you need help figuring out a level, please"
 #    subscribe: "buy a CodeCombat subscription"
 #    subscribe_suffix: "and we'll be happy to help you with your code."


Update ko.coffee

Update ko.coffee

Hi there.
I'm not sure that if it is okay to to this .. but anyway I thought there were a lot of thing that I could help so I did translate a bit. I checked out the code combat website but they just says "go to github, and translate."
thank you,
Melondonut.

안녕하세요. 제가 이래도 되는 건지는 모르겠지만, 제가 도움이 될 수 있을 것 같아 시험삼아 조금 번역해보았습니다. 코드 컴뱃 사이트를 확인했는데, 깃헙에 가서 번역한 다음 리퀘스트하라는 말만 있더라구요; 확인해주시면 감사하겠습니다.

--- app/locale/ko.coffee
+++ app/locale/ko.coffee
@@ -90,11 +90,11 @@
 #    required: "You need to log in before you can go that way."

   home:
-    slogan: "쉽고 간단한 게임배우기"
+    slogan: "쉽고 간단한 게임 배우기"
     no_ie: "죄송하지만 코드컴뱃은 인터넷 익스플로러 9에서는 동작하지 않습니다."
     no_mobile: "코드 컴뱃은 모바일 기기용으로 제작되지 않았습니다. 아마 동작하지 않을 가능성이 높습니다."
     play: "시작"
-    old_browser: "브라우저가 너무 오래된 버전이라 코드컴뱃을 실행할 수 없습니다."
+    old_browser: "브라우저가 너무 오래된 버전이라 코드 컴뱃을 실행할 수 없습니다."
     old_browser_suffix: "시도해볼 수는 있겠지만..안될수도 있습니다."
     campaign: "캠페인"
     for_beginners: "초보자용"
@@ -109,7 +109,7 @@

   play:
     choose_your_level: "레벨을 선택하세요."
-    adventurer_prefix: "아래에 있는 어떤 레벨도 바로 시작하실 수 있습니다.또는 포럼에서 레벨에 관해 토론하세요 :"
+    adventurer_prefix: "아래에 있는 아무 레벨이나 바로 시작하실 수 있습니다. 또는 포럼에서 레벨에 관해 토론하세요 :"
     adventurer_forum: "모험가들의 포럼"
     adventurer_suffix: "."
     campaign_beginner: "초보자 캠페인"
@@ -125,7 +125,7 @@
     spectate: "관중모드"

   contact:
-    contact_us: "코드컴뱃에 전할말"
+    contact_us: "코드컴뱃에 전할 말"
     welcome: "의견은 언제든지 환영합니다. 이 양식을 이메일에 사용해 주세요!"
     contribute_prefix: "혹시 같이 코드컴뱃에 공헌하고 싶으시다면 홈페이지에 들러주세요 "
     contribute_page: "참여하기 페이지"
@@ -139,15 +139,15 @@

   diplomat_suggestion:
     title: "코드 컴뱃 번역을 도와주세요!"
-    sub_heading: "우리는 당신의 언어 능력이필요합니다."
-    pitch_body: "우리는 영어로 코드컴뱃을 개발하기 시작했지만, 이미 전세계의 유저들이 코드컴뱃을 이용하고 있습니다. 그중 많은 사람들이 한국어로 플레이하기를 바랍니다. 혹시 당신이 영어/한국어에 모두 능숙하다면, Diplomat 으로 코드컴뱃에 참여해서 모든 레벨 뿐 아니라 웹사이트를 한국어로 번역할 수 있습니다."
+    sub_heading: "우리는 당신의 언어 능력이 필요합니다."
+    pitch_body: "우리는 영어로 코드컴뱃을 개발하기 시작했지만, 이미 전세계의 유저들이 코드컴뱃을 이용하고 있습니다. 그 중 많은 사람들이 한국어로 플레이하기를 바랍니다. 혹시 당신이 영어/한국어에 모두 능숙하다면, Diplomat 으로 코드컴뱃에 참여해서 모든 레벨 뿐 아니라 웹사이트를 한국어로 번역할 수 있습니다."
     missing_translations: "우리가 모든 내용을 한국어로 번역할때까지 기본은 영어로 제공됩니다."
-    learn_more: "외교관에 대해서 좀더 자세히알기"
-    subscribe_as_diplomat: "훌륭한 외교관으로써, 정기 구독하기"
+    learn_more: "외교관에 대해서 좀 더 자세히 알아보기"
+    subscribe_as_diplomat: "외교관을 위한 정기 구독"

   wizard_settings:
     title: "마법사 설장"
-    customize_avatar: "당신의 분신을 직접 꾸미세요"
+    customize_avatar: "당신의 아바타를 직접 꾸미세요"
 #    active: "Active"
 #    color: "Color"
 #    group: "Group"
@@ -163,7 +163,7 @@

   account_settings:
     title: "계정 설정"
-    not_logged_in: "로그인 하시거나 계정을 생성하여 주세요."
+    not_logged_in: "로그인하시거나 계정을 생성하세요."
     autosave: "변경 사항은 자동 저장 됩니다"
     me_tab: "나"
     picture_tab: "사진"
@@ -192,17 +192,17 @@
     error_saving: "오류 저장"
     saved: "변경사항 저장 완료"
     password_mismatch: "비밀번호가 일치하지 않습니다."
-#    password_repeat: "Please repeat your password."
+    password_repeat: "비밀번호를 한번 더 입력해 주세요."
 #    job_profile: "Job Profile"
 #    job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks."
 #    job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job."
 #    sample_profile: "See a sample profile"
-#    view_profile: "View Your Profile"
+    view_profile: "나의 프로필 보기"

   account_profile:
-#    settings: "Settings"
-#    edit_profile: "Edit Profile"
-#    done_editing: "Done Editing"
+    settings: "설정"
+    edit_profile: "프로필 수정하기"
+    done_editing: "수정 완료"
     profile_for_prefix: "프로필 "
     profile_for_suffix: ""
 #    featured: "Featured"
@@ -357,10 +357,10 @@
     multiplayer: "멀티 플레이어"
     restart: "재시작"
     goals: "목표"
-#    success: "Success!"
-#    incomplete: "Incomplete"
-#    timed_out: "Ran out of time"
-#    failing: "Failing"
+    success: "성공!"
+    incomplete: "목표 미완료"
+    timed_out: "제한 시간 초과"
+    failing: "다시 한번 더 도전해보세요."
     action_timeline: "액션 타임라인"
     click_to_select: "유닛을 선택하기 위해서 유닛을 마우스로 클릭하세요."
     reload_title: "모든 코드가 다시 로딩 되었나요?"
@@ -400,8 +400,8 @@
     editor_config: "에디터 설정"
     editor_config_title: "에디터 설정"
 #    editor_config_level_language_label: "Language for This Level"
-#    editor_config_level_language_description: "Define the programming language for this particular level."
-#    editor_config_default_language_label: "Default Programming Language"
+    editor_config_level_language_description: "이 레벨에서 사용할 언어를 선택하세요."
+    editor_config_default_language_label: "기본 프로그래밍 언어"
 #    editor_config_default_language_description: "Define the programming language you want to code in when starting new levels."
     editor_config_keybindings_label: "단축키 설정"
     editor_config_keybindings_default: "기본(Ace)"
@@ -414,7 +414,7 @@
     editor_config_indentguides_description: "들여쓰기 확인위해 세로줄 표시하기."
     editor_config_behaviors_label: "자동 기능"
     editor_config_behaviors_description: "괄호, 인용부호, 따옴표 자동 완성."
-#    keyboard_shortcuts: "Key Shortcuts"
+    keyboard_shortcuts: "단축키"
 #    loading_ready: "Ready!"
 #    tip_insert_positions: "Shift+Click a point on the map to insert it into the spell editor."
 #    tip_toggle_play: "Toggle play/paused with Ctrl+P."


activity: add ChannelParticipantsModel

activity: add ChannelParticipantsModel

error: pathspec 'client/activity/lib/models/channelparticipants.coffee' did not match any file(s) known to git

--- client/activity/lib/models/channelparticipants.coffee
+++ client/activity/lib/models/channelparticipants.coffee
@@ -0,0 +1,211 @@
+immutable     = require 'immutable'
+kd            = require 'kd'
+fetchAccounts = require 'app/util/fetchAccounts'
+sinkrow       = require 'sinkrow'
+
+###*
+ * A model class to handle participant works of given channel. Hopefully this
+ * will evolve and be a part of `ChannelModel`.
+ *
+ * This class is responsible of:
+ *
+ *     - transforming participant previews initially
+ *     - listening realtime events and transforming them into JAccount instances
+ *     - emitting an event when a change happens on the participants list so
+ *       that any other class can listen to it.
+ *
+ * It uses ImmutableJS for dealing with data structures.
+ *
+ * @class
+###
+module.exports = class ChannelParticipantsModel extends kd.Object
+
+  constructor: (options = {}, data) ->
+
+    super options
+
+    @setChannel options.channel
+
+    @participants = immutable.OrderedMap()
+
+    fetchAccounts @channel.participantsPreview, (err, accounts) =>
+      return console.error err  if err
+      @setParticipant account  for account in accounts
+      @emitChange()
+
+    @fetchFromBackend()
+
+
+  ###*
+   * Sets given channel, unbinds events if there is already a channel and binds
+   * the events to given channel.
+   *
+   * @param {SocialChannel} channel
+  ###
+  setChannel: (channel) ->
+
+    # unbind listeners first there is a channel.
+    if @channel
+      @channel.off 'AddedToChannel', @bound 'add'
+      @channel.off 'RemovedFromChannel', @bound 'remove'
+
+    channel.on 'AddedToChannel', @bound 'add'
+    channel.on 'RemovedFromChannel', @bound 'remove'
+
+    @channel = channel
+
+
+  ###*
+   * Fetch channel's all participants from backend. Transforms it them into jAccounts.
+  ###
+  fetchFromBackend: (emitEvent = yes) ->
+
+    fetchParticipants @channel.id, (err, accounts) =>
+      return console.log err  if err
+      @setParticipant account  for account in accounts
+      @emitChange()  if emitEvent
+
+
+  ###*
+   * Saves given account into instance's participants map. It doesn't change
+   * the participant if there is a participant with that id, it's a noop.
+   *
+   * @param {JAccount} account
+   * @return {Immutable.OrderedMap}
+  ###
+  setParticipant: (account) ->
+
+    return @participants  if @participants.get account._id
+
+    console.log {account}, '>>>>>>>>>>>>>>', account._id
+
+    @participants = @participants.set account._id, immutable.fromJS account
+
+
+  ###*
+   * Takes an origin object, fetchs the jAccount instance related with that
+   * origin, then caches the participant on participants object. It will emit
+   * change event unless otherwise noted via `emitEvent` parameter.
+   *
+   * @param {object} origin - an object with id and a constructor name for bongo.
+   * @param {boolean=} emitEvent
+  ###
+  add: (origin, emitEvent = yes) ->
+
+    fetchAccounts [origin], (err, [account]) =>
+      return console.error err  if err
+      @setParticipant account
+      @emitChange()  if emitEvent
+
+
+  ###*
+   * Removes the cached object from instance's participants object. If there is
+   * not a participant with that id, it's a noop.
+   *
+   * @param {object} origin
+   * @param {boolean=} emitEvent
+  ###
+  remove: (origin, emitEvent = yes) ->
+
+    # sanitize the origin first.
+    origin.id or= origin._id
+
+    return  unless @participants.get origin.id
+
+    @participants = @participants.remove origin.id
+    @emitChange()  if emitEvent
+
+
+  ###*
+   * Provides basic computation to populate preview participants. This is just
+   * a bare-bones implementation for regular PrivateMessages. Subclasses should
+   * implement this method to modify how preview list should be populated.
+   *
+   * @param {Immutable.OrderedMap} participants - all participants
+   * @return {Immutable.List} computedPreviewParticipants
+  ###
+  computePreviewParticipants: (participants) ->
+
+    return participants.toSeq().take(5).toList()
+
+
+  ###*
+   * Provides basic computation to populate preview participants. This is just
+   * a bare-bones implementation for regular PrivateMessages. Subclasses should
+   * implement this method to modify how preview list should be populated.
+   *
+   * @param {Immutable.OrderedMap} participants - all participants
+   * @return {Immutable.List} computedPreviewParticipants
+  ###
+  computeHiddenParticipants: (participants) ->
+
+    return participants.toSeq().skip(5).toList()
+
+
+  ###*
+   * Provides basic computation to populate preview participants. This is just
+   * a bare-bones implementation for regular PrivateMessages. Subclasses should
+   * implement this method to modify how preview list should be populated.
+   *
+   * @param {Immutable.OrderedMap} participants - all participants
+   * @return {Immutable.List} computedPreviewParticipants
+  ###
+  computeAllParticipants: (participants) ->
+
+    return participants.toList()
+
+
+  ###*
+   * First computes all participants via:
+   * - `computeAllParticipants`
+   *
+   * Then passes that into:
+   * - `computePreviewParticipants`
+   * - `computeHiddenParticipants`
+   *
+   * Composes a regular JS object with 3 of those lists and returns that.
+   *
+   * @return {object}
+  ###
+  getLists: ->
+
+    all = @computeAllParticipants @participants
+
+    lists =
+      preview : @computePreviewParticipants all
+      hidden  : @computeHiddenParticipants all
+      all     : all
+
+
+  ###*
+   * Emit change event with computed lists that is computed with current
+   * participants.
+   *
+   * @emits ChatParticipantHeads~change
+  ###
+  emitChange: -> @emit 'change', @getLists()
+
+
+  ###*
+  * Convinience method for other classes to easily add a handler to be called
+  * whenever participants list is changed.
+  *
+  * @param {function} callback
+  ###
+  addChangeListener: (callback) -> @on 'change', callback
+
+
+###*
+ * Wrapper function around SocialApiController::channel.listParticipants.
+###
+fetchParticipants = (id, callback) ->
+
+  {socialapi} = kd.singletons
+
+  socialapi.channel.listParticipants {channelId: id}, (err, participants) ->
+    return callback err  if err
+    origins = participants.map ({accountOldId}) ->
+      return { id: accountOldId, constructorName: 'JAccount' }
+    fetchAccounts origins, callback
+
+