Added test file for characters

Added test file for characters

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

--- test/characters-test.coffee
+++ test/characters-test.coffee
@@ -0,0 +1,204 @@
+chai      = require('chai')
+expect    = chai.expect
+should    = chai.should()
+sinon     = require('sinon')
+sinonChai = require('sinon-chai')
+_         = require("underscore")
+
+chai.use(sinonChai)
+
+Y = require "../../yjs/lib/y"
+Y.Characters = (require "../lib/characters").Characters
+
+Connector = require "../../y-test/lib/y-test.coffee"
+
+TestSuite = require "../../yjs/test/object-test"
+
+class CharacterTest extends TestSuite
+
+  constructor: (suffix)->
+    super suffix, Y
+
+  type: "CharacterTest"
+
+  makeNewUser: (userId)->
+    conn = new Connector userId
+    new Y conn
+
+  initUsers: (u)->
+    u.val("CharacterTest", new Y.Characters())
+  getRandomRoot: (user_num)->
+    @users[user_num].val("CharacterTest")
+
+  getContent: (user_num)->
+    @users[user_num].val("CharacterTest").val()
+
+describe "Text Test", ->
+  @timeout 500000
+
+  beforeEach (done)->
+    @yTest = new CharacterTest()
+    done()
+
+  it "can handle many engines, many operations, concurrently (random)", ->
+    console.log "" # TODO
+    @yTest.run()
+
+  it "simple multi-char insert", ->
+    u = @yTest.users[0].val("CharacterTest")
+    u.insert 0, "abc"
+    u = @yTest.users[1].val("CharacterTest")
+    u.insert 0, "xyz"
+    @yTest.compareAll()
+    u.delete 0, 1
+    @yTest.compareAll()
+    expect(u.val()).to.equal("bcxyz")
+
+  it "Observers work on shared Text (insert type observers, local and foreign)", ->
+    u = @yTest.users[0].val("CharacterTest",new Y.Text("my awesome Text")).val("CharacterTest")
+    @yTest.flushAll()
+    last_task = null
+    observer1 = (changes)->
+      expect(changes.length).to.equal(1)
+      change = changes[0]
+      expect(change.type).to.equal("insert")
+      expect(change.object).to.equal(u)
+      expect(change.value).to.equal("a")
+      expect(change.position).to.equal(1)
+      expect(change.changedBy).to.equal('0')
+      last_task = "observer1"
+    u.observe observer1
+    u.insert 1, "a"
+    expect(last_task).to.equal("observer1")
+    u.unobserve observer1
+
+    observer2 = (changes)->
+      expect(changes.length).to.equal(1)
+      change = changes[0]
+      expect(change.type).to.equal("insert")
+      expect(change.object).to.equal(u)
+      expect(change.value).to.equal("x")
+      expect(change.position).to.equal(0)
+      expect(change.changedBy).to.equal('1')
+      last_task = "observer2"
+    u.observe observer2
+    v = @yTest.users[1].val("CharacterTest")
+    v.insert 0, "x"
+    @yTest.flushAll()
+    expect(last_task).to.equal("observer2")
+    u.unobserve observer2
+
+  it "Observers work on shared Text (delete type observers, local and foreign)", ->
+    u = @yTest.users[0].val("CharacterTest",new Y.Text("my awesome Text")).val("CharacterTest")
+    @yTest.flushAll()
+    last_task = null
+    observer1 = (changes)->
+      expect(changes.length).to.equal(1)
+      change = changes[0]
+      expect(change.type).to.equal("delete")
+      expect(change.object).to.equal(u)
+      expect(change.position).to.equal(1)
+      expect(change.length).to.equal(1)
+      expect(change.changedBy).to.equal('0')
+      last_task = "observer1"
+    u.observe observer1
+    u.delete 1, 1
+    expect(last_task).to.equal("observer1")
+    u.unobserve observer1
+
+    observer2 = (changes)->
+      expect(changes.length).to.equal(1)
+      change = changes[0]
+      expect(change.type).to.equal("delete")
+      expect(change.object).to.equal(u)
+      expect(change.position).to.equal(0)
+      expect(change.length).to.equal(1)
+      expect(change.changedBy).to.equal('1')
+      last_task = "observer2"
+    u.observe observer2
+    v = @yTest.users[1].val("CharacterTest")
+    v.delete 0, 1
+    @yTest.flushAll()
+    expect(last_task).to.equal("observer2")
+    u.unobserve observer2
+
+  it "can handle many engines, many operations, concurrently (random)", ->
+    console.log("testiy deleted this TODO:dtrn")
+    @yTest.run()
+
+  it "handles double-late-join", ->
+    test = new CharacterTest("double")
+    test.run()
+    @yTest.run()
+    u1 = test.users[0]
+    u2 = @yTest.users[1]
+    ops1 = u1._model.HB._encode()
+    ops2 = u2._model.HB._encode()
+    u1._model.engine.applyOp ops2, true
+    u2._model.engine.applyOp ops1, true
+    compare = (o1, o2)->
+      if o1._name? and o1._name isnt o2._name
+        throw new Error "different types"
+      else if o1._name is "Object"
+        for name, val of o1.val()
+          compare(val, o2.val(name))
+      else if o1._name?
+        compare(o1.val(), o2.val())
+      else if o1 isnt o2
+        throw new Error "different values"
+    compare u1, u2
+    expect(test.getContent(0)).to.deep.equal(@yTest.getContent(1))
+
+
+module.exports = CharacterTest
+#chai      = require 'chai'     # assertion library
+#expect    = chai.expect()
+#should    = chai.should()
+#sinon     = require 'sinon'    # test spies, stubs and mocks for js
+#sinonChai = require 'sinon-chai'
+#_         = require "underscore"
+#$         = require 'jquery'
+#
+#chai.use(sinonChai)
+#chai.config.includeStack = true
+#
+#Characters = (require '../lib/characters.coffee').Characters
+#
+#Y = require "../../yjs/lib/y"
+#Connector = require '../../y-test/lib/y-test.coffee'
+#
+#testString = "This is a test"
+#
+#describe "Characters", ->
+#  conn = new Connector "hello"
+#  y = new Y conn
+#  c = new Characters testString
+#  it "constructor", ->
+#    c._chars.length.should.equal testString.length
+#    for char, key in testString
+#      c._chars[key].char.should.equal char
+#  it "setModel", ->
+#    y.val "test", c
+#    console.log c
+#
+#  it "getModel", ->
+#
+#  it "createChar", ->
+#
+#  it "insert", ->
+#    n = "not "
+#    newString = "This is not a test"
+#    c.insert 8, n
+#    for char, key in newString
+#      c._chars[key].char.should.equal char
+#
+#  it "val", ->
+#
+#  it "delete", ->
+#  it "update", ->
+#  it "bindSelection", ->
+#  it "unbindSelection", ->
+#  it "delta", ->
+#
+#
+#


[Activity][Tag] fixed activity fetching bug for tags

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


fixed merge conflicts

fixed merge conflicts

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


remove console log

remove console log


Always set state to stop before unmount

Always set state to stop before unmount

--- resources/assets/coffee/react/_components/beatmapset-panel.coffee
+++ resources/assets/coffee/react/_components/beatmapset-panel.coffee
@@ -38,6 +38,7 @@

   componentWillUnmount: =>
+    @previewStop()
     $.unsubscribe ".#{@eventId}"
     $(document).off ".#{@eventId}"


Windows don't always have an opener and/or parent

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


Bugfix

Bugfix

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


added nav bar tests

added nav bar tests

[#95231438]

error: pathspec 'review_front/tests/acceptance/navigation-bar-test.coffee' did not match any file(s) known to git

--- review_front/tests/acceptance/navigation-bar-test.coffee
+++ review_front/tests/acceptance/navigation-bar-test.coffee
@@ -0,0 +1,41 @@
+`import Ember from 'ember'`
+`import { module, test } from 'qunit'`
+`import startApp from '../helpers/start-app'`
+`import Server from '../mocks/server'`
+
+application = null
+server = null
+
+module 'Acceptance: NavigationBar',
+  beforeEach: ->
+    application = startApp()
+    server = Server.create()
+    visit '/'
+    return
+
+  afterEach: ->
+    Ember.run application, 'destroy'
+    server.shutdown()
+
+test 'navigation bar renders', (assert) ->
+    assert.equal find('.navbar').length, 1
+
+test 'shows link to projects page', (assert) ->
+  assert.equal find("a:contains('Projects')").length, 1
+
+test 'shows linkt to admin page if user is admin', (assert) ->
+  assert.equal find("a:contains('Admin')").length, 1
+
+test 'after click on admin it trnsfers to admin page', (assert) ->
+  click("a:contains('Admin')")
+  andThen ->
+    assert.equal currentPath(), 'admin.users'
+
+test 'from adming page it transfers to projects after click on projects', (assert) ->
+  click("a:contains('Admin')")
+  andThen ->
+    click("a:contains('Projects')")
+    andThen ->
+      assert.equal currentPath(), 'projects.index'
+
+


Fix broken stack template content issue [fixes #105650432]

--- client/admin/lib/views/stacks/editors/stacktemplateeditorview.coffee
+++ client/admin/lib/views/stacks/editors/stacktemplateeditorview.coffee
@@ -23,6 +23,8 @@
         # Here is your stack preview
         # You can make advanced changes like modifying your VM,
         # installing packages, and running shell commands.
+
+
       """

       ace.editor.session.insert position, content


sidebar: set updated stack state on close

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

--- client/app/lib/sidebar/components/stackupdatedwidget.coffee
+++ client/app/lib/sidebar/components/stackupdatedwidget.coffee
@@ -21,9 +21,15 @@
       appManager.tell 'Stackeditor', 'reloadEditor', templateId

+  onClose: ->
+
+    { sidebar } = kd.singletons
+    sidebar.setUpdatedStack null
+
+
   render: ->

-    <SidebarWidget {...@props} onClose={@props.onClose}>
+    <SidebarWidget {...@props} onClose={@bound 'onClose'}>
       STACK UPDATED

         You need to reinitialize your machines before booting.


backup: match() finished.

backup: match() finished.

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

--- json-spec.coffee
+++ json-spec.coffee
@@ -0,0 +1,162 @@
+module.exports = {Data, Either, Enum, Maybe, Bool, Number, String, Dict, Strict, Any}
+require 'coffee-mate/global'
+
+Bool = Boolean
+
+Any = do ->
+	r = (->)
+	return (r.constructor = r)
+
+Enum = (ls) ->
+	constructor: Enum
+	enum: ls
+
+Maybe = (spec) ->
+	constructor: Maybe
+	spec: spec
+
+Either = (specs) ->
+	constructor: Either
+	specs: specs
+
+Dict = (spec) ->
+	constructor: Dict
+	spec: spec
+
+Strict = (specdict) ->
+	constructor: Strict
+	specdict: specdict
+
+Data = ({spec, samples, name, discription}) ->
+	if samples? and not all(match(spec)) samples
+		log -> spec
+		log -> samples
+		log -> match(spec) samples[0]
+		throw TypeError 'bad samples'
+
+	constructor: Data
+	sample: ->
+		if samples? then samples[0] else null
+	owns: (elem) ->
+		match(spec) elem
+	spec: spec
+	samples: samples
+	name: name
+	discription: discription
+
+#class TypeSpec a where
+#	match :: a -> Dynamic -> Bool
+#	show :: a -> String
+#	showHtml :: a -> Html
+#	displayName :: a -> Maybe String
+#	discription :: a -> Maybe String
+#	sample :: a -> Dynamic
+#	samples :: a -> [Dynamic]
+#
+#instance TypeSpec Enum where
+#	match (Enum vs) v = v `elem` vs
+#	show (Enum vs) = if length vs > 1 then "Enum [#{vs[0]} ...]" else "Enum [#{vs[0]}]"
+#	displayName (Enum _) = Nothing
+#
+#instance TypeSpec Bool where
+#	match Bool v = v `elem` [true, false]
+#	show Bool = "Bool"
+#	displayName Bool = Nothing
+#
+#instance TypeSpec Number where
+#	match Number v = typeof v is 'number' or v.constructor is Prim.Number
+#	show Number = "Number"
+#	displayName Number = Nothing
+#
+#instance TypeSpec String where
+#	match String v = s.constructor is Prim.String
+#	show String = "String"
+#	displayName String = Nothing
+#
+#instance TypeSpec Maybe where
+#	match (Maybe spec) v = not v? or match spec v
+#	show (Maybe spec) = "Maybe #{show spec}"
+#	displayName (Maybe _) = Nothing
+#
+#instance TypeSpec Either where
+#	match (Either specs) v = (ks = Object.keys(v)).length is 1 and (spec = specs[ks[0]])? and match(spec) v
+#
+#instance TypeSpec Dict where
+#	match (Dict spec) v = all(match spec) map(seek v) Object.keys(v)
+#
+#instance TypeSpec {k1: spec1, k2: spec2 ...} where
+#	match specobj v = Object.keys(specobj) == Object.keys(v) and all id [match spec v[k] | (k, spec) <- specobj]
+#	show specobj = '{' + ["#{k}: #{show spec}" for (k, spec) in specobj].join(', ') + '}'
+#	displayName {_} = Nothing
+#
+#instance TypeSpec [spec] where
+#	match [spec] v = all(match spec) v
+#	show specobj = "[#{show spec}]"
+#	displayName [_] = Nothing
+#
+#instance TypeSpec Data where
+#	match (Data {spec: spec}) v = match spec v
+#	show (Data d) v = d.name ? show d.spec
+#	displayName (Data d) = d.name
+
+# spec: {k1: spec1, k2: spec2 ...} | [spec] | Data {spec: spec, samples: [], ...}
+
+match = (specification) -> (v) ->
+	if specification.constructor isnt Maybe and not v?
+		false
+	else
+		switch specification.constructor
+			when Function
+				switch specification
+					when Boolean
+						v in [true, false]
+					when Number
+						typeof v is 'number' or v.constructor is Number
+					when String
+						v.constructor is String
+					else
+						v.constructor is specification
+			when Enum
+				v in specification.enum
+			when Maybe
+				{spec} = specification
+				not v? or match(spec) v
+			when Either
+				{specs} = specification
+				v.constructor is Object and (ks = Object.keys(v)).length is 1 and (spec = specs[ks[0]])? and match(spec) v
+			when Dict
+				{spec} = specification
+				v.constructor is Object and all(match spec) map(seek v) Object.keys(v)
+			when Strict
+				{specdict} = specification
+				v.constructor is Object and (all((k) -> specdict[k]?) Object.keys(v)) and all(([k, spec]) -> match(spec) v[k]) enumerate(specdict)
+			when Object
+				specdict = specification
+				v.constructor is Object and all(([k, spec]) -> match(spec) v[k]) enumerate(specdict)
+			when Array
+				[spec] = specification
+				v.constructor is Array and all(match spec) v
+			when Data
+				{spec} = specification
+				match(spec) v
+			when Any
+				true
+
+Name = Data
+	spec: String
+	samples: ['abc', 'a123']
+
+log -> 'abc'.constructor
+log -> 'abc'.constructor is String
+log -> match(String) 'abc'
+log -> match(Name) 'abc'
+log -> match(Name) 1
+t = Strict
+	x: Number
+	y: Maybe Number
+
+log -> match(t) {x: 1, y: 2}
+log -> match(t) {x: 1, y: 'a'}
+log -> match(t) {x: 1}
+log -> match(t) {x: 1, y: 2, z: 3}
+


block show method occurring on active view

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


fixed bug where shows said they were closing a day earlier than they actually were

--- models/partner_show.coffee
+++ models/partner_show.coffee
@@ -263,7 +263,7 @@
     diff <= soon and diff >= 0

   endingIn: ->
-    days = moment(@get('end_at')).diff(Date.new, 'days')
+    days = moment(@get('end_at')).diff(moment().startOf('day'), 'days')
     if days is 0 then 'today' else "in #{days} day#{if days is 1 then '' else 's'}"

   isOpeningToday: ->


marking a line that pygments has trouble with.

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


remove legacy debounce directive

remove legacy debounce directive

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


snapshot response time behaviour added

snapshot response time behaviour added

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


Create script to load the payments views from payment engines

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

--- app/assets/javascripts/neighborly/projects/backers/create.js.coffee
+++ app/assets/javascripts/neighborly/projects/backers/create.js.coffee
@@ -0,0 +1,32 @@
+Neighborly.Projects = {} if Neighborly.Projects is undefined
+Neighborly.Projects.Backers = {} if Neighborly.Projects.Backers is undefined
+
+Neighborly.Projects.Backers.Create =
+  init: Backbone.View.extend
+    el: '.create-backer-page'
+
+    initialize: ->
+      @payment_view = new this.Payment()
+
+    Payment: Backbone.View.extend
+      el: '.create-backer-page .payment'
+
+      initialize: ->
+        _.bindAll this, 'showContent'
+        this.$('.methods input').change this.showContent
+        this.$('.methods input:first').click()
+
+      showContent: (e)->
+        this.showTotalValue(e)
+        this.$('.payment-method').hide()
+
+        $payment = $("##{$(e.currentTarget).val()}-payment.payment-method")
+        $payment.fadeIn()
+
+        if $payment.data('path')
+          $.get($payment.data('path')).success (data) ->
+            $payment.html data
+
+      showTotalValue: (e)->
+        $input = $('.create-backer-page header .total-with-fee input')
+        $input.val("#{$input.data('total-text')} #{$(e.target).data('value-with-taxes')}")


fix (document events) Fix typo.

fix (document events) Fix typo.

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


Add handlebars require

Add handlebars require

Not required, but good practice :)

--- plugins/fogbugz/index.coffee
+++ plugins/fogbugz/index.coffee
@@ -1,4 +1,5 @@
 NotificationPlugin = require '../../notification-plugin'
+Handlebars = require 'handlebars'
 {parseString} = require 'xml2js'

 module.exports = class FogBugz extends NotificationPlugin


ReplyGif

ReplyGif

Converts links to an image on ReplyGif into an embedded image in Campfire. Also
listens for the `replygif` command and embeds the relevant ReplyGif based on
either a keyword or the ReplyGif ID.

See http://replygif.net.

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

--- src/scripts/replygif.coffee
+++ src/scripts/replygif.coffee
@@ -0,0 +1,35 @@
+# Description:
+#   Makes ReplyGif easier to use. See http://replygif.net.
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   http://replygif.net/<id> - Embeds image from ReplyGif with that id.
+#   hubot replygif <keyword> - Embeds random ReplyGif with the keyword.
+#   hubot replygif me <keyword> - Same as `hubot replygif <keyword>`.
+#
+# Notes:
+#   Thanks to What Cheer (@whatcheer) for providing the keyword lookup app.
+#
+# Author:
+#   sumeetjain
+
+module.exports = (robot) ->
+  # Listen for someone to link to a ReplyGif and reply with the image.
+  robot.hear /.*replygif\.net\/(i\/)?(\d+).*/i, (msg) ->
+    id = msg.match[2]
+    msg.send "http://replygif.net/i/#{id}#.gif"
+
+  # Listen for a command to look up a ReplyGif by ID.
+  robot.respond /replygif( me)? (\d+)/i, (msg) ->
+    id = msg.match[2]
+    msg.send "http://replygif.net/i/#{id}#.gif"
+
+  # Listen for a command to look up a ReplyGif by tag.
+  robot.respond /replygif( me)? (\D+)/i, (msg) ->
+    tag = msg.match[2]
+    msg.send "http://apps.whatcheerinc.com/replygif/#{tag}.gif"


letterFrequency module

letterFrequency module

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


intermediate commit experimenting with controller methods

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

--- app/assets/javascripts/hanuman/controllers/survey_questions.js.coffee
+++ app/assets/javascripts/hanuman/controllers/survey_questions.js.coffee
@@ -0,0 +1,14 @@
+App.SurveyQuestionsController = Ember.ArrayController.extend({
+  stepOnes: (->
+    return @.get('model').filterBy('step', 1)
+  ).property('model.@each.step')
+  stepTwos: (->
+    return @.get('model').filterBy('step', 2)
+  ).property('model.@each.step')
+  stepThrees: (->
+    return @.get('model').filterBy('step', 3)
+  ).property('model.@each.step')
+  byStep: (->
+    return @.get('model').filterBy('step', 2)
+  ).property('model.@each.step')
+})


activity: add PrivateChannelMessageLink component

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

--- client/activity/lib/components/privatechannelmessagelink/index.coffee
+++ client/activity/lib/components/privatechannelmessagelink/index.coffee
@@ -0,0 +1,37 @@
+kd        = require 'kd'
+Link      = require 'app/components/common/link'
+React     = require 'kd-react'
+immutable = require 'immutable'
+
+
+module.exports = class PrivateChannelMessageLink extends React.Component
+
+  @defaultProps = { message: immutable.Map() }
+
+
+  computeHref: ->
+
+    return '#'  if @props.message.get 'isFake'
+
+    { message } = @props
+
+    channelId = message.get 'initialChannelId'
+    channel = kd.singletons.socialapi.retrieveCachedItemById channelId
+
+    return  unless channel
+
+    id = message.get 'id'
+
+    return "/Messages/#{channel.id}/#{id}"
+
+
+  render: ->
+    <Link {...@props}
+      href={@computeHref()}
+      className={kd.utils.curry 'MessageLink PrivateChannelMessageLink', @props.className}>
+      {@props.children}
+    </Link>
+
+
+
+


extract baseline

extract baseline

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


Tests: push/pop state navigation

Tests: push/pop state navigation

error: pathspec 'tests/casperjs/navigation/pushstate.coffee' did not match any file(s) known to git

--- tests/casperjs/navigation/pushstate.coffee
+++ tests/casperjs/navigation/pushstate.coffee
@@ -0,0 +1,27 @@
+casper.start 'http://localhost:8080'
+
+content = ''
+
+casper.then ->
+	@sendKeys '#control-samples', '1000'
+	@sendKeys '#control-conversions', '200'
+	@sendKeys '#experiment-samples', '2000'
+	@sendKeys '#experiment-conversions', '300'
+
+	@wait 2000, ->
+		@test.assertUrlMatch /https?:\/\/[^\/]+\/\?cc=200&sc=1000&ce=300&se=2000&significance=0.9$/, 'Form auto-submits'
+		content = @getHTML '.results'
+
+casper.then ->
+	@sendKeys '#control-samples', '1'
+
+	@wait 2000, ->
+		@test.assertUrlMatch /https?:\/\/[^\/]+\/\?cc=200&sc=10001&ce=300&se=2000&significance=0.9$/, 'Push state on nav'
+
+casper.back()
+
+casper.then ->
+	@wait 2000, ->
+		@test.assertEquals @getHTML( '.results' ), content, 'Back nav'
+
+casper.run()


adding github recent commits fetcher

adding github recent commits fetcher

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

--- src/scripts/github-activity.coffee
+++ src/scripts/github-activity.coffee
@@ -0,0 +1,24 @@
+require('date-utils')
+
+module.exports = (robot) ->
+  robot.hear /repo show (.*)/i, (msg) ->
+    repo = msg.match[1].toLowerCase()
+    repo = "#{process.env.HUBOT_GITHUB_USER}/#{repo}" unless repo.indexOf("/") > -1
+    bot_github_user = process.env.HUBOT_BOT_GITHUB_USER
+    bot_github_pass = process.env.HUBOT_BOT_GITHUB_PASS
+    auth = new Buffer("#{bot_github_user}:#{bot_github_pass}").toString('base64')
+    url = "https://api.github.com/repos/#{repo}/commits"
+
+    msg.http(url)
+      .headers(Authorization: "Basic #{auth}", Accept: "application/json")
+      .get() (err, res, body) ->
+        if err
+          msg.send "GitHub says: #{err}"
+          return
+        commits = JSON.parse(body)
+        if commits.length == 0
+            msg.send "Achievement unlocked: [LIKE A BOSS] no commits found!"
+        else
+          for c in commits
+            d = new Date(Date.parse(c.commit.committer.date)).toFormat("DD/MM HH24:MI")
+            msg.send "[#{d} -> #{c.commit.committer.name}] #{c.commit.message}"


Clear spotlight on open and do not show current room

--- packages/rocketchat-ui/views/app/spotlight/spotlight.coffee
+++ packages/rocketchat-ui/views/app/spotlight/spotlight.coffee
@@ -3,6 +3,7 @@
 		$('.spotlight').addClass('hidden')

 	show: ->
+		$('.spotlight input').val('')
 		$('.spotlight').removeClass('hidden')
 		$('.spotlight input').focus()

@@ -22,7 +23,7 @@
 			getFilter: (collection, filter) ->
 				exp = new RegExp("#{RegExp.escape filter}", 'i')

-				return collection.find({name: exp}, {limit: 10, sort: {unread: -1, ls: -1}}).fetch()
+				return collection.find({name: exp, rid: {$ne: Session.get('openedRoom')}}, {limit: 10, sort: {unread: -1, ls: -1}}).fetch()

 			getValue: (_id, collection, firstPartValue) ->
 				doc = collection.findOne(_id)


Test for route metadata

Test for route metadata

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


Fix indentation

Fix indentation

--- spec/project-spec.coffee
+++ spec/project-spec.coffee
@@ -245,10 +245,10 @@
           expect(results[0].filePath).toBe project.resolve('a')
           expect(results[0].matches).toHaveLength(3)
           expect(results[0].matches[0]).toEqual
-              matchText: 'aaa'
-              lineText: 'aaa bbb'
-              lineTextOffset: 0
-              range: [[0, 0], [0, 3]]
+            matchText: 'aaa'
+            lineText: 'aaa bbb'
+            lineTextOffset: 0
+            range: [[0, 0], [0, 3]]

       it "works with with escaped literals (like $ and ^)", ->
         results = []


[driver] add a buncha switches

[driver] add a buncha switches

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


add computeprovider test helper

add computeprovider test helper

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


Reset Hydrogen settings

Reset Hydrogen settings

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


Unfuckup

Unfuckup

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


Removed the testing code for the PlayItemsModal.

--- app/views/HomeView.coffee
+++ app/views/HomeView.coffee
@@ -3,8 +3,6 @@
 WizardLank = require 'lib/surface/WizardLank'
 ThangType = require 'models/ThangType'
 Simulator = require 'lib/simulator/Simulator'
-
-PlayItemsModal = require 'views/play/modal/PlayItemsModal' # TEST

 {me} = require '/lib/auth'

@@ -37,8 +35,3 @@
     e.stopImmediatePropagation()
     window.tracker?.trackEvent 'Homepage', Action: 'Play'
     window.open '/play', '_blank'
-
-  # TEST
-  afterInsert: ->
-    super()
-    @openModalView new PlayItemsModal()


Fix docs

Fix docs

--- src/theme-manager.coffee
+++ src/theme-manager.coffee
@@ -58,14 +58,14 @@
   # Essential: Invoke `callback` when a stylesheet has been added to the dom.
   #
   # * `callback` {Function}
-  #   * `stylesheet` {HTMLElement} the style node
+  #   * `stylesheet` {StyleSheet} the style node
   onDidAddStylesheet: (callback) ->
     @emitter.on 'did-add-stylesheet', callback

   # Essential: Invoke `callback` when a stylesheet has been removed from the dom.
   #
   # * `callback` {Function}
-  #   * `stylesheet` {HTMLElement} the style node
+  #   * `stylesheet` {StyleSheet} the style node
   onDidRemoveStylesheet: (callback) ->
     @emitter.on 'did-remove-stylesheet', callback


minor: removed comment

minor: removed comment

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


Some fixes to previous merge

Some fixes to previous merge

--- app/locale/es-419.coffee
+++ app/locale/es-419.coffee
@@ -635,13 +635,13 @@
 #    how_much_6: "for more details."
 #    more_info_title: "Where can I find more information?"
 #    more_info_1: "Our"
-   more_info_2: "el foro de profesores"
+    more_info_2: "el foro de profesores"
     more_info_3: "es un buen lugar para connectarse con los educadores que estan usando CodeCombat."
     sys_requirements_title: "Requerimientos del sistema"
     sys_requirements_1: "Debido que CodeCombat es un juego, es más difícil para las computadoras correrlo en relación a un tutorial escrito o un video. Para que todos puedan jugar, hemos optimizado la web para correr rápidamente en todos los navegadores modernos y en maquinas antiguas. Dicho esto, aquí están nuestras sugerencias para sacar el máximo provecho de su experiencia en la Hora del Código:" # {change}
     sys_requirements_2: "Usar una versión actualizada del navegador Chrome o Firefox." # {change}

-#  teachers_survey:
+  teachers_survey:
 #    title: "Teacher Survey"
 #    must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
 #    retrieving: "Retrieving information..."
@@ -781,7 +781,7 @@
     social_hipchat: "Chatea con nosotros en el chat público de CodeCombat en la sala HipChat"
     contribute_to_the_project: "Contribuir al proyecto"

-#  clans:
+  clans:
     clan: "Clan"
     clans: "Clanes"
     new_name: "Nuevo nombre de clan"


:lipstick:

:lipstick:

--- src/packages/fuzzy-finder/index.coffee
+++ src/packages/fuzzy-finder/index.coffee
@@ -21,7 +21,7 @@
   onLoadEvent: (event, instance) ->
     if @projectPaths? and not @instance.projectPaths?
       @instance.projectPaths = @projectPaths
-      @instance.reloadProjectPaths = false;
+      @instance.reloadProjectPaths = false

     switch event.type
       when 'fuzzy-finder:toggle-file-finder'


JProvisioner: initial commit for provisioner model which supports similar features of JCredential

error: pathspec 'workers/social/lib/social/models/computeproviders/provisioner.coffee' did not match any file(s) known to git

--- workers/social/lib/social/models/computeproviders/provisioner.coffee
+++ workers/social/lib/social/models/computeproviders/provisioner.coffee
@@ -0,0 +1,328 @@
+
+jraphical       = require 'jraphical'
+JName           = require '../name'
+JUser           = require '../user'
+JGroup          = require '../group'
+
+module.exports = class JProvisioner extends jraphical.Module
+
+  KodingError        = require '../../error'
+
+  {secure, ObjectId, signature, daisy} = require 'bongo'
+  {Relationship}     = jraphical
+  {permit}           = require '../group/permissionset'
+  Validators         = require '../group/validators'
+
+  @trait __dirname, '../../traits/protected'
+
+  @share()
+
+  @set
+
+    softDelete        : yes
+
+    permissions       :
+      'create provisioner' : ['member']
+      'update provisioner' : ['member']
+      'list provisioners'  : ['member']
+      'delete provisioner' : ['member']
+
+    sharedMethods     :
+      static          :
+        one           :
+          (signature String, Function)
+        create        :
+          (signature Object, Function)
+        some          : [
+          (signature Object, Function)
+          (signature Object, Object, Function)
+        ]
+      instance        :
+        delete        :
+          (signature Function)
+        shareWith     :
+          (signature Object, Function)
+        fetchUsers    :
+          (signature Function)
+        fetchData     :
+          (signature Function)
+        update        :
+          (signature Object, Function)
+
+    sharedEvents      :
+      static          : [ ]
+      instance        : [
+        { name : 'updateInstance' }
+      ]
+
+    indexes           :
+      slug            : 'unique'
+
+    schema            :
+
+      slug            :
+        type          : String
+        required      : yes
+
+      label           : String
+
+      type            :
+        type          : String
+        enum          : ["Wrong type specified!", [
+
+          # Provisioner types which supported by packer.io and kloud
+          #
+          "shell"     # Shell script
+
+        ]]
+
+        default       : -> "shell"
+
+      content         :
+        type          : Object
+        default       : -> { }
+
+      meta            : require 'bongo/bundles/meta'
+
+
+  checkContent = (type, content)->
+
+    if not type?
+      err = "Type missing."
+    else if not content?
+      err = "Content missing."
+    else
+      switch type
+        when "shell"
+          unless content.script?
+          then err = "Type 'shell' requires a 'script'"
+          else content = { script: content.script }
+        else
+          err = "Type is not supported for now."
+
+    err = new KodingError err  if err?
+    return [err, content]
+
+
+  fetchUsers: permit
+
+    advanced: [
+      { permission: 'update provisioner', validateWith: Validators.own }
+    ]
+
+    success: (client, callback)->
+
+      Relationship.someData targetId : @getId(), {
+        as:1, sourceId:1, sourceName:1
+      }, (err, cursor)->
+
+        return callback err  if err?
+
+        cursor.toArray (err, arr)->
+          return callback err  if err?
+
+          if arr.length > 0
+            callback null, ({
+              constructorName : u.sourceName
+              _id : u.sourceId
+              as  : u.as
+            } for u in arr)
+          else
+            callback null, []
+
+
+  @create = permit 'create provisioner',
+
+    success: (client, data, callback)->
+
+      {delegate} = client.connection
+      {content, type, label} = data
+
+      [err, content] = checkContent type, content
+      if err? then return callback err
+
+      slug = "#{delegate.profile.nickname}-#{(require 'hat')(32)}"
+
+      provisioner = new JProvisioner {
+        slug, label, content, type
+      }
+
+      provisioner.save (err)->
+
+        return callback err  if err
+
+        delegate.addProvisioner provisioner, as: "owner", (err)->
+
+          if err
+            provisioner.remove?()
+            callback err
+          else
+            callback null, provisioner
+
+
+  @fetchBySlug = (client, slug, callback)->
+
+    options =
+      limit         : 1
+      targetOptions : selector : { slug }
+
+    {delegate} = client.connection
+    delegate.fetchProvisioner { }, options, (err, res)->
+
+      return callback err        if err?
+      return callback null, res  if res?
+
+      { group } = client.context
+      JGroup.one slug: group, (err, group)->
+        return callback err  if err?
+
+        group.fetchProvisioner { }, options, (err, res)->
+          callback err, res
+
+
+  @one$: permit 'list provisioners',
+
+    success: (client, slug, callback)->
+
+      @fetchBySlug client, slug, callback
+
+
+  @some$: permit 'list provisioners',
+
+    success: (client, selector, options, callback)->
+
+      [options, callback] = [callback, options]  unless callback
+      options ?= {}
+
+      { delegate } = client.connection
+      provisioners  = []
+
+      relSelector  =
+        targetName : "JProvisioner"
+        sourceId   : delegate.getId()
+
+      if selector.as? and selector.as in ['owner', 'user']
+        relSelector.as = selector.as
+        delete selector.as
+
+      Relationship.someData relSelector, { targetId:1, as:1 }, (err, cursor)->
+
+        return callback err  if err?
+
+        cursor.toArray (err, arr)->
+
+          map = arr.reduce (memo, doc)->
+            memo[doc.targetId] = doc.as
+            memo
+          , {}
+
+          selector    ?= {}
+          selector._id = $in: (t.targetId for t in arr)
+
+          JProvisioner.some selector, options, (err, provisioners)->
+            return callback err  if err?
+
+            for provisioner in provisioners
+              provisioner.owner = yes  if map[provisioner._id] is 'owner'
+
+            callback null, provisioners
+
+
+  # .share can be used like this:
+  #
+  # JProvisionerInstance.share { user: yes, owner: no, target: "gokmen"}, cb
+  #                                       group or user slug -> ^^^^^^
+
+  shareWith: permit
+
+    advanced: [
+      { permission: 'update credential', validateWith: Validators.own }
+    ]
+
+    success: (client, options, callback)->
+
+      { delegate } = client.connection
+      { target, user, owner } = options
+      user ?= yes
+
+      # Owners cannot unassign them from a credential
+      # Only another owner can unassign any other owner
+      if delegate.profile.nickname is target
+        return callback null
+
+      setPermissionFor = (target, callback)=>
+
+        Relationship.remove {
+          targetId : @getId()
+          sourceId : target.getId()
+        }, (err)=>
+
+          if user
+            as = if owner then 'owner' else 'user'
+            target.addProvisioner this, { as }, (err)-> callback err
+          else
+            callback err
+
+      JName.fetchModels target, (err, result)=>
+
+        if err or not result
+          return callback new KodingError "Target not found."
+
+        { models } = result
+        [ target ] = models
+
+        if target instanceof JUser
+          target.fetchOwnAccount (err, account)=>
+            if err or not account
+              return callback new KodingError "Failed to fetch account."
+            setPermissionFor account, callback
+
+        else if target instanceof JGroup
+          setPermissionFor target, callback
+
+        else
+          callback new KodingError "Target does not support provisioners."
+
+
+  delete: permit 'delete provisioner',
+
+    success: (client, callback)->
+
+      { delegate } = client.connection
+
+      Relationship.one
+        targetId : @getId()
+        sourceId : delegate.getId()
+      , (err, rel)->
+
+        return callback err   if err?
+        return callback null  unless rel?
+        rel.remove callback
+
+
+  update$: permit
+
+    advanced: [
+      { permission: 'update provisioner', validateWith: Validators.own }
+    ]
+
+    success: (client, options, callback)->
+
+      {content, label} = options
+
+      if content?
+        [err, content] = checkContent type, content
+        if err? then return callback err
+
+      unless content or label
+        return callback new KodingError "Nothing to update"
+
+      fieldsToUpdate =
+        label             : label ? @label
+        'meta.modifiedAt' : new Date
+
+      fieldsToUpdate.content = content  if content?
+
+      @update $set : fieldsToUpdate, (err)->
+        return callback err  if err?
+        callback null


change unknown timezones to UTC when extracting events

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


New namespace for URL specs

New namespace for URL specs

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

--- spec/7_url.coffee
+++ spec/7_url.coffee
@@ -0,0 +1 @@
+describe "Url", ->


Clint: Activity: Deleted unnecessary line

--- client/activity/lib/components/browseprivatechannelsmodal/test.coffee
+++ client/activity/lib/components/browseprivatechannelsmodal/test.coffee
@@ -5,7 +5,6 @@
 ModalView          = require './view'
 ReactDOM           = require 'react-dom'
 TestUtils          = require 'react-addons-test-utils'
-mock               = require '../../../../mocks/mockingjay'
 toImmutable        = require 'app/util/toImmutable'
 expectCorrectRoute = require 'activity/test/helpers/expectCorrectRoute'


home: minor regex fix

home: minor regex fix


vmdetailsview: make RAM Usage view better, about asana task #6623441442867


responsive table sticky header correction

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


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

--- src/scripts/emoji.coffee
+++ src/scripts/emoji.coffee
@@ -0,0 +1,957 @@
+# Description:
+#   emoji.coffee - Replaces :text: or text with emojis.
+#   Great for IRC or anywhere not already emojified.
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   "put a bird on it" - Prints "put a 🐦  on it" in moreEmoji mode.
+#   "put a :bird: on it" - Prints "put a 🐦  on it" in lessEmoji mode.
+#   hubot list emojis - Print a list of available emojis
+#   hubot more emojis - (default) Try to substitute all words - no :colons: required.
+#   hubot less emojis - Require :colons: to substitute emojis.
+#
+# Notes:
+#   Emoji/unicode pairing data from https://github.com/github/gemoji
+#
+# Author:
+#   dzello
+
+# don't require surrounding in :colons: for substitution
+moreEmoji = true
+
+module.exports = (robot) ->
+  robot.hear /.+/, (msg) ->
+    if textWithEmoji = substituteEmoji(msg.message.text)
+      msg.send(textWithEmoji)
+
+  robot.respond /more emojis/, (msg) ->
+    moreEmoji = true
+
+  robot.respond /less emojis/, (msg) ->
+    moreEmoji = false
+
+  robot.respond /list emojis/, (msg) ->
+    buf = ""
+    for symbol, hexCode of emojis
+      buf += "#{toEmoji(hexCode)}   #{symbol}\n"
+    msg.send buf
+
+substituteEmoji = (text) ->
+  ct = 0
+  re = if moreEmoji then /([a-zA-Z0-9_:]{3,})/g else /:([a-zA-Z0-9_]+):/g
+  text = text.replace re, (match, key) ->
+    if emoji = emojis[key.toLowerCase().replace(/:/g, '')]
+      ct++
+      toEmoji(emoji) + " "
+    else
+      key
+  text if ct > 0
+
+toEmoji = (hexCode) ->
+  fromFullCharCode(parseInt(hexCode, 16))
+
+fromFullCharCode = (args...) ->
+  chars= []
+  for n in args
+    if (n < 0x10000)
+      chars.push(String.fromCharCode(n));
+    else
+      high = Math.floor((n - 0x10000) / 0x400) + 0xD800
+      low = (n - 0x10000) % 0x400 + 0xDC00
+      chars.push(String.fromCharCode(high, low))
+
+  chars.join('')
+
+# Temporary - leaving in pre-scraped values for now and not calling this method until
+# there's a more efficient way to do it - see https://github.com/juliamae/definitive-guide-to-emoji/issues/1
+# NOTE: requires jsdom as a dependency
+# jsdom = require 'jsdom'
+# scrapeEmojis = ->
+#   emojis = {}
+#   jsdom.env "https://github.com/github/gemoji/tree/master/images/emoji", \
+#   [ 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js' ], (errors, window) ->
+#     (($) ->
+#       $(".tree-entries td.content").each (entry) ->
+#         key = $(this).text().replace(/\.png/, '')
+#         robot.http("https://raw.github.com/github/gemoji/master/images/emoji/#{key}.png").get() (err, res, body) ->
+#           contentLength = res.headers["content-length"]
+#           unless contentLength > 17
+#             if /unicode/.test(body)
+#               if match = body.match(/unicode\/([a-z0-9\+\-_]+)\.png/)
+#                 emojis[key] = match[1]
+#
+#       )(window.jQuery)
+
+`emojis = {
+  '100': '1f4af',
+  '1234': '1f522',
+  haircut: '1f487',
+  house: '1f3e0',
+  ideograph_advantage: '1f250',
+  house_with_garden: '1f3e1',
+  incoming_envelope: '1f4e8',
+  japan: '1f5fe',
+  information_source: '2139',
+  it: '1f1ee',
+  inbox_tray: '1f4e5',
+  pisces: '2653',
+  loudspeaker: '1f4e2',
+  loop: '27bf',
+  lips: '1f444',
+  libra: '264e',
+  leaves: '1f343',
+  large_blue_diamond: '1f537',
+  man: '1f468',
+  laughing: '1f606',
+  light_rail: '1f688',
+  police_car: '1f693',
+  mountain_railway: '1f69e',
+  mailbox_closed: '1f4ea',
+  musical_note: '1f3b5',
+  left_right_arrow: '2194',
+  link: '1f517',
+  leo: '264c',
+  last_quarter_moon_with_face: '1f31c',
+  love_hotel: '1f3e9',
+  lipstick: '1f484',
+  leftwards_arrow_with_hook: '21a9',
+  ledger: '1f4d2',
+  japanese_goblin: '1f47a',
+  left_luggage: '1f6c5',
+  japanese_ogre: '1f479',
+  information_desk_person: '1f481',
+  large_orange_diamond: '1f536',
+  koala: '1f428',
+  kissing_cat: '1f63d',
+  large_blue_circle: '1f535',
+  koko: '1f201',
+  jp: '1f1ef',
+  joy: '1f602',
+  last_quarter_moon: '1f317',
+  lantern: '1f3ee',
+  kr: '1f1f0',
+  interrobang: '2049',
+  jack_o_lantern: '1f383',
+  imp: '1f47f',
+  izakaya_lantern: '1f3ee',
+  japanese_castle: '1f3ef',
+  joy_cat: '1f639',
+  key: '1f511',
+  kiss: '1f48b',
+  kissing_smiling_eyes: '1f619',
+  kissing_closed_eyes: '1f61a',
+  kimono: '1f458',
+  jeans: '1f456',
+  icecream: '1f366',
+  iphone: '1f4f1',
+  kissing: '1f617',
+  id: '1f194',
+  innocent: '1f607',
+  hushed: '1f62f',
+  ice_cream: '1f368',
+  hourglass_flowing_sand: '23f3',
+  hourglass: '231b',
+  no_entry: '26d4',
+  lock: '1f512',
+  memo: '1f4dd',
+  muscle: '1f4aa',
+  lock_with_ink_pen: '1f50f',
+  lemon: '1f34b',
+  keycap_ten: '1f51f',
+  microphone: '1f3a4',
+  no_mobile_phones: '1f4f5',
+  mouse2: '1f401',
+  kissing_heart: '1f618',
+  man_with_gua_pi_mao: '1f472',
+  microscope: '1f52c',
+  point_down: '1f447',
+  pizza: '1f355',
+  pouch: '1f45d',
+  pound: '1f4b7',
+  potable_water: '1f6b0',
+  no_mouth: '1f636',
+  postbox: '1f4ee',
+  poultry_leg: '1f357',
+  point_right: '1f449',
+  post_office: '1f3e3',
+  point_left: '1f448',
+  point_up_2: '1f446',
+  poodle: '1f429',
+  pray: '1f64f',
+  no_pedestrians: '1f6b7',
+  moyai: '1f5ff',
+  point_up: '261d',
+  monkey: '1f412',
+  postal_horn: '1f4ef',
+  no_entry_sign: '1f6ab',
+  newspaper: '1f4f0',
+  poop: '1f4a9',
+  pouting_cat: '1f63e',
+  princess: '1f478',
+  nine: '0039',
+  neutral_face: '1f610',
+  no_bell: '1f515',
+  ng: '1f196',
+  metro: '1f687',
+  necktie: '1f454',
+  new: '1f195',
+  mute: '1f507',
+  no_good: '1f645',
+  new_moon_with_face: '1f31a',
+  nail_care: '1f485',
+  low_brightness: '1f505',
+  couplekiss: '1f48f',
+  copyright: '00a9',
+  couple: '1f46b',
+  couple_with_heart: '1f491',
+  cookie: '1f36a',
+  construction: '1f6a7',
+  cool: '1f192',
+  cherry_blossom: '1f338',
+  clock4: '1f553',
+  corn: '1f33d',
+  credit_card: '1f4b3',
+  clock1030: '1f565',
+  church: '26ea',
+  cop: '1f46e',
+  convenience_store: '1f3ea',
+  cow: '1f42e',
+  clapper: '1f3ac',
+  clock1130: '1f566',
+  clock12: '1f55b',
+  card_index: '1f4c7',
+  cat: '1f431',
+  bomb: '1f4a3',
+  car: '1f697',
+  cancer: '264b',
+  capricorn: '2651',
+  blush: '1f60a',
+  candy: '1f36c',
+  boom: '1f4a5',
+  capital_abcd: '1f520',
+  clock930: '1f564',
+  bride_with_veil: '1f470',
+  book: '1f4d6',
+  bookmark_tabs: '1f4d1',
+  blue_book: '1f4d8',
+  carousel_horse: '1f3a0',
+  bust_in_silhouette: '1f464',
+  boat: '26f5',
+  blowfish: '1f421',
+  bookmark: '1f516',
+  books: '1f4da',
+  black_small_square: '25aa',
+  boar: '1f417',
+  blue_heart: '1f499',
+  boot: '1f462',
+  santa: '1f385',
+  saxophone: '1f3b7',
+  scream: '1f631',
+  minidisc: '1f4bd',
+  school_satchel: '1f392',
+  scorpius: '264f',
+  blue_car: '1f699',
+  scissors: '2702',
+  satisfied: '1f606',
+  sandal: '1f461',
+  black_square_button: '1f532',
+  school: '1f3eb',
+  hamster: '1f439',
+  satellite: '1f4e1',
+  sake: '1f376',
+  sa: '1f202',
+  busstop: '1f68f',
+  sailboat: '26f5',
+  running_shirt_with_sash: '1f3bd',
+  bulb: '1f4a1',
+  sagittarius: '2650',
+  mushroom: '1f344',
+  massage: '1f486',
+  mailbox_with_mail: '1f4ec',
+  m: '24c2',
+  maple_leaf: '1f341',
+  mailbox_with_no_mail: '1f4ed',
+  mask: '1f637',
+  mega: '1f4e3',
+  basketball: '1f3c0',
+  arrow_up: '2b06',
+  abcd: '1f521',
+  '+1': '1f44d',
+  alien: '1f47d',
+  ant: '1f41c',
+  anguished: '1f627',
+  sheep: '1f411',
+  a: '1f170',
+  sos: '1f198',
+  '8ball': '1f3b1',
+  office: '1f3e2',
+  older_man: '1f474',
+  seat: '1f4ba',
+  smirk_cat: '1f63c',
+  tiger: '1f42f',
+  vhs: '1f4fc',
+  surfer: '1f3c4',
+  ok_hand: '1f44c',
+  'non-potable_water': '1f6b1',
+  older_woman: '1f475',
+  ok: '1f197',
+  octopus: '1f419',
+  mountain_cableway: '1f6a0',
+  unlock: '1f513',
+  nose: '1f443',
+  mount_fuji: '1f5fb',
+  notebook_with_decorative_cover: '1f4d4',
+  ok_woman: '1f646',
+  notes: '1f3b6',
+  nut_and_bolt: '1f529',
+  ocean: '1f30a',
+  o: '2b55',
+  new_moon: '1f311',
+  mountain_bicyclist: '1f6b5',
+  notebook: '1f4d3',
+  mag: '1f50d',
+  no_bicycles: '1f6b3',
+  train2: '1f686',
+  smile: '1f604',
+  shirt: '1f455',
+  speak_no_evil: '1f64a',
+  vertical_traffic_light: '1f6a6',
+  shit: '1f4a9',
+  musical_keyboard: '1f3b9',
+  ambulance: '1f691',
+  tv: '1f4fa',
+  battery: '1f50b',
+  lollipop: '1f36d',
+  mouse: '1f42d',
+  movie_camera: '1f3a5',
+  bamboo: '1f38d',
+  cold_sweat: '1f630',
+  mens: '1f6b9',
+  station: '1f689',
+  sound: '1f509',
+  first_quarter_moon: '1f313',
+  elephant: '1f418',
+  doughnut: '1f369',
+  door: '1f6aa',
+  earth_asia: '1f30f',
+  fire: '1f525',
+  cloud: '2601',
+  ear: '1f442',
+  eight_pointed_black_star: '2734',
+  dizzy: '1f4ab',
+  crocodile: '1f40a',
+  mailbox: '1f4eb',
+  feet: '1f43e',
+  heart_eyes: '1f60d',
+  currency_exchange: '1f4b1',
+  facepunch: '1f44a',
+  hankey: '1f4a9',
+  minibus: '1f690',
+  ferris_wheel: '1f3a1',
+  fireworks: '1f386',
+  crossed_flags: '1f38c',
+  department_store: '1f3ec',
+  heavy_check_mark: '2714',
+  fountain: '26f2',
+  flushed: '1f633',
+  fork_and_knife: '1f374',
+  waxing_gibbous_moon: '1f314',
+  dragon_face: '1f432',
+  x: '274c',
+  white_circle: '26aa',
+  sparkler: '1f387',
+  white_medium_small_square: '25fd',
+  white_check_mark: '2705',
+  uk: '1f1ec',
+  v: '270c',
+  sunflower: '1f33b',
+  white_large_square: '2b1c',
+  tent: '26fa',
+  triangular_flag_on_post: '1f6a9',
+  telephone_receiver: '1f4de',
+  tram: '1f68a',
+  whale: '1f433',
+  triumph: '1f624',
+  weary: '1f629',
+  hash: '0023',
+  speech_balloon: '1f4ac',
+  sparkling_heart: '1f496',
+  stars: '1f303',
+  speaker: '1f50a',
+  snowflake: '2744',
+  sunglasses: '1f60e',
+  speedboat: '1f6a4',
+  snake: '1f40d',
+  earth_americas: '1f30e',
+  smile_cat: '1f638',
+  star2: '1f31f',
+  small_orange_diamond: '1f538',
+  smoking: '1f6ac',
+  spaghetti: '1f35d',
+  sleepy: '1f62a',
+  star: '2b50',
+  smiley: '1f603',
+  small_red_triangle_down: '1f53b',
+  snowman: '26c4',
+  small_blue_diamond: '1f539',
+  pig: '1f437',
+  rice: '1f35a',
+  smiley_cat: '1f63a',
+  snowboarder: '1f3c2',
+  heavy_dollar_sign: '1f4b2',
+  smirk: '1f60f',
+  rugby_football: '1f3c9',
+  smiling_imp: '1f608',
+  rowboat: '1f6a3',
+  shower: '1f6bf',
+  slot_machine: '1f3b0',
+  shell: '1f41a',
+  hear_no_evil: '1f649',
+  pensive: '1f614',
+  hibiscus: '1f33a',
+  person_frowning: '1f64d',
+  raising_hand: '1f64b',
+  rabbit2: '1f407',
+  snail: '1f40c',
+  ramen: '1f35c',
+  radio: '1f4fb',
+  deciduous_tree: '1f333',
+  diamond_shape_with_a_dot_inside: '1f4a0',
+  first_quarter_moon_with_face: '1f31b',
+  dog: '1f436',
+  eggplant: '1f346',
+  shoe: '1f45e',
+  customs: '1f6c3',
+  pill: '1f48a',
+  'e-mail': '1f4e7',
+  dolphin: '1f42c',
+  disappointed_relieved: '1f625',
+  dizzy_face: '1f635',
+  curly_loop: '27b0',
+  crying_cat_face: '1f63f',
+  milky_way: '1f30c',
+  small_red_triangle: '1f53a',
+  coffee: '2615',
+  flashlight: '1f526',
+  eight_spoked_asterisk: '2733',
+  heart_decoration: '1f49f',
+  open_mouth: '1f62e',
+  curry: '1f35b',
+  passport_control: '1f6c2',
+  cupid: '1f498',
+  high_heel: '1f460',
+  heavy_exclamation_mark: '2757',
+  gun: '1f52b',
+  fries: '1f35f',
+  melon: '1f348',
+  euro: '1f4b6',
+  meat_on_bone: '1f356',
+  fish_cake: '1f365',
+  gem: '1f48e',
+  mahjong: '1f004',
+  dog2: '1f415',
+  egg: '1f373',
+  date: '1f4c5',
+  girl: '1f467',
+  free: '1f193',
+  ear_of_rice: '1f33e',
+  full_moon: '1f315',
+  man_with_turban: '1f473',
+  european_castle: '1f3f0',
+  five: '0035',
+  fax: '1f4e0',
+  crown: '1f451',
+  diamonds: '2666',
+  fist: '270a',
+  cn: '1f1e8',
+  flags: '1f38f',
+  grin: '1f601',
+  exclamation: '2757',
+  green_book: '1f4d7',
+  fishing_pole_and_fish: '1f3a3',
+  cocktail: '1f378',
+  factory: '1f3ed',
+  frowning: '1f626',
+  fr: '1f1eb',
+  envelope_with_arrow: '1f4e9',
+  handbag: '1f45c',
+  foggy: '1f301',
+  floppy_disk: '1f4be',
+  beer: '1f37a',
+  footprints: '1f463',
+  globe_with_meridians: '1f310',
+  mans_shoe: '1f45e',
+  dango: '1f361',
+  dancer: '1f483',
+  gift_heart: '1f49d',
+  dromedary_camel: '1f42a',
+  clock330: '1f55e',
+  clock3: '1f552',
+  construction_worker: '1f477',
+  cow2: '1f404',
+  email: '2709',
+  fast_forward: '23e9',
+  file_folder: '1f4c1',
+  collision: '1f4a5',
+  clock230: '1f55d',
+  horse_racing: '1f3c7',
+  fish: '1f41f',
+  clock2: '1f551',
+  confetti_ball: '1f38a',
+  heavy_division_sign: '2797',
+  u6709: '1f236',
+  full_moon_with_face: '1f31d',
+  european_post_office: '1f3e4',
+  ski: '1f3bf',
+  congratulations: '3297',
+  football: '1f3c8',
+  four_leaf_clover: '1f340',
+  negative_squared_cross_mark: '274e',
+  confounded: '1f616',
+  money_with_wings: '1f4b8',
+  honey_pot: '1f36f',
+  closed_umbrella: '1f302',
+  computer: '1f4bb',
+  hearts: '2665',
+  dart: '1f3af',
+  heart_eyes_cat: '1f63b',
+  love_letter: '1f48c',
+  racehorse: '1f40e',
+  helicopter: '1f681',
+  honeybee: '1f41d',
+  railway_car: '1f683',
+  musical_score: '1f3bc',
+  fire_engine: '1f692',
+  heavy_multiplication_x: '2716',
+  heartpulse: '1f497',
+  hotsprings: '2668',
+  headphones: '1f3a7',
+  family: '1f46a',
+  end: '1f51a',
+  dragon: '1f409',
+  evergreen_tree: '1f332',
+  hocho: '1f52a',
+  high_brightness: '1f506',
+  ship: '1f6a2',
+  horse: '1f434',
+  see_no_evil: '1f648',
+  es: '1f1ea',
+  ru: '1f1f7',
+  runner: '1f3c3',
+  goat: '1f410',
+  o2: '1f17e',
+  scroll: '1f4dc',
+  running: '1f3c3',
+  punch: '1f44a',
+  secret: '3299',
+  question: '2753',
+  persevere: '1f623',
+  frog: '1f438',
+  four: '0034',
+  gift: '1f381',
+  gemini: '264a',
+  dancers: '1f46f',
+  relaxed: '263a',
+  repeat: '1f501',
+  red_circle: '1f534',
+  phone: '260e',
+  rocket: '1f680',
+  purple_heart: '1f49c',
+  rose: '1f339',
+  fuelpump: '26fd',
+  person_with_pouting_face: '1f64e',
+  red_car: '1f697',
+  rewind: '23ea',
+  rice_ball: '1f359',
+  disappointed: '1f61e',
+  rooster: '1f413',
+  restroom: '1f6bb',
+  registered: '00ae',
+  relieved: '1f60c',
+  recycle: '267b',
+  rotating_light: '1f6a8',
+  rainbow: '1f308',
+  rice_cracker: '1f358',
+  pear: '1f350',
+  ring: '1f48d',
+  rat: '1f400',
+  eyeglasses: '1f453',
+  gb: '1f1ec',
+  pencil: '1f4dd',
+  fried_shrimp: '1f364',
+  revolving_hearts: '1f49e',
+  pencil2: '270f',
+  partly_sunny: '26c5',
+  outbox_tray: '1f4e4',
+  page_with_curl: '1f4c3',
+  part_alternation_mark: '303d',
+  peach: '1f351',
+  rice_scene: '1f391',
+  roller_coaster: '1f3a2',
+  oncoming_police_car: '1f694',
+  paperclip: '1f4ce',
+  open_file_folder: '1f4c2',
+  page_facing_up: '1f4c4',
+  paw_prints: '1f43e',
+  palm_tree: '1f334',
+  ox: '1f402',
+  package: '1f4e6',
+  one: '0031',
+  open_book: '1f4d6',
+  oncoming_taxi: '1f696',
+  mortar_board: '1f393',
+  on: '1f51b',
+  ophiuchus: '26ce',
+  moneybag: '1f4b0',
+  orange_book: '1f4d9',
+  open_hands: '1f450',
+  mobile_phone_off: '1f4f4',
+  monkey_face: '1f435',
+  monorail: '1f69d',
+  oden: '1f362',
+  oncoming_automobile: '1f698',
+  cyclone: '1f300',
+  panda_face: '1f43c',
+  oncoming_bus: '1f68d',
+  moon: '1f314',
+  fearful: '1f628',
+  eyes: '1f440',
+  person_with_blond_hair: '1f471',
+  leopard: '1f406',
+  ram: '1f40f',
+  penguin: '1f427',
+  repeat_one: '1f502',
+  parking: '1f17f',
+  pager: '1f4df',
+  pig2: '1f416',
+  rabbit: '1f430',
+  envelope: '2709',
+  pig_nose: '1f43d',
+  closed_lock_with_key: '1f510',
+  ghost: '1f47b',
+  confused: '1f615',
+  closed_book: '1f4d5',
+  clock830: '1f563',
+  dollar: '1f4b5',
+  ribbon: '1f380',
+  clock530: '1f560',
+  clock8: '1f557',
+  clock430: '1f55f',
+  clock11: '1f55a',
+  city_sunrise: '1f307',
+  clock6: '1f555',
+  circus_tent: '1f3aa',
+  clock7: '1f556',
+  cl: '1f191',
+  chocolate_bar: '1f36b',
+  clock1: '1f550',
+  name_badge: '1f4db',
+  clock630: '1f561',
+  clock10: '1f559',
+  cd: '1f4bf',
+  clock9: '1f558',
+  clipboard: '1f4cb',
+  clock1230: '1f567',
+  chart_with_downwards_trend: '1f4c9',
+  chart: '1f4b9',
+  clock730: '1f562',
+  chicken: '1f414',
+  performing_arts: '1f3ad',
+  city_sunset: '1f306',
+  christmas_tree: '1f384',
+  cherries: '1f352',
+  camel: '1f42b',
+  cat2: '1f408',
+  cactus: '1f335',
+  bug: '1f41b',
+  cake: '1f370',
+  bullettrain_side: '1f684',
+  calendar: '1f4c6',
+  checkered_flag: '1f3c1',
+  bus: '1f68c',
+  broken_heart: '1f494',
+  busts_in_silhouette: '1f465',
+  bullettrain_front: '1f685',
+  chestnut: '1f330',
+  calling: '1f4f2',
+  bread: '1f35e',
+  bridge_at_night: '1f309',
+  briefcase: '1f4bc',
+  bouquet: '1f490',
+  bowling: '1f3b3',
+  bow: '1f647',
+  droplet: '1f4a7',
+  blossom: '1f33c',
+  clap: '1f44f',
+  clock130: '1f55c',
+  cinema: '1f3a6',
+  clubs: '2663',
+  clock5: '1f554',
+  children_crossing: '1f6b8',
+  boy: '1f466',
+  camera: '1f4f7',
+  bento: '1f371',
+  black_large_square: '2b1b',
+  black_nib: '2712',
+  birthday: '1f382',
+  black_medium_small_square: '25fe',
+  bird: '1f426',
+  black_joker: '1f0cf',
+  bicyclist: '1f6b4',
+  black_circle: '26ab',
+  beetle: '1f41e',
+  bikini: '1f459',
+  no_smoking: '1f6ad',
+  bike: '1f6b2',
+  black_medium_square: '25fc',
+  bell: '1f514',
+  mag_right: '1f50e',
+  bee: '1f41d',
+  bathtub: '1f6c1',
+  bar_chart: '1f4ca',
+  bath: '1f6c0',
+  barber: '1f488',
+  baby_symbol: '1f6bc',
+  bank: '1f3e6',
+  bangbang: '203c',
+  arrow_up_small: '1f53c',
+  atm: '1f3e7',
+  baby: '1f476',
+  back: '1f519',
+  arrows_clockwise: '1f503',
+  b: '1f171',
+  arrow_upper_left: '2196',
+  balloon: '1f388',
+  athletic_shoe: '1f45f',
+  arrows_counterclockwise: '1f504',
+  ballot_box_with_check: '2611',
+  articulated_lorry: '1f69b',
+  round_pushpin: '1f4cd',
+  radio_button: '1f518',
+  raised_hands: '1f64c',
+  raised_hand: '270b',
+  purse: '1f45b',
+  put_litter_in_its_place: '1f6ae',
+  rage: '1f621',
+  pushpin: '1f4cc',
+  pineapple: '1f34d',
+  dash: '1f4a8',
+  bear: '1f43b',
+  baggage_claim: '1f6c4',
+  art: '1f3a8',
+  arrow_upper_right: '2197',
+  chart_with_upwards_trend: '1f4c8',
+  baby_chick: '1f424',
+  baseball: '26be',
+  baby_bottle: '1f37c',
+  arrow_forward: '25b6',
+  aries: '2648',
+  arrow_left: '2b05',
+  arrow_lower_left: '2199',
+  arrow_right: '27a1',
+  ab: '1f18e',
+  arrow_down: '2b07',
+  anger: '1f4a2',
+  accept: '1f251',
+  arrow_lower_right: '2198',
+  arrow_double_up: '23eb',
+  arrow_down_small: '1f53d',
+  arrow_heading_up: '2934',
+  aquarius: '2652',
+  arrow_backward: '25c0',
+  abc: '1f524',
+  aerial_tramway: '1f6a1',
+  astonished: '1f632',
+  alarm_clock: '23f0',
+  angry: '1f620',
+  arrow_right_hook: '21aa',
+  arrow_double_down: '23ec',
+  arrow_heading_down: '2935',
+  apple: '1f34e',
+  airplane: '2708',
+  angel: '1f47c',
+  anchor: '2693',
+  '-1': '1f44e',
+  zero: '0030',
+  yellow_heart: '1f49b',
+  zzz: '1f4a4',
+  zap: '26a1',
+  womens: '1f6ba',
+  woman: '1f469',
+  wind_chime: '1f390',
+  wink: '1f609',
+  wave: '1f44b',
+  wc: '1f6be',
+  white_square_button: '1f533',
+  womans_hat: '1f452',
+  white_flower: '1f4ae',
+  wine_glass: '1f377',
+  womans_clothes: '1f45a',
+  white_small_square: '25ab',
+  worried: '1f61f',
+  violin: '1f3bb',
+  two_women_holding_hands: '1f46d',
+  whale2: '1f40b',
+  waning_gibbous_moon: '1f316',
+  virgo: '264d',
+  tulip: '1f337',
+  u5272: '1f239',
+  u5408: '1f234',
+  watch: '231a',
+  wavy_dash: '3030',
+  trumpet: '1f3ba',
+  two_men_holding_hands: '1f46c',
+  two_hearts: '1f495',
+  u55b6: '1f23a',
+  volcano: '1f30b',
+  warning: '26a0',
+  video_game: '1f3ae',
+  truck: '1f69a',
+  tropical_fish: '1f420',
+  u6708: '1f237',
+  up: '1f199',
+  watermelon: '1f349',
+  tired_face: '1f62b',
+  twisted_rightwards_arrows: '1f500',
+  train: '1f683',
+  tongue: '1f445',
+  water_buffalo: '1f403',
+  two: '0032',
+  yum: '1f60b',
+  turtle: '1f422',
+  waning_crescent_moon: '1f318',
+  traffic_light: '1f6a5',
+  tshirt: '1f455',
+  vibration_mode: '1f4f3',
+  u6307: '1f22f',
+  vs: '1f19a',
+  toilet: '1f6bd',
+  tokyo_tower: '1f5fc',
+  thumbsdown: '1f44e',
+  thumbsup: '1f44d',
+  tangerine: '1f34a',
+  three: '0033',
+  ticket: '1f3ab',
+  tennis: '1f3be',
+  taurus: '2649',
+  tm: '2122',
+  taxi: '1f695',
+  tada: '1f389',
+  tea: '1f375',
+  telescope: '1f52d',
+  symbols: '1f523',
+  tanabata_tree: '1f38b',
+  syringe: '1f489',
+  sunny: '2600',
+  suspension_railway: '1f69f',
+  sweet_potato: '1f360',
+  stuck_out_tongue_closed_eyes: '1f61d',
+  sushi: '1f363',
+  stew: '1f372',
+  sweat_smile: '1f605',
+  six_pointed_star: '1f52f',
+  space_invader: '1f47e',
+  signal_strength: '1f4f6',
+  stuck_out_tongue_winking_eye: '1f61c',
+  seven: '0037',
+  steam_locomotive: '1f682',
+  strawberry: '1f353',
+  swimmer: '1f3ca',
+  skull: '1f480',
+  straight_ruler: '1f4cf',
+  sunrise: '1f305',
+  sweat: '1f613',
+  sun_with_face: '1f31e',
+  sparkles: '2728',
+  statue_of_liberty: '1f5fd',
+  sleeping: '1f634',
+  soon: '1f51c',
+  beginner: '1f530',
+  yen: '1f4b4',
+  beers: '1f37b',
+  white_medium_square: '25fb',
+  wolf: '1f43a',
+  wrench: '1f527',
+  video_camera: '1f4f9',
+  walking: '1f6b6',
+  waxing_crescent_moon: '1f312',
+  wheelchair: '267f',
+  tiger2: '1f405',
+  sweat_drops: '1f4a6',
+  seedling: '1f331',
+  wedding: '1f492',
+  u7533: '1f238',
+  umbrella: '2614',
+  sunrise_over_mountains: '1f304',
+  us: '1f1fa',
+  u7981: '1f232',
+  u7a7a: '1f233',
+  underage: '1f51e',
+  unamused: '1f612',
+  u7121: '1f21a',
+  sparkle: '2747',
+  sob: '1f62d',
+  stuck_out_tongue: '1f61b',
+  u6e80: '1f235',
+  tropical_drink: '1f379',
+  trophy: '1f3c6',
+  trolleybus: '1f68e',
+  triangular_ruler: '1f4d0',
+  trident: '1f531',
+  top: '1f51d',
+  tomato: '1f345',
+  telephone: '260e',
+  thought_balloon: '1f4ad',
+  tophat: '1f3a9',
+  tractor: '1f69c',
+  soccer: '26bd',
+  six: '0036',
+  scream_cat: '1f640',
+  shaved_ice: '1f367',
+  spades: '2660',
+  dvd: '1f4c0',
+  flower_playing_cards: '1f3b4',
+  cry: '1f622',
+  hospital: '1f3e5',
+  hotel: '1f3e8',
+  herb: '1f33f',
+  heavy_plus_sign: '2795',
+  hatched_chick: '1f425',
+  hammer: '1f528',
+  grey_exclamation: '2755',
+  green_apple: '1f34f',
+  grinning: '1f600',
+  heavy_minus_sign: '2796',
+  hamburger: '1f354',
+  guardsman: '1f482',
+  hand: '270b',
+  green_heart: '1f49a',
+  grey_question: '2754',
+  golf: '26f3',
+  grapes: '1f347',
+  heartbeat: '1f493',
+  grimacing: '1f62c',
+  hatching_chick: '1f423',
+  dolls: '1f38e',
+  de: '1f1e9',
+  do_not_litter: '1f6af',
+  dress: '1f457',
+  custard: '1f36e',
+  eight: '0038',
+  earth_africa: '1f30d',
+  guitar: '1f3b8',
+  game_die: '1f3b2',
+  fallen_leaf: '1f342',
+  heart: '2764',
+  expressionless: '1f611',
+  crescent_moon: '1f319',
+  electric_plug: '1f50c',
+  crystal_ball: '1f52e',
+  arrow_up_down: '2195',
+  banana: '1f34c'
+}`


Added tests for backwards.flatten

Added tests for backwards.flatten

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

--- src/specs/flatten.coffee
+++ src/specs/flatten.coffee
@@ -0,0 +1,18 @@
+test    = require "tape"
+flatten = require( "../../build/backwards.dev" ).flatten
+txt     = "backwards.flatten should"
+
+test "#{ txt } be a function", (t) ->
+  t.equal typeof flatten, "function"
+  t.end()
+
+test "#{ txt } flatten Arrays one level without causing
+side-effects on the original Array", (t) ->
+  array     = [[1, 2], [3, 4], [5, 6]]
+  actual    = array.toString()
+  expected  = [1, 2, 3, 4, 5, 6].toString()
+  flattened = flatten( array ).toString()
+
+  t.equal flattened, expected
+  t.equal array.toString(), actual
+  t.end()


First usage automatic user creation

First usage automatic user creation

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


poll code handle

poll code handle

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


Reduce log output during normal startup (redux)

My pull request for eacfeaaddda2ba89bbf8cb521620b44ac95ed2b7 updated
load to use logger.info. This does the same for loadHubotScripts :)

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


Remove stacktrace from failing to load adapter


sidebar: make sure stack exists before checking owner

--- client/app/lib/sidebar/components/ownedresourceheader.coffee
+++ client/app/lib/sidebar/components/ownedresourceheader.coffee
@@ -50,7 +50,7 @@
       'active': !!selected
     }]

-    if oldOwner = stack.getOldOwner()
+    if oldOwner = stack?.getOldOwner()
       title = "#{title} (@#{oldOwner})"

     <header ref={(header) => @_header = header} className={className}>


fix(grunt): `copy:serve` not copying scripts in subdirectories

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -273,7 +273,7 @@
           expand: true
           dot: true
           cwd: "<%= config.app %>/assets/_js/"
-          src: ["*.js"]
+          src: ["**/*.js"]
           dest: "<%= config.app %>/assets/js/"
         ]


Admin: Integrations: Fix reference error.


Improve Documentation

Improve Documentation

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -472,7 +472,7 @@
         process_time = finish_time - start_time
         multi.hincrby @key('STATISTICS'), 'finished', 1
         multi.hincrby @key('STATISTICS'), 'total_pending_time', start_time - task[task.length - 1]
-        multi.hincrby @key('STATISTICS'), 'total_processing_time', process_time
+        multi.hincrby @key('STATISTICS'), 'total_process_time', process_time
         multi.lpush @key('RECENT'), JSON.stringify([task..., finish_time])
         multi.ltrim @key('RECENT'), 0, @recent_size - 1
         multi.zadd @key('SLOWEST'), process_time, JSON.stringify([task..., start_time])
@@ -805,7 +805,7 @@
       return callback err if err
       multi = @redis.multi()
       multi.del @key('GROUPS'), @key('RECENT'), @key('FAILED'), @key('SOURCE'), @key('STATISTICS'), @key('SLOWEST'), @key('BLOCKED'), res...
-      multi.hmset @key('STATISTICS'), 'total', 0, 'finished', 0, 'total_pending_time', 0, 'total_processing_time', 0
+      multi.hmset @key('STATISTICS'), 'total', 0, 'finished', 0, 'total_pending_time', 0, 'total_process_time', 0
       multi.exec (err, res) =>
         return callback err if err
         return @clear callback unless res
@@ -863,7 +863,7 @@
     #     + `total`
     #     + `finished`
     #     + `total_pending_time`
-    #     + `total_processing_time`
+    #     + `total_process_time`
     #   3. Count processing tasks -- `LLEN` of `PROCESSING` list.
     #   4. Count failed task -- `LLEN` of `FAILED` list.
     #   5. Get identifiers of blocked group -- `SMEMBERS` of `BLOCKED` set.
@@ -882,8 +882,8 @@
       #
       # 1. Process `STATISTICS` hash:
       #   + Convert:
-      #     - `total_pending_time` and `total_processing_time` into:
-      #     - `average_pending_time` and `average_processing_time`
+      #     - `total_pending_time` into `average_pending_time`, and:
+      #     - `total_process_time` into `average_process_time`
       #   + Calibrate initial condition (in case of no task is finished).
       # 2. Set `failed` key of returned object.
       statistics = multi_res[1] or {}
@@ -894,20 +894,20 @@
           tasks: parseInt(statistics.total) or 0
         finished_tasks: parseInt(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
+        average_process_time: Math.round(statistics.total_process_time * 100 / statistics.finished) / 100
         blocked: {}
         processing_tasks: multi_res[2]
         failed_tasks: multi_res[3]
         workers: multi_res[5]
       if result.finished_tasks is 0
         result.average_pending_time = '-'
-        result.average_processing_time = '-'
+        result.average_process_time = '-'

       # Calculate blocked and pending tasks:
       #
       #   1. Set `blocked.groups` of result.
       #   2. Initiate another transaction to count all `BLOCKED` tasks. Blocked
-      #   tasks are tasks in the `QUEUED` list whose group identifiers are in
+      #   tasks are tasks in the `QUEUED` lists whose group identifiers are in
       #   the `BLOCKED` set. **Note:** The leftmost task of each `QUEUED` list
       #   will not be counted, since that's the causing (failed) task.
       #   3. Calculate pending tasks.


Expose GSS via new global variable.

Expose GSS via new global variable.

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


small change in a lexer

small change in a lexer

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


:art: Fix tests descriptions

:art: Fix tests descriptions

--- spec/text-editor-spec.coffee
+++ spec/text-editor-spec.coffee
@@ -1838,7 +1838,7 @@
               expect(editor.lineTextForBufferRow(3)).toBe "    if (items.length <= 1) return items;"

           describe "when the cursor is at the beginning of a fold", ->
-            it "moves the line to the following row without breaking the fold", ->
+            it "moves the line to the previous row without breaking the fold", ->
               expect(editor.lineTextForBufferRow(4)).toBe "    while(items.length > 0) {"

               editor.createFold(4, 7)
@@ -1904,7 +1904,7 @@
             expect(editor.lineTextForBufferRow(4)).toBe "    if (items.length <= 1) return items;"

           describe "when the selection's end intersects a fold", ->
-            it "moves the lines to the following row without breaking the fold", ->
+            it "moves the lines to the previous row without breaking the fold", ->
               expect(editor.lineTextForBufferRow(4)).toBe "    while(items.length > 0) {"

               editor.createFold(4, 7)
@@ -1932,7 +1932,7 @@
               expect(editor.isFoldedAtBufferRow(7)).toBeFalsy()

           describe "when the selection's start intersects a fold", ->
-            it "moves the lines to the following row without breaking the fold", ->
+            it "moves the lines to the previous row without breaking the fold", ->
               expect(editor.lineTextForBufferRow(4)).toBe "    while(items.length > 0) {"

               editor.createFold(4, 7)
@@ -1974,7 +1974,7 @@
             expect(editor.lineTextForBufferRow(3)).toBe "    if (items.length <= 1) return items;"
             expect(editor.lineTextForBufferRow(4)).toBe "    while(items.length > 0) {"

-        describe "when there are multiple selections and the preceeding row is a folded row", ->
+        describe "when the preceeding row is a folded row", ->
           it "moves the lines spanned by the selection to the preceeding row, but preserves the folded code", ->
             expect(editor.lineTextForBufferRow(8)).toBe "    return sort(left).concat(pivot).concat(sort(right));"
             expect(editor.lineTextForBufferRow(9)).toBe "  };"


fixed two write issues reported by coffeelint

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/iTonyYo/node-find-folder.git/'


Components: SidebarMachinesListItem: Before hide AddWorkspaceView after that show it again

--- client/app/lib/components/sidebarmachineslistitem/index.coffee
+++ client/app/lib/components/sidebarmachineslistitem/index.coffee
@@ -177,7 +177,10 @@

   createAddWorkspaceView: ->

-    actions.showAddWorkspaceView @machine '_id'
+    id = @machine '_id'
+
+    actions.hideAddWorkspaceView id # Before hide it if it's visible
+    actions.showAddWorkspaceView id # After show it

   renderConnectedManagedMachineWidget: ->


update atom

update atom

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


Add functionality to question

Add functionality to question

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


Add ReceiveResponse test file

Add ReceiveResponse test file

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

--- spec/ReceiveResponse.coffee
+++ spec/ReceiveResponse.coffee
@@ -0,0 +1,25 @@
+noflo = require 'noflo'
+chai = require 'chai' unless chai
+ReceiveResponse = require '../components/ReceiveResponse.coffee'
+
+describe 'ReceiveResponse component', ->
+  c = null
+  request = null
+
+  beforeEach ->
+    c = ReceiveResponse.getComponent()
+    request = noflo.internalSocket.createSocket()
+    response = noflo.internalSocket.createSocket()
+    request = noflo.internalSocket.createSocket()
+
+    c.inPorts.request.attach request
+    c.outPorts.response.attach response
+    c.outPorts.message.attach request
+
+  describe 'when instantiated', ->
+    it 'should have a "request" inport', ->
+      chai.expect(c.inPorts.request).to.be.an 'object'
+    it 'should have a "response" outport', ->
+      chai.expect(c.outPorts.response).to.be.an 'object'
+    it 'should have a "message" outport', ->
+      chai.expect(c.outPorts.message).to.be.an 'object'


Real debug

Real debug

--- test/mocha.coffee
+++ test/mocha.coffee
@@ -16,7 +16,7 @@
 global.sinon = require("sinon")

 Promise = require "bluebird"
-Promise.longStackTraces()
+process.env.BLUEBIRD_DEBUG=1

 global.nock = require "nock"
 global.nock.back.fixtures = "#{process.env.ROOT_DIR}"


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

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

--- src/clamp.coffee
+++ src/clamp.coffee
@@ -0,0 +1,7 @@
+Clam = (I={}, self) ->
+  Object.reverseMerge I,
+    x: 0
+    y: 0
+    width: 8
+    height: 8
+    collisionMargin: Point(0, 0)


Add hover title for the mods

Add hover title for the mods

--- resources/assets/coffee/react/_components/play-detail.coffee
+++ resources/assets/coffee/react/_components/play-detail.coffee
@@ -71,6 +71,7 @@
                   className: 'mods__mod'
                   img _.merge
                     className: 'mods__mod-image'
+                    title: mod.name
                     osu.src2x("/images/badges/mods/#{_.kebabCase(mod.name)}.png")
           div
             className: 'detail-row__score-data detail-row__score-data--main'


Correctly name the LoggerProvider class.

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


migrating array extensions to coffeescript

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

--- src/array_extensions.coffee
+++ src/array_extensions.coffee
@@ -0,0 +1,240 @@
+###*
+* Creates and returns a copy of the array. The copy contains
+* the same objects.
+*
+* @type Array
+* @returns A new array that is a copy of the array
+###
+Array::copy = ->
+  this.concat()
+
+
+###*
+* Empties the array of its contents. It is modified in place.
+*
+* @type Array
+* @returns this, now emptied.
+###
+Array::clear = ->
+  this.length = 0
+
+  return this
+
+###*
+* Invoke the named method on each element in the array
+* and return a new array containing the results of the invocation.
+*
+

+  [1.1, 2.2, 3.3, 4.4].invoke("floor")
+  => [1, 2, 3, 4]
+
+  ['hello', 'world', 'cool!'].invoke('substring', 0, 3)
+  => ['hel', 'wor', 'coo']
+

+*
+* @param {String} method The name of the method to invoke.
+* @param [arg...] Optional arguments to pass to the method being invoked.
+*
+* @type Array
+* @returns A new array containing the results of invoking the
+* named method on each element.
+###
+Array::invoke = (method) ->
+  args = Array.prototype.slice.call(arguments, 1)
+
+  this.map (element) ->
+    element[method].apply(element, args)
+
+###*
+* Randomly select an element from the array.
+*
+* @returns A random element from an array
+###
+Array::rand = ->
+  this[rand(this.length)]
+
+###*
+* Remove the first occurance of the given object from the array if it is
+* present.
+*
+* @param {Object} object The object to remove from the array if present.
+* @returns The removed object if present otherwise undefined.
+###
+Array::remove = (object) ->
+  index = this.indexOf(object)
+
+  if index >= 0
+    this.splice(index, 1)[0]
+
+###*
+* Returns true if the element is present in the array.
+*
+* @param {Object} element The element to check if present.
+* @returns true if the element is in the array, false otherwise.
+* @type Boolean
+###
+Array::include = (element) ->
+  this.indexOf(element) != -1
+
+
+###*
+ * Call the given iterator once for each element in the array,
+ * passing in the element as the first argument, the index of
+ * the element as the second argument, and this array as the
+ * third argument.
+ *
+ * @param {Function} iterator Function to be called once for
+ * each element in the array.
+ * @param {Object} [context] Optional context parameter to be
+ * used as `this` when calling the iterator function.
+ *
+ * @returns `this` to enable method chaining.
+###
+Array::each = (iterator, context) ->
+  if this.forEach
+    this.forEach iterator, context
+  else
+    for element, i in this
+      iterator.call context, element, i, this
+
+  return this
+
+Array::eachSlice = (n, iterator, context) ->
+  if n > 0
+    len = (this.length / n).ceil
+    i = 0
+
+    iterator.call(context, this.slice(i*n, (i+1)*n), i*n, this) while i++ < len
+
+  return this
+
+###*
+ * Returns a new array with the elements all shuffled up.
+ *
+ * @returns A new array that is randomly shuffled.
+ * @type Array
+###
+Array::shuffle = ->
+  shuffledArray = []
+
+  this.each (element) ->
+    shuffledArray.splice(rand(shuffledArray.length + 1), 0, element)
+
+  return shuffledArray
+
+
+###*
+ * Returns the first element of the array, undefined if the array is empty.
+ *
+ * @returns The first element, or undefined if the array is empty.
+ * @type Object
+###
+Array::first = ->
+  this[0]
+
+###*
+ * Returns the last element of the array, undefined if the array is empty.
+ *
+ * @returns The last element, or undefined if the array is empty.
+ * @type Object
+###
+Array::last = ->
+  this[this.length - 1]
+
+###*
+ * Pretend the array is a circle and grab a new array containing length elements.
+ * If length is not given return the element at start, again assuming the array
+ * is a circle.
+ *
+ * @param {Number} start The index to start wrapping at, or the index of the
+ * sole element to return if no length is given.
+ * @param {Number} [length] Optional length determines how long result
+ * array should be.
+ * @returns The element at start mod array.length, or an array of length elements,
+ * starting from start and wrapping.
+ * @type Object or Array
+###
+Array::wrap = (start, length) ->
+  if length != null
+    end = start + length
+    i = start
+    result = []
+
+    result.push(this[i.mod(this.length)]) while i++ < end
+
+    return result
+  else
+    this[start.mod(this.length)]
+
+###*
+ * Partitions the elements into two groups: those for which the iterator returns
+ * true, and those for which it returns false.
+ * @param {Function} iterator
+ * @param {Object} [context] Optional context parameter to be
+ * used as `this` when calling the iterator function.
+ *
+ * @type Array
+ * @returns An array in the form of [trueCollection, falseCollection]
+###
+Array::partition = (iterator, context) ->
+  trueCollection = []
+  falseCollection = []
+
+  this.each (element) ->
+    if iterator.call(context, element)
+      trueCollection.push element
+    else
+      falseCollection.push element
+
+  return [trueCollection, falseCollection]
+
+###*
+ * Return the group of elements for which the return value of the iterator is true.
+ *
+ * @param {Function} iterator The iterator receives each element in turn as
+ * the first agument.
+ * @param {Object} [context] Optional context parameter to be
+ * used as `this` when calling the iterator function.
+ *
+ * @type Array
+ * @returns An array containing the elements for which the iterator returned true.
+###
+Array::select = (iterator, context) ->
+  return this.partition(iterator, context)[0]
+
+###*
+ * Return the group of elements that are not in the passed in set.
+ *
+ * @param {Array} values List of elements to exclude.
+ *
+ * @type Array
+ * @returns An array containing the elements that are not passed in.
+###
+Array.prototype.without = (values) ->
+  this.reject (element) ->
+    values.include(element)
+
+###*
+ * Return the group of elements for which the return value of the iterator is false.
+ *
+ * @param {Function} iterator The iterator receives each element in turn as
+ * the first agument.
+ * @param {Object} [context] Optional context parameter to be
+ * used as `this` when calling the iterator function.
+ *
+ * @type Array
+ * @returns An array containing the elements for which the iterator returned false.
+###
+Array::reject = (iterator, context) ->
+  this.partition(iterator, context)[1]
+
+Array::inject = (initial, iterator) ->
+  this.each (element) ->
+    initial = iterator(initial, element)
+
+  return initial
+
+Array::sum = ->
+  this.inject 0, (sum, n) ->
+    sum + n
+


remove underscore.string

remove underscore.string

--- code/loggit.coffee
+++ code/loggit.coffee
@@ -8,7 +8,6 @@
 spawn = (require 'child_process').spawn

 sqlite3 = (require 'sqlite3').verbose()
-_s = require 'underscore.string'

 exports.createTables = (callback) ->
   db = new sqlite3.Database 'loggit.sqlite'
@@ -65,5 +64,5 @@
     log child, { type: 'exit', status: code, signal: signal }

 # START
-if _s.endsWith process.argv[1], 'loggit.coffee'
+if process.argv[1].match /loggit\.coffee/
   exports.createTables( exports.logMessages )


awesomeify

awesomeify

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/core-network/client-famous.git/'


Fixing an issue where pages with multiple dropzones can trigger multiple file upload dialogs under certain conditions.

--- app/assets/javascripts/markdown_area.js.coffee
+++ app/assets/javascripts/markdown_area.js.coffee
@@ -179,7 +179,7 @@

   $(".markdown-selector").click (e) ->
     e.preventDefault()
-    $(".div-dropzone").click()
+    $(@).closest(".div-dropzone-wrapper").find(".div-dropzone").click()
     return

   return


judges intro script

judges intro script

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

--- scripts/judges-intro.coffee
+++ scripts/judges-intro.coffee
@@ -0,0 +1,31 @@
+require 'colors'
+env = require '../config/env'
+mongoose = require('../models')(env.mongo_url)
+util = require 'util'
+postageapp = require('postageapp')(env.secrets.postageapp)
+_ = require('underscore')
+async = require('async')
+
+Person = mongoose.model 'Person'
+
+welcome = (judge, callback) ->
+  email = judge.email
+  util.log "Sending 'judge_intro' to '#{email}'".yellow
+  postageapp.sendMessage
+    # recipients: email,
+    recipients: "jacques@nodeknockout.com",
+    template: 'judge_intro'
+    variables:
+      first_name: judge.name.split(/\s/)[0]
+    , (args...) ->
+      # console.log "completed sending"
+      # console.log args
+      # callback(args...)
+      callback()
+
+Person.find { role: 'judge', email: /@/ }, (err, judges) ->
+  throw err if err
+
+  async.forEachSeries judges, welcome, (err) ->
+    util.error(err) if err
+    mongoose.connection.close()


comment keymap

comment keymap

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


rm extra newline

rm extra newline

--- js/jack-in-the-box.coffee
+++ js/jack-in-the-box.coffee
@@ -44,7 +44,6 @@
       scrolled = false
       @show()

-
     # show visible elements
     @show = =>
       @$boxes = @$boxes.map (index, box) =>


no confirm..

no confirm..

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/pcruise/translate-together.git/'


Remove unused configuration

Remove unused configuration

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


Routes: Removed dummy code.

Routes: Removed dummy code.

--- client/ide/lib/routes.coffee
+++ client/ide/lib/routes.coffee
@@ -160,9 +160,6 @@

 module.exports = -> lazyrouter.bind 'ide', (type, info, state, path, ctx) ->

-  globals.userMachines = []
-  globals.userWorkspaces = []
-
   switch type

     when 'home' then routeToLatestWorkspace()


clio-23421 adds fix for scope.apply bug

clio-23421 adds fix for scope.apply bug

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


No need these

No need these

--- client/landing/app/Applications/Inbox.kdapplication/Views/InboxShowMoreLink.coffee
+++ client/landing/app/Applications/Inbox.kdapplication/Views/InboxShowMoreLink.coffee
@@ -1,7 +0,0 @@
-class InboxShowMoreLink extends CommentViewHeader
-
-  pistachio:->
-    """
-    View all {{#(repliesCount)}} replies...
-    {{@newCount}} new
-    """


add test for FilesystemObjectThumbnail

add test for FilesystemObjectThumbnail

fixes CNVS-20538

Test Plan

Ensure test pass and make sense

Change-Id: I4c0bc686504c642848e836f66c395b568663ecaa
Reviewed-on: https://gerrit.instructure.com/54427
Tested-by: Jenkins
Reviewed-by: Clay Diffrient <9dff2e5c98626d20d2848250c411e8009465bb87@instructure.com>
Product-Review: Sterling Cobb <7a57d889ea7f266299434459898a90c7f6a1ca4d@instructure.com>
QA-Review: Sterling Cobb <7a57d889ea7f266299434459898a90c7f6a1ca4d@instructure.com>

error: pathspec 'spec/coffeescripts/react_files/components/FilesystemObjectThumbnailSpec.coffee' did not match any file(s) known to git

--- spec/coffeescripts/react_files/components/FilesystemObjectThumbnailSpec.coffee
+++ spec/coffeescripts/react_files/components/FilesystemObjectThumbnailSpec.coffee
@@ -0,0 +1,93 @@
+define [
+  'react'
+  'compiled/models/File'
+  'compiled/models/Folder'
+  'compiled/models/FilesystemObject'
+  'compiled/react_files/components/FilesystemObjectThumbnail'
+], (React, File, Folder, FilesystemObject, FilesystemObjectThumbnail) ->
+
+  TestUtils = React.addons.TestUtils
+
+  module 'Filesystem Object Thumbnail: file',
+    setup: ->
+      file = new File(id: 65, thumbnail_url: "sweet_thumbnail_url")
+
+      @fOT = React.createFactory(FilesystemObjectThumbnail)
+
+      @clock = sinon.useFakeTimers()
+      @thumbnail = TestUtils.renderIntoDocument(@fOT(model: file, className: "customClassname"))
+      @clock.tick(20000)
+
+    teardown: ->
+      @clock.restore()
+      React.unmountComponentAtNode(@thumbnail.getDOMNode().parentNode)
+
+  test "displays the thumbnail image", ->
+    equal $(@thumbnail.getDOMNode()).attr("style"), "background-image:url('sweet_thumbnail_url');", "set background image to correct url"
+
+  test "adds class name from props to the span", ->
+    ok $(@thumbnail.getDOMNode()).hasClass("customClassname"), "finds the custom className"
+
+  module 'Filesystem Object Thumbnail: folder',
+    setup: ->
+      folder = new Folder(id: 65)
+
+      @fOT = React.createFactory(FilesystemObjectThumbnail)
+
+      @clock = sinon.useFakeTimers()
+      @thumbnail = TestUtils.renderIntoDocument(@fOT(model: folder, className: "customClassname"))
+      @clock.tick(20000)
+
+    teardown: ->
+      @clock.restore()
+      React.unmountComponentAtNode(@thumbnail.getDOMNode().parentNode)
+
+  test "adds mimeClass-Folder if it's a folder", ->
+    ok $(@thumbnail.getDOMNode()).hasClass("mimeClass-folder"), "adds mimeClass for folder"
+
+  test "adds on className to i tag if set in props", ->
+    ok $(@thumbnail.getDOMNode()).hasClass("customClassname"), "finds the custom className"
+
+  module 'Filesystem Object Thumbnail: other',
+  test "adds on className to i tag if set in props", ->
+    fso = new FilesystemObject(id: 65)
+    fso.url = -> "foo"
+
+    @fOT = React.createFactory(FilesystemObjectThumbnail)
+
+    clock = sinon.useFakeTimers()
+    thumbnail = TestUtils.renderIntoDocument(@fOT(model: fso, className: "customClassname"))
+    clock.tick(20000)
+
+    ok $(thumbnail.getDOMNode()).hasClass("customClassname"), "finds the custom className"
+
+    clock.restore()
+    React.unmountComponentAtNode(thumbnail.getDOMNode().parentNode)
+
+  module 'Filesystem Object Thumbnail: checkForThumbnail',
+    setup: ->
+      url = "/api/v1/files/65"
+      @server = sinon.fakeServer.create()
+      @server.respondWith url, [
+        200
+        'Content-Type': 'application/json'
+        JSON.stringify {thumbnail_url: 'sweet_thumbnail_url'}
+      ]
+
+      file = new File(id: 65)
+
+      @fOT = React.createFactory(FilesystemObjectThumbnail)
+
+      @clock = sinon.useFakeTimers()
+      @thumbnail = TestUtils.renderIntoDocument(@fOT(model: file))
+      @clock.tick(20000)
+      @server.respond()
+
+    teardown: ->
+      @server.restore()
+      @clock.restore()
+      React.unmountComponentAtNode(@thumbnail.getDOMNode().parentNode)
+
+  test "fetches thumbnail_url and puts it into state", ->
+    equal @thumbnail.state.thumbnail_url, "sweet_thumbnail_url", "fetches and set thumbnail url into state"
+


Create directive for scaling by a factor and then formatting as currency

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

--- app/assets/javascripts/admin/line_items/directives/scale_by_as_currency.js.coffee
+++ app/assets/javascripts/admin/line_items/directives/scale_by_as_currency.js.coffee
@@ -0,0 +1,8 @@
+angular.module("admin.lineItems").directive "scaleAsCurrency", ($filter) ->
+  restrict: "A"
+  require: 'ngModel'
+  scope:
+    factor: "&scaleAsCurrency"
+  link: (scope, element, attrs, ngModel) ->
+    ngModel.$formatters.push (value) ->
+      $filter("currency")(value * scope.factor())


Removed allow_multi_purchase option

Removed allow_multi_purchase option

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


Disable UIComponent for XML documents

Disable UIComponent for XML documents

If the page is an XML document, nothing we do works:
* <style> elements show their contents inline,
* <iframe> elements don't load any content,
* document.createElement generates elements that
  - have Element.style == null, and
  - ignore CSS.

This commit stops us from injecting anything into the DOM from
UIComponent, fixing #1640.

--- content_scripts/ui_component.coffee
+++ content_scripts/ui_component.coffee
@@ -7,6 +7,14 @@

   constructor: (iframeUrl, className, @handleMessage) ->
     styleSheet = document.createElement "style"
+
+    # If this is an XML document, nothing we do here works:
+    # * <style> elements show their contents inline,
+    # * <iframe> elements don't load any content,
+    # * document.createElement generates elements that have style == null and ignore CSS.
+    # We bail here if this is the case so we're polluting the DOM to no or negative effect.
+    return unless styleSheet.style
+
     styleSheet.type = "text/css"
     # Default to everything hidden while the stylesheet loads.
     styleSheet.innerHTML = "@import url(\"#{chrome.runtime.getURL("content_scripts/vimium.css")}\");"


Changed `esc` on multi-select to work more like default behavior

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/danseethaler/userlite-utilities.git/'