:lipstick:

:lipstick:

--- src/extensions/autocomplete.coffee
+++ src/extensions/autocomplete.coffee
@@ -54,7 +54,7 @@
         @cancel()

     @miniEditor.buffer.on 'change', (e) =>
-      @filterMatches() if @parent()[0]
+      @filterMatches() if @hasParent()

     @miniEditor.preempt 'move-up', =>
       @selectPreviousMatch()


Expiry date on pinned nav cookie

Expiry date on pinned nav cookie

--- app/assets/javascripts/application.js.coffee
+++ app/assets/javascripts/application.js.coffee
@@ -261,7 +261,7 @@

   # Sidenav pinning
   if $window.width() < 1280 and $.cookie('pin_nav') is 'true'
-    $.cookie('pin_nav', 'false', { path: '/' })
+    $.cookie('pin_nav', 'false', { path: '/', expires: 365 * 10 })
     $('.page-with-sidebar')
       .toggleClass('page-sidebar-collapsed page-sidebar-expanded')
       .removeClass('page-sidebar-pinned')
@@ -292,7 +292,7 @@
                .toggleClass('header-collapsed header-expanded')

       # Save settings
-      $.cookie 'pin_nav', doPinNav, { path: '/' }
+      $.cookie 'pin_nav', doPinNav, { path: '/', expires: 365 * 10 }

       if $.cookie('pin_nav') is 'true' or doPinNav
         tooltipText = 'Unpin navigation'


* Build

* Build

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


clio-29293 add default expanded value if not passed in attribute

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


Renaming some tasks

Renaming some tasks

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/leandrooriente/racha-conta.git/'


Reinstated htmlmin

Reinstated htmlmin

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -120,7 +120,7 @@
       docs:
         options:
           removeComments: true
-          collapseWhitespace: false
+          collapseWhitespace: true
         files:
           "docs/dist/index.html": "docs/dist/index.html"


Add more exceptions to uglify mangle

Add more exceptions to uglify mangle

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -37,7 +37,7 @@
     uglify:
       options:
         mangle:
-          except: ['jQuery']
+          except: ['jQuery', 'AbstractChosen', 'Chosen', 'SelectParser']
         banner: "<%= comments %>"
       my_target:
         files:


patch requestFinished to accept promises

--- chrome/content/zotero-better-bibtex/zotero-better-bibtex.coffee
+++ chrome/content/zotero-better-bibtex/zotero-better-bibtex.coffee
@@ -449,11 +449,18 @@

   # monkey-patch Zotero.Server.DataListener.prototype._requestFinished for async handling of web api translation requests
   Zotero.Server.DataListener::_requestFinished = ((original) ->
-    return (method, postData) ->
+    return (response) ->
       try
-        return if Zotero.BetterBibTeX.DataListener_requestFinished.apply(@, arguments)
+        if typeof response?.then == 'function'
+          if @_responseSent
+            Zotero.debug("Request already finished; not sending another response")
+            return
+          @_responseSent = true
+          response.then((txt) -> original.apply(@, [txt]))
+          return
+
       return original.apply(@, arguments)
-    )(Zotero.Server.DataListener::_processEndpoint)
+    )(Zotero.Server.DataListener::_requestFinished)

   # monkey-patch Zotero.Search.prototype.save to trigger auto-exports
   Zotero.Search::save = ((original) ->
@@ -643,38 +650,6 @@
       loader.loadSubScript("chrome://zotero-better-bibtex/content/test/include.js")
       @Test.run(tests.trim().split(/\s+/))

-Zotero.BetterBibTeX.DataListener_processEndpoint = (method, postData) ->
-
-Zotero.BetterBibTeX.DataListener_headerFinished = ->
-  return false unless Zotero.isServer
-  return false if @origin in ['https://www.zotero.org', 'http://www.zotero.org']
-
-  header = @header.split(/\r?\n/)
-
-  req = header.shift()?.match(/^([A-Z]+) (.+)( HTTP(\/1\.[10])?)?$/)
-  return false unless req && rec[0] && req[1]
-
-  method = req[0]
-  path = req[1].replace(/[#\?].*/, '')
-  query = req[1].replace(/.*\?/, '').replace(/#.*/, '') if req[1].indexOf('?') >= 0
-  fragment = req[1].replace(/.*\#/, '') if req[1].indexOf('#') >= 0
-
-  return false if path == ''
-  endpoint = Zotero.Server.Endpoints[path]
-  return false unless endpoint?.async
-  return false unless method in (endpoint.supportedMethods || [])
-
-  headers = {}
-  for line in header
-    line = line.split(/:\s*/, 2)
-    continue unless line.length == 2
-    headers[line[0].toLowerCase()] = line[1]
-  contentType = headers['content-type'].replace(/\s*;.*/, '')
-
-  return false if method == 'POST' && !headers['content-length']
-
-  return false
-
 Zotero.BetterBibTeX.createFile = (paths...) ->
   f = Zotero.getZoteroDirectory()
   throw new Error('no path specified') if paths.length == 0


Added AceFindAndReplaceView.

Added AceFindAndReplaceView.

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


:lipstick:

:lipstick:

--- spec/app/text-mate-bundle-spec.coffee
+++ spec/app/text-mate-bundle-spec.coffee
@@ -35,4 +35,4 @@

     it "uses plain text if no grammar can be found", ->
       filePath = require.resolve("this-is-not-a-real-file")
-      expect(TextMateBundle.grammarForFilePath(filePath).name).toBe "Plain Text"+      expect(TextMateBundle.grammarForFilePath(filePath).name).toBe "Plain Text"


hmm...

hmm...

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


add circular-pipelines experiment

add circular-pipelines experiment

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


Updated to remove DL and translate the vehicle types.

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/International-Ins/mio-rails.git/'


activity: add isBotChannel util

activity: add isBotChannel util


Added metcalfe me...hilarity ensues

Added metcalfe me...hilarity ensues

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

--- src/scripts/metcalfe.coffee
+++ src/scripts/metcalfe.coffee
@@ -0,0 +1,21 @@
+# Description:
+#   metcalfe me - The one and only
+#
+# Commands:
+#   hubot metcalfe me - An array of Partridge images
+#   hubot andym me - As above
+#
+# Author:
+#   Ryan Tomlinson
+
+metcalfes = [
+  "http://slayermusings.files.wordpress.com/2012/11/sports-casual.jpg",
+  "http://cdn.images.express.co.uk/img/dynamic/79/285x214/343509_1.jpg",
+  "http://static.guim.co.uk/sys-images/Guardian/Pix/audio/video/2013/7/25/1374755714850/Alan-Partridge-in-Norwich-005.jpg",
+  "http://www.thedrum.com/uploads/drum_basic_article/115831/main_images/AP_0.jpg"
+]
+
+module.exports = (robot) ->
+
+  robot.respond /(metcalfe|andym) me/i, (msg) ->
+    msg.send msg.random metcalfes


Adding support for http://scoutapp.com notifications via web hook

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

--- src/scripts/scoutapp.coffee
+++ src/scripts/scoutapp.coffee
@@ -0,0 +1,40 @@
+# Announce Scout notifications to a room sepecified by the URL.
+
+# Scout is a hosted server cluster monitoring tool: http://scoutapp.com
+# This plugin is to be used with their webhook notification system.
+#
+# To use:
+#   setup http://hostname/hubot/scoutapp/ROOMNUMBER as
+#   your notification webook. If on Heroku lookup the hostname where
+#   the hubot server is running. (e.g. my-hubot.herokuapp.com)
+#
+#   Check you are using a recent version of hubot in packages.json
+#   to ensure the robot.router is available
+
+module.exports = (robot) ->
+  robot.router.post '/hubot/scoutapp/:room', (req, res) ->
+    room = req.params.room
+
+    data = JSON.parse req.body.payload
+
+    # Example post data
+    #
+    # {
+    #   "id": 999999,
+    #   "time": "2012-03-05T15:36:51Z",
+    #   "server_name": "Blade",
+    #   "server_hostname": "blade",
+    #   "lifecycle": "start", // can be [start|end]
+    #   "title": "Last minute met or exceeded 3.00 , increasing to 3.50 at 01:06AM",
+    #   "plugin_name": "Load Average",
+    #   "metric_name": "last_minute",
+    #   "metric_value": 3.5,
+    #   "severity": "warning", // warning = normal threshold, critical = SMS threshold
+    #   "url": "https://scoutapp.com/a/999999"
+    # }
+
+    robot.messageRoom room, "Scout #{data.severity} - #{data.server_name} on host #{data.server_hostname} #{data.lifecycle}ed - #{data.plugin_name} - #{data.title} - Current value #{data.metric_name}=#{data.metric_value} - Details: #{data.url}"
+
+    # Send back an empty response
+    res.writeHead 204, { 'Content-Length': 0 }
+    res.end()


white space

white space

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


migrating back to my machine

migrating back to my machine

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

--- packages/hints.coffee
+++ packages/hints.coffee
@@ -0,0 +1,26 @@
+HINTCHARS = 'asdfghjkl;'
+
+{ interfaces: Ci } = Components
+HTMLDocument        = Ci.nsIDOMHTMLDocument
+
+class Marker
+  constructor: (@element) ->
+
+class DocumentMarkers
+  constroctor: (@document) ->
+
+
+hasHints = (document) ->
+  false
+
+addHints = (document, cb) ->
+  if document instanceof HTMLDocument
+    document
+
+removeHints = (document) ->
+  if hasHints document
+    null
+
+exports.addHints    = addHints
+exports.removeHints = removeHints
+exports.hasHints    = removeHints


Disable unreliable product.payPalBillingPlanID test

--- test/app/collections/Products.spec.coffee
+++ test/app/collections/Products.spec.coffee
@@ -1,4 +1,5 @@
-describe 'ProductModel', ->
+# TODO: unreliable test case, product data doesn't change often.
+xdescribe 'ProductModel', ->
   # Temporarily turn ajax back on for a real call to /db/products
   beforeEach -> jasmine.Ajax.uninstall()
   afterEach -> jasmine.Ajax.install()


Removed onLoadingError handler

Removed onLoadingError handler

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


Add JavaScript for Courses Listing Scroll

Add JavaScript code to handle setting the width of the Courses listing
so that if there are more courses than fit on the page, the container
scrolls.

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

--- app/assets/javascripts/courses.js.coffee
+++ app/assets/javascripts/courses.js.coffee
@@ -0,0 +1,10 @@
+$ ->
+  # handle updating the width for scrolling through courses
+  width = 0
+
+  $(".courses-listing .course").each ->
+    width += $(this).outerWidth(true)
+
+  width += $(".courses-listing .course").outerWidth(true) / 3
+
+  $(".courses-listing").css "width", width + "px"


only subscribe to received

only subscribe to received

--- lib/MeshbluWebsocketHandler.coffee
+++ lib/MeshbluWebsocketHandler.coffee
@@ -78,7 +78,7 @@
       return @sendFrame 'notReady', message: 'unauthorized', status: 401 if error?
       @sendFrame 'ready', uuid: @uuid, token: @token, status: 200
       @setOnlineStatus device, true
-      @messageIOClient.subscribe @uuid, ['received', 'broadcast']
+      @messageIOClient.subscribe @uuid, ['received']

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


NSE: use new ComputeStorage instead

NSE: use new ComputeStorage instead

--- client/new-stack-editor/lib/index.coffee
+++ client/new-stack-editor/lib/index.coffee
@@ -44,7 +44,6 @@

     super options, data

-    @templates = {}
     @mainView.addSubView @stackEditor = new StackEditor { cssClass: 'initial' }

     @stackEditor.on Events.InitializeRequested, @bound 'initializeStack'
@@ -58,7 +57,7 @@
       do @openStackWizard
       return callback { message: 'No template provided' }

-    @fetchStackTemplate templateId, (err, template) =>
+    @fetchStackTemplate templateId, reset, (err, template) =>

       @stackEditor.unsetClass 'initial'

@@ -81,23 +80,29 @@

   reloadEditor: (templateId, stackId) ->

-    return  unless @templates[templateId]
-
-    delete @templates[templateId]
     @openEditor templateId, stackId, { reset: yes }

-  fetchStackTemplate: (templateId, callback) ->
+  fetchStackTemplate: (templateId, reset = no, callback) ->

-    if template = @templates[templateId]
+    { storage } = kd.singletons.computeController
+
+    if not reset and template = storage.templates.get templateId
       return callback null, template

-    cc = kd.singletons.computeController
-    cc.fetchStackTemplate templateId, (err, template) =>
-      return callback err  if err
-      return callback Errors.NotExists  unless template
+    storage.templates.fetch templateId, null, reset

-      callback null, @templates[templateId] = template
+      .then (template) ->
+        if template
+          callback null, template
+        else
+          callback Errors.NotExists
+
+        return template
+
+      .catch (err) ->
+        callback err
+

   initializeStack: (templateId) ->


Add Promise argument and return tests.

Add Promise argument and return tests.

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


Condition aviateur & marin

Condition aviateur & marin

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/GregDesplaces/classe-1914.git/'


finish extracting queries from get calls in tests

--- test/pagerv2_commands_test.coffee
+++ test/pagerv2_commands_test.coffee
@@ -111,7 +111,10 @@
           }
         }
         nock('https://api.pagerduty.com')
-        .get('/users?query=momo%40example.com')
+        .get('/users')
+        .query({
+          query: 'momo@example.com'
+        })
         .reply 200, require('./fixtures/users_list-match.json')
       afterEach ->
         room.robot.brain.data.pagerv2 = { }
@@ -392,11 +395,14 @@
           earliest: true
         })
         .reply(200, payload1)
-        .get(
-          '/oncalls?time_zone=UTC&schedule_ids%5B%5D=42&earliest=true' +
-          '&since=' + encodeURIComponent(moment(@start_time).utc().add(2, 'minute').format()) +
-          '&until=' + encodeURIComponent(moment(@start_time).utc().add(3, 'minute').format())
-        )
+        .get('/oncalls')
+        .query({
+          time_zone: 'UTC',
+          schedule_ids: [ 42 ],
+          earliest: true,
+          since: moment(@start_time).utc().add(2, 'minute').format(),
+          until: moment(@start_time).utc().add(3, 'minute').format()
+        })
         .reply(200, payload2)

       afterEach ->
@@ -423,7 +429,10 @@
           }
         }
         nock('https://api.pagerduty.com')
-        .get('/users?query=momo%40example.com')
+        .get('/users')
+        .query({
+          query: 'momo@example.com'
+        })
         .reply(200, require('./fixtures/users_list-nomatch.json'))
       afterEach ->
         room.robot.brain.data.pagerv2 = { }
@@ -1480,7 +1489,10 @@
       context 'when something goes wrong,', ->
         beforeEach ->
           nock('https://api.pagerduty.com')
-          .get('/maintenance windows?filter=ongoing')
+          .get('/maintenance windows')
+          .query({
+            filter: 'ongoing'
+          })
           .reply 503, { error: { code: 503, message: "it's all broken!" } }
         afterEach ->
           room.robot.brain.data.pagerv2 = { }
@@ -1494,7 +1506,10 @@
       context 'when everything goes right,', ->
         beforeEach ->
           nock('https://api.pagerduty.com')
-          .get('/maintenance windows?filter=ongoing')
+          .get('/maintenance windows')
+          .query({
+            filter: 'ongoing'
+          })
           .reply(200, require('./fixtures/maintenance_list-ok.json'))
         afterEach ->
           nock.cleanAll()
@@ -1510,9 +1525,15 @@
       context 'when something goes wrong,', ->
         beforeEach ->
           nock('https://api.pagerduty.com')
-          .get('/services?query=My%20Application%20Service')
+          .get('/services')
+          .query({
+            query: 'My Application Service'
+          })
           .reply(200, require('./fixtures/services_list1-ok.json'))
-          .get('/services?query=Other%20Service')
+          .get('/services')
+          .query({
+            query: 'Other Service'
+          })
           .reply(200, require('./fixtures/services_list2-ok.json'))
           .post('/maintenance windows')
           .reply 503, { error: { code: 503, message: "it's all broken!" } }
@@ -1527,9 +1548,15 @@
       context 'when everything goes right,', ->
         beforeEach ->
           nock('https://api.pagerduty.com')
-          .get('/services?query=My%20Application%20Service')
+          .get('/services')
+          .query({
+            query: 'My Application Service'
+          })
           .reply(200, require('./fixtures/services_list1-ok.json'))
-          .get('/services?query=Other%20Service')
+          .get('/services')
+          .query({
+            query: 'Other Service'
+          })
           .reply(200, require('./fixtures/services_list2-ok.json'))
           .post('/maintenance windows')
           .reply(200, require('./fixtures/maintenance_create-ok.json'))


remove news_articles from config

remove news_articles from config

--- src/desktop/config.coffee
+++ src/desktop/config.coffee
@@ -70,7 +70,6 @@
   MOBILE_MEDIA_QUERY: "only screen and (max-width: 640px)"
   MOBILE_URL: 'https://m.artsy.net'
   NODE_ENV: 'development'
-  NEWS_ARTICLES: null
   OPENREDIS_URL: null
   PARSELY_KEY: 'artsy.net'
   EDITORIAL_PATHS: '^\/article|^\/2016-year-in-art|^\/venice-biennale|^\/gender-equality|^\/series|^\/video'


Hide delete button on apps if user is not super-admin, use delete method instead of remove which is insecure

--- client/landing/app/Applications/Apps.kdapplication/Views/AppsListItemView.coffee
+++ client/landing/app/Applications/Apps.kdapplication/Views/AppsListItemView.coffee
@@ -18,13 +18,20 @@
         src       : thumb

     @thumbnail = new KDCustomHTMLView thumbOptions
+
     @removeButton = new KDButtonView
-      title : "Delete app"
+      title    : "Delete app"
       callback : =>
-        @getData().remove (err)=>
+        @getData().delete (err)=>
           if err then warn err
           else
             @emit "AppDeleted", @
+            @destroy()
+
+    @removeButton.hide()
+
+    KD.whoami().fetchRole? (err, role) =>
+      @removeButton.show() if role is "super-admin"

   click:(event)->
     if $(event.target).is ".appdetails h3 a span"


fixup counters client side

fixup counters client side

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


add comment on MAC.getMixed

add comment on MAC.getMixed

--- client/app/stores/message_store.coffee
+++ client/app/stores/message_store.coffee
@@ -372,6 +372,11 @@

         return _conversationMemoize

+    # Retrieve a batch of message with various criteria
+    # target - is an {Object} with a property messageID or messageIDs or
+    #          conversationID or conversationIDs
+    #
+    # Returns an {Array} of {Immutable.Map} messages
     getMixed: (target) ->
         if target.messageID
             return [_messages.get(target.messageID)]


added model delete methods

added model delete methods

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


Only block keyup for keys where we have handled a keyup/press event

Fixes the issue of Vimium indiscriminately capturing keyup events,
introduced in PR #978.

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -321,6 +321,8 @@

       false

+handledKeydownEvents = []
+
 #
 # Sends everything except i & ESC to the handler in background_page. i & ESC are special because they control
 # insert mode which is local state to the page. The key will be are either a single ascii letter or a
@@ -390,31 +392,39 @@
       if (isEditable(event.srcElement))
         event.srcElement.blur()
       exitInsertMode()
-      DomUtils.suppressEvent(event)
+      DomUtils.suppressEvent event
+      handledKeydownEvents.push event

   else if (findMode)
     if (KeyboardUtils.isEscape(event))
       handleEscapeForFindMode()
-      DomUtils.suppressEvent(event)
+      DomUtils.suppressEvent event
+      handledKeydownEvents.push event

     else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey)
       handleDeleteForFindMode()
-      DomUtils.suppressEvent(event)
+      DomUtils.suppressEvent event
+      handledKeydownEvents.push event

     else if (event.keyCode == keyCodes.enter)
       handleEnterForFindMode()
-      DomUtils.suppressEvent(event)
+      DomUtils.suppressEvent event
+      handledKeydownEvents.push event

     else if (!modifiers)
       event.stopPropagation()
+      handledKeydownEvents.push event

   else if (isShowingHelpDialog && KeyboardUtils.isEscape(event))
     hideHelpDialog()
+    DomUtils.suppressEvent event
+    handledKeydownEvents.push event

   else if (!isInsertMode() && !findMode)
     if (keyChar)
       if (currentCompletionKeys.indexOf(keyChar) != -1)
-        DomUtils.suppressEvent(event)
+        DomUtils.suppressEvent event
+        handledKeydownEvents.push event

       keyPort.postMessage({ keyChar:keyChar, frameId:frameId })

@@ -432,11 +442,23 @@
      (currentCompletionKeys.indexOf(KeyboardUtils.getKeyChar(event)) != -1 ||
       isValidFirstKey(KeyboardUtils.getKeyChar(event))))
     event.stopPropagation()
+    handledKeydownEvents.push event

 onKeyup = (event) ->
   return unless handlerStack.bubbleEvent("keyup", event)
-  # Don't propagate the keyup to the underlying page, since Vimium has handled it. See #733.
-  event.stopPropagation() unless isInsertMode()
+  return if isInsertMode()
+
+  # Don't propagate the keyup to the underlying page if Vimium has handled it. See #733.
+  for keydown, i in handledKeydownEvents
+    if event.metaKey == keydown.metaKey and
+       event.altKey == keydown.altKey and
+       event.ctrlKey == keydown.ctrlKey and
+       event.keyIdentifier == keydown.keyIdentifier and
+       event.keyCode == keydown.keyCode
+
+      handledKeydownEvents.splice i, 1
+      event.stopPropagation()
+      break

 checkIfEnabledForUrl = ->
   url = window.location.toString()


Add menu item to jump to matching bracket

error: pathspec 'menus/bracket-matcher.cson' did not match any file(s) known to git

--- menus/bracket-matcher.cson
+++ menus/bracket-matcher.cson
@@ -0,0 +1,11 @@
+'menu': [
+  {
+    'label': 'Packages'
+    'submenu': [
+      'label': 'Bracket Matcher'
+      'submenu': [
+        { 'label': 'Go To Matching Bracket', 'command': 'bracket-matcher:go-to-matching-bracket' }
+      ]
+    ]
+  }
+]


Translation PT-BR (#3861)

Translation PT-BR (#3861)

Just  an small update.
Will do more!

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


Workaround for missing document.location inside child window in Windows Chrome.

--- app/models/CocoModel.coffee
+++ app/models/CocoModel.coffee
@@ -110,7 +110,7 @@
   save: (attrs, options) ->
     options ?= {}
     options.headers ?= {}
-    options.headers['X-Current-Path'] = document.location.pathname
+    options.headers['X-Current-Path'] = document.location?.pathname ? 'unknown'
     success = options.success
     error = options.error
     options.success = (model, res) =>


Update pt-PT.coffee

Update pt-PT.coffee

--- app/locale/pt-PT.coffee
+++ app/locale/pt-PT.coffee
@@ -323,8 +323,8 @@
     tip_reusable_software: "Antes de um software poder ser reutilizável, primeiro tem de ser utilizável."
     tip_optimization_operator: "Todas as linguagens têm um operador de otimização. Na maior parte delas esse operador é ‘//’."
     tip_lines_of_code: "Medir o progresso em programação pelo número de linhas de código é como medir o progresso da construção de um avião pelo peso. — Bill Gates"
-#    tip_source_code: "I want to change the world but they would not give me the source code."
-#    tip_javascript_java: "Java is to JavaScript what Car is to Carpet. - Chris Heilmann"
+    tip_source_code: "Quero mudar o mundo, mas não há maneira de me darem o código-fonte."
+    tip_javascript_java: "Java é para JavaScript o mesmo que Carro (Car) para Tapete (Carpet). - Chris Heilmann"

   game_menu:
     inventory_tab: "Inventário"
@@ -371,13 +371,13 @@
   subscribe:
     subscribe_title: "Subscrever"
     unsubscribe: "Cancelar Subscrição"
-#    confirm_unsubscribe: "Confirm Unsubscribe"
-#    never_mind: "Never Mind, I Still Love You"
-#    thank_you_months_prefix: "Thank you for supporting us these last"
-#    thank_you_months_suffix: "months."
-#    thank_you: "Thank you for supporting CodeCombat."
-#    sorry_to_see_you_go: "Sorry to see you go! Please let us know what we could have done better."
-#    unsubscribe_feedback_placeholder: "O, what have we done?"
+    confirm_unsubscribe: "Confirmar Cancelamento da Subscrição"
+    never_mind: "Não Importa, Gostamos de Ti à Mesma"
+    thank_you_months_prefix: "Obrigado por nos teres apoiado neste(s) último(s)"
+    thank_you_months_suffix: "mês(meses)."
+    thank_you: "Obrigado por apoiares o CodeCombat."
+    sorry_to_see_you_go: "Lamentamos ver-te partir! Por favor, diz-nos o que podíamos ter feito melhor."
+    unsubscribe_feedback_placeholder: "Oh, o que fomos fazer?"
     levels: "Pratica mais com níveis bónus!"
     heroes: "Heróis mais poderosos!"
     gems: "3500 gemas de bónus todos os meses!"
@@ -865,8 +865,8 @@
     price: "Preço"
     gems: "Gemas"
     active: "Activa"
-    subscribed: "Subscrito"
-    unsubscribed: "Não Subscrito"
+    subscribed: "Subscrito(a)"
+    unsubscribed: "Não Subscrito(a)"
     active_until: "Ativa Até"
     cost: "Custo"
     next_payment: "Próximo Pagamento"


atom: config: disable stuff

atom: config: disable stuff

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


clean-up

clean-up

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


Modularizes sass task

Modularizes sass task

error: pathspec 'grunt-tasks/sass.coffee' did not match any file(s) known to git

--- grunt-tasks/sass.coffee
+++ grunt-tasks/sass.coffee
@@ -0,0 +1,13 @@
+module.exports = (grunt) ->
+  grunt.config 'sass',
+    options:
+      sourcemap: 'none'
+      style: 'compressed'
+    dist:
+      files: [
+        expand: true
+        cwd: 'resources/styles'
+        src: '*.scss'
+        dest: 'resources/styles'
+        ext: '.css'
+      ]


Activity: dropdown items for new private message autocompleteview 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/andrewjcasal/koding.git/'


Declare initial View

Declare initial 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/AppGyver/supersonic.git/'


Add fileIO.coffee.

Add fileIO.coffee.

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

--- fileIO.coffee
+++ fileIO.coffee
@@ -0,0 +1,175 @@
+fs = require 'fs'
+path = require 'path'
+
+
+fileIO = exports
+
+isLiteral = fileIO.isLiteral = yes
+
+log = fileIO.log = (msg) ->
+  if isLiteral then console.log msg
+
+
+Object.defineProperties fileIO,
+  isFileSync:
+    value: (filePath) ->
+      unless path.existsSync filePath then return no
+      return (fs.statSync filePath).isFile()
+
+  isFile:
+    value: (filePath, cb) ->
+      path.exists filePath, (doesExist) ->
+        unless doesExist
+          cb undefined, no
+          return
+
+        fs.stat filePath, (err, stats) ->
+          if err?
+            cb err
+          else
+            cb undefined, stats.isFile()
+
+  isDirSync:
+    value: (dirPath) ->
+      unless path.existsSync dirPath then return no
+      return (fs.statSync dirPath).isDirectory()
+
+  isDir:
+    value: (dirPath, cb) ->
+      path.exists dirPath, (doesExist) ->
+        unless doesExist then cb undefined, no
+        fs.stat dirPath, (err, stats) ->
+          if err?
+            cb err
+          else
+            cb undefined, stats.isDirectory()
+
+  copyFileSync:
+    value: (sourceFile, targetFile) ->
+      if path.existsSync targetFile
+        if (fs.statSync targetFile).isDirectory()
+          fs.rmdirSync targetFile
+
+      data = fs.readFileSync sourceFile
+      @makeDirSync path.dirname targetFile
+      fs.writeFileSync targetFile, data
+      log "Copy <#{sourceFile}> to <#{targetFile}>"
+
+  makeDirSync:
+    value: (dir) ->
+      dir = path.resolve dir
+      names = dir.split /\\|\//
+
+      if names.length <= 1 then throw 'Cannot create directory on root or drives'
+
+      filePath = names[0]
+      for i in [1 .. names.length - 1]
+        filePath = path.join filePath, names[i]
+
+        unless path.existsSync filePath
+          fs.mkdir filePath
+          log "Create directory <#{filePath}>"
+
+  copyDirSync:
+    value: (sourceDir, targetDir, doesOverride = false) ->
+      unless path.existsSync sourceDir then throw "<#{sourceDir}> does not exist"
+
+      unless path.existsSync targetDir
+        fileIO.makeDirSync targetDir
+      else if (fs.statSync targetDir).isFile()
+        fs.unlinkSync targetDir
+
+      names = fs.readdirSync sourceDir
+
+      for name in names
+        src = path.join sourceDir, name
+        srcStats = fs.statSync src
+        des = path.join targetDir, name
+
+        if srcStats.isFile()
+          doesCopy = yes
+
+          if path.existsSync des
+            log "File <#{des}> exists"
+
+            if doesOverride is no
+              doesCopy = no
+
+          if doesCopy
+            @copyFileSync src, des
+        else if srcStats.isDirectory()
+          @copyDirSync src, des
+
+  deleteDirSync:
+    value: (dir) ->
+      unless path.existsSync dir
+        log 'Directory <#{dir}> does not exist'
+        return false
+
+      stat = fs.statSync dir
+      unless stat.isDirectory() then throw "Path <#{dir}> is not a directory"
+
+      act = (dir) ->
+        names = fs.readdirSync dir
+
+        for name in names
+          filePath = path.join dir, name
+
+          do (filePath) ->
+            stat = fs.statSync filePath
+
+            if stat.isFile()
+              log "Delete #{filePath}"
+              fs.unlinkSync filePath
+            else if stat.isDirectory()
+              act filePath
+
+        log "Remove #{dir}"
+        fs.rmdirSync dir
+      act dir
+
+  deleteSync:
+    value: (filePath) ->
+      unless path.existsSync filePath then return
+
+      stat = fs.statSync filePath
+
+      if stat.isFile()
+        fs.unlinkSync filePath
+      else if stat.isDirectory()
+        deleteDirSync filePath
+      else
+        throw 'Cannot delete <#{filePath}>'
+
+  # deleteDir:
+  #   value: (dir, callback) ->
+  #     throw 'Not yet implemented'
+  #     path.exists dir, (doesExist) ->
+  #       unless doesExist then callback "Directory <#{dir}> does not exist"
+
+  #       fs.stat dir, (err, stat) ->
+  #         if err then callback err
+  #         unless stat.isDirectory() then callback "Path <#{dir}> is not a directory"
+
+  #         act = (dir, callback) ->
+  #           fs.readdir dir, (err, names) ->
+  #             if err then callback err
+
+  #             for name in names
+  #               filePath = path.join dir, name
+
+  #               do (filePath) ->
+  #                 fs.stat filePath, (err, stat) ->
+  #                   if err then callback err
+
+  #                   if stat.isFile()
+  #                     log "Delete #{filePath}"
+  #                     fs.unlink filePath, (err) ->
+  #                       if err then callback err
+  #                   else if stat.isDirectory()
+  #                     act filePath, callback
+
+  #             log "Remove #{dir}"
+  #             fs.rmdir dir, (err) ->
+  #               if err then callback err
+  #         act dir, callback


gui: sort resources by name

gui: sort resources by name

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


client/webpack: add config.output module

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

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

--- client/webpack/config.output.coffee
+++ client/webpack/config.output.coffee
@@ -0,0 +1,9 @@
+{ BUILD_PATH, JS_BUNDLE_FILE, PUBLIC_PATH } = require './constants'
+
+module.exports = ->
+
+  return {
+    path: BUILD_PATH
+    filename: JS_BUNDLE_FILE
+    publicPath: PUBLIC_PATH
+  }


move SyncString time-log based sync prototype to docsync.coffee file

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

--- salvus/docsync.coffee
+++ salvus/docsync.coffee
@@ -0,0 +1,2 @@
+# Time log based synchronized editing
+


Add pluggable performance measurement logger

error: pathspec 'js-library/app/js/jail_iframe/classes/performance_measurement.coffee' did not match any file(s) known to git

--- js-library/app/js/jail_iframe/classes/performance_measurement.coffee
+++ js-library/app/js/jail_iframe/classes/performance_measurement.coffee
@@ -0,0 +1,52 @@
+load_moments = []
+last_sorted = 0
+
+add_timing_event = (name) ->
+  add_existing_timing_event name, new Date().getTime()
+
+add_existing_timing_event = (name, time) ->
+  load_moments.push(Object.freeze(name:name, time: time, idx: load_moments.length))
+
+get_sorted_moments = ->
+  if(load_moments.length > last_sorted)
+    load_moments.sort (x,y) ->
+      x.time - y.time || x.idx - y.idx
+    last_sorted = load_moments.length
+  load_moments.slice(0)
+
+get_relative_timings = ->
+  sorted_moments = get_sorted_moments()
+  sorted_moments.map( (o) -> { name:o.name, offset: o.time - sorted_moments[0].time})
+
+get_perf_summary = ->
+  moments = get_relative_timings()
+
+  max = (a,b) -> Math.max(a,b)
+
+  name_col_width = moments.map( (o) -> o.name.length).reduce(max)
+  offset_col_width = moments.map( (o) -> ('' + o.offset).length).reduce(max)
+  padder = new Array(max(name_col_width,offset_col_width)+1).join(' ')
+
+  moments.map( (o) ->
+      (o.name + padder).substr(0,name_col_width) + ' | ' +
+      (padder + o.offset).substr(-offset_col_width)
+    ).join('\n')
+
+FactlinkJailRoot.loaded_promise.then( ->
+  if window.performance && window.performance.timing
+    'fetchStart responseEnd domLoading domInteractive domContentLoadedEventEnd domComplete loadEventEnd'
+      .split(' ').forEach (timing_event) ->
+        add_existing_timing_event timing_event, window.performance.timing[timing_event]
+).then( ->
+  FactlinkJailRoot.delay 1000
+).then( ->
+  if FactlinkJailRoot.can_haz.log_jslib_loading_performance
+    console.log get_perf_summary()
+)
+
+FactlinkJailRoot.perf =
+  add_timing_event: add_timing_event
+  add_existing_timing_event: add_existing_timing_event
+  get_sorted_moments: get_sorted_moments
+  get_relative_timings: get_relative_timings
+  get_perf_summary: get_perf_summary


dont teardown

dont teardown

--- components/artwork_filter/test/view.coffee
+++ components/artwork_filter/test/view.coffee
@@ -20,7 +20,7 @@
       done()

   after ->
-    benv.teardown(false)
+    benv.teardown()

   beforeEach ->
     sinon.stub Backbone, 'sync'


experimental coffeescript version

experimental coffeescript version

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

--- src/heello.coffee
+++ src/heello.coffee
@@ -0,0 +1,196 @@
+EventEmitter = require 'events'.EventEmitter
+url = require 'url'
+util = require 'util'
+request = require 'superagent'
+schema = require __dirname + '/schema.json'
+pkg = require __dirname + '../package.json'
+
+
+###
+Array Remove - By John Resig (MIT Licensed)
+###
+Array::remove = (from, to) ->
+	rest = @slice (to or from) + 1 or @length
+	@length = if from < 0 then @length + from else from
+	return @push.apply @, rest
+
+`const ETOKENEXPIRED = 'expired_token'`
+
+class heelloApi extends EventEmitter
+	constructor: (options) ->
+		if options? then options = {}
+		for own controller, actions of schema then do (controller, actions) =>
+			@__defineGetter__ controller, =>
+				new heelloController @, controller, actions
+		@conf =
+			appId: options.appId or false
+			appSecret: options.appSecret or false
+			callbackURI: options.callbackURI or false,
+			protocol: options.protocol or 'https',
+			domain: options.domain or 'api.heello.com',
+			userAgent: options.userAgent or 'node-heello_v' + pkg.version,
+			apiVersion: 'v1'
+		Object.freeze @conf
+
+		@rateLimitRemaining = @rateLimitMax = -1
+		@rateLimitReset = @accessToken = @refreshToken = null
+
+		if @conf.appId is false or @conf.appSecret is false or @conf.callbackURI is false
+			throw new Error 'appId, appSecret, and callbackURI must be provided'
+	getAuthURI: (state) ->
+		query =
+			client_id: @conf.appId
+			redirect_uri: @conf.callbackURI
+			response_type: 'code'
+		query.state = state if state?
+		return url.format {
+			protocol: @conf.protocol
+			hostname: @conf.domain
+			pathname: '/oauth/authorize'
+			query: query
+		}
+	getTokens: (code, fn) ->
+		return @_updateTokens code, 'authorization_code', fn
+	refreshTokens: (code, fn) ->
+		return @_updateTokens code, 'refresh_token', fn
+	_updateTokens: (code, type, fn) ->
+		try
+			query =
+				client_id: @conf.appId
+				client_secret: @conf.appSecret
+				redirect_uri: @conf.callbackURI
+				grant_type: type
+			if type is 'authorization_code'
+				query.code = code
+			else if type is 'refresh_token'
+				query.refresh_token = code
+			else
+				throw new Error 'unknown token update request'
+
+			req = request 'POST', util.format '%s://%s/oauth/token', @conf.protocol, @conf.domain
+			req.set 'Accept', 'application/vnd.heello.' + @conf.apiVersion
+			req.set 'User-Agent', @conf.userAgent
+			req.timeout 15 * 1000
+			req.type 'form'
+			req.send query
+			req.end (err, res) =>
+				if err? then throw err
+				@refreshToken = res.body.refresh_token
+				@accessToken = res.body.access_token
+				fn null
+
+		catch err
+			fn err
+	_request: (options, fn) ->
+		try
+			req = request options.method or 'GET', util.format '%s://%s%s', @conf.protocol, @conf.domain, options.url
+			req.set 'User-Agent', @conf.userAgent
+			req.timeout 15*1000
+			if options.method is 'POST' or options.method is 'PUT'
+				req.type 'form'
+				req.send options.queryData or {}
+				#if options.media then
+					# meh
+			else
+				req.query options.queryData or {}
+
+			if req.req._headers.cookie?
+				`// workaround for superagent bug: https://github.com/visionmedia/superagent/issues/206 `
+				delete req.req._headers.cookie
+				delete req.req._headerNames.cookie
+
+			req.end (err, res) =>
+				if err? then throw err
+				# rate limiting
+				if res.header['x-ratelimit-limit']?
+					@rateLimitMax = res.header['x-ratelimit-limit']
+					@rateLimitRemaining = res.header['x-ratelimit-remaining']
+					@rateLimitReset = new Date parseInt res.header['x-ratelimit-reset'] * 1000
+
+				if not res.ok
+					if res.status is 429 or res.status is 503
+						@emit 'apiLimit', res.error
+						throw new Error 'API limit reached'
+					else if res.status is 401 and res.body.error is ETOKENEXPIRED
+						throw new Error ETOKENEXPIRED
+					else if res.status is 401
+						@emit 'apiAuthError', res.error
+						throw new Error 'Authorization failure'
+					else
+						fn res.error, null, res
+				else
+					fn null, res.body, res
+		catch err
+			fn err
+
+class heelloController
+	constructor: (@api, @controller, actions) ->
+		for own action, details of actions then do (action, details) =>
+			@__defineGetter__ action, =>
+				new heelloAction @, controller, action, details
+
+class heelloAction
+	constructor: (@api, @controller, @action, details) ->
+		@method = details.method or 'GET'
+		@url = if details.url then util.format '/%s/%s.json', controller, details.url else '/' + controller + '.json'
+		@needsAuth = details.needsAuth or false
+		@urlParams = []
+		re = /:([a-z0-9]+)/ig
+		while (res = re.exec @url) isnt null
+			@urlParams.push res[1]
+
+		@queryParams = details.reqQueryParams or []
+		@mediaParams = details.mediaParams or []
+
+		if @needsAuth then @queryParams.push 'access_token'
+
+		@reqParams = @urlParams.slice().concat @queryParams
+
+		return (params, fn) =>
+			reqParams = @reqParams.slice()
+			if typeof params is 'function'
+				fn = params
+				params = {}
+
+			options =
+				method: @method
+				url: @url
+				params: {}
+				media: {}
+
+			try
+				if @api.accessToken?
+					params['access_token'] = @api.accessToken
+				else if not @needsAuth
+					params['key'] = @api.conf.appId
+				else
+					throw new Error util.format 'api call heelloApi.%s.%s requires authentication, none provided', @controller, @action
+
+				for own key, param of params then do (param) ->
+					if reqParams.indexOf param isnt -1 then reqParams.remove reqParams.indexOf param
+				if reqParams.length > 0
+					throw new Error util.format 'api call heelloApi.%s.%s required parameter(s) [%s] not provided', @controller, @action, reqParams.join ', '
+
+				@urlParams.forEach (p) ->
+					options.url = options.url.replace ':' + p, params[p]
+					delete params[p]
+				@mediaParams.forEach (p) ->
+					if params[p]?
+						options.media[p] = params[p]
+						delete params[p]
+
+				if Object.keys(options.media).length is 0
+					delete options.media
+
+				options.queryData = params
+				@api._request options, (err, json, res) =>
+					if err and err.message is ETOKENEXPIRED
+						@api.refreshTokens () ->
+							options.queryData['access_token'] = @api.accessToken
+							@api._request options, fn
+					else
+						fn err, json, res
+			catch err
+				fn err
+
+module.exports = heelloApi


Erase window from weak map immediately after it's destroyed.

Otherwise it could happend that developers accessed the window after
it's destroyed but before it's GCed.

--- browser/atom/objects_registry.coffee
+++ browser/atom/objects_registry.coffee
@@ -55,7 +55,10 @@
   objectsWeakMap.add obj

   # Also remember all windows.
-  windowsWeakMap.add obj if obj.constructor is BrowserWindow
+  if obj.constructor is BrowserWindow
+    id = windowsWeakMap.add obj
+    obj.on 'destroyed', ->
+      windowsWeakMap.remove id

 exports.add = (processId, routingId, obj) ->
   # Some native objects may already been added to objectsWeakMap, be care not


Disabled overlay manager on the server.

Disabled overlay manager on the server.

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


store sort order per mode

store sort order per mode

--- resources/assets/coffee/react/beatmap-discussions/discussions.coffee
+++ resources/assets/coffee/react/beatmap-discussions/discussions.coffee
@@ -57,15 +57,10 @@
     super props

     @state =
-      sortField: if @props.mode == 'timeline' then 'timeline' else 'created_at'
-
-
-  componentWillReceiveProps: (nextProps) =>
-    if _.includes(['created_at', 'timeline'], @state.sortField)
-      if nextProps.mode == 'timeline'
-        @setState sortField: 'timeline'
-      else
-        @setState sortField: 'created_at'
+      sort:
+        generalAll: 'updated_at'
+        general: 'updated_at'
+        timeline: 'timeline'

   render: =>
@@ -87,9 +82,9 @@
               onClick: @changeSort
               span className: "#{bn}__toolbar-link-content", osu.trans('beatmaps.discussions.sort._')
               el Icon,
-                name: sortPresets[@state.sortField].icon
+                name: sortPresets[@currentSort()].icon
                 parentClass: "#{bn}__toolbar-link-content"
-              span className: "#{bn}__toolbar-link-content", sortPresets[@state.sortField].text
+              span className: "#{bn}__toolbar-link-content", sortPresets[@currentSort()].text

             a
               href: '#'
@@ -160,10 +155,17 @@
   changeSort: (e) =>
     e.preventDefault()

-    @setState sortField: if @state.sortField == 'updated_at'
-                           if @props.mode == 'timeline' then 'timeline' else 'created_at'
-                         else
-                           'updated_at'
+    sort = {}
+    sort[@props.mode] = if @currentSort() == 'updated_at'
+                          if @props.mode == 'timeline' then 'timeline' else 'created_at'
+                        else
+                          'updated_at'
+
+    @setState sort: _.assign({}, @state.sort, sort)
+
+
+  currentSort: =>
+    @state.sort[@props.mode]

   expand: (e) =>
@@ -181,12 +183,12 @@

   isTimelineVisible: =>
-    @props.mode == 'timeline' && @state.sortField == 'timeline'
+    @props.mode == 'timeline' && @currentSort() == 'timeline'

   sortedDisussions: ->
     discussions = @props.currentDiscussions[@props.mode].slice(0)
-    discussions.sort sortPresets[@state.sortField].sort
+    discussions.sort sortPresets[@currentSort()].sort

   timelineCircle: =>


Remove test for non existing component

Remove test for non existing component

[#97184290]

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


used TabCAT.Console.start() on login page, doesn't seem to mind lack of statusBar

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


Check existance of editorSub before disposing.

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/rafalprzywarski/test-status.git/'


Add checking to version number in 'gulp compile'

To ensure all number is interger and between 0 and 65535

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/davask/Popup-my-Bookmarks.git/'


Fixes gulp pack

Fixes gulp pack

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/vtex/dotnet-caching.git/'


hide update orders button if no rules are found


fix path of contentmodal

fix path of contentmodal


webterm: Added control codes \e[I and \e[Z (tab cursor movements).

--- client/landing/app/Applications/WebTerm.kdapplication/src/ControlCodeReader.coffee
+++ client/landing/app/Applications/WebTerm.kdapplication/src/ControlCodeReader.coffee
@@ -207,6 +207,7 @@
           "D": (params) -> terminal.cursor.move -(params[0] ? 1), 0
           "G": (params) -> terminal.cursor.moveTo (params[0] ? 1) - 1, terminal.cursor.y
           "H": (params) -> terminal.cursor.moveTo (params[1] ? 1) - 1, getOrigin() + (params[0] ? 1) - 1
+          "I": (params) -> terminal.cursor.moveTo (Math.floor(terminal.cursor.x / 8) + (params[0] ? 1)) * 8, terminal.cursor.y unless params[0] == 0
           "J": switchParameter 0
             0: ->
               terminal.writeEmptyText terminal.sizeX - terminal.cursor.x
@@ -225,6 +226,7 @@
           "S": (params) -> terminal.screenBuffer.scroll (params[0] ? 1)
           "T": (params) -> terminal.screenBuffer.scroll -(params[0] ? 1)
           "X": (params) -> terminal.writeEmptyText params[0] ? 1
+          "Z": (params) -> terminal.cursor.moveTo (Math.ceil(terminal.cursor.x / 8) - (params[0] ? 1)) * 8, terminal.cursor.y unless params[0] == 0
           "c": switchRawParameter 0
             0:   -> terminal.server.controlSequence "\x1B[>?1;2c"
             ">": -> terminal.server.controlSequence "\x1B[>0;261;0c"


OMG what???

OMG what???

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


Fix workspace model spec now that legacy panel class is added in view

--- spec/workspace-spec.coffee
+++ spec/workspace-spec.coffee
@@ -500,4 +500,3 @@

         expect(panel).toBeDefined()
         expect(addPanelSpy).toHaveBeenCalledWith({panel, index: 0})
-        expect(panel.getClassName()).toBe 'overlay from-top' # the default


Add logger to the connect file

Add logger to the connect file

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


Account for both types of timeouts in retry logic

--- app/models/SuperModel.coffee
+++ app/models/SuperModel.coffee
@@ -309,7 +309,7 @@
         console.log "Didn't load model in #{timeToWait}ms (attempt ##{@loadsAttempted}), trying again: ", this
       @fetchModel()
       @listenTo @model, 'error', (levelComponent, request) ->
-        if request.status isnt 504
+        if request.status not in [504, 524]
           clearTimeout(@timeoutID)
       clearTimeout(@timeoutID) if @timeoutID
       @timeoutID = setTimeout(tryLoad, timeToWait)


more logging format tweaks

more logging format tweaks

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


anpassung open func

anpassung open func

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


Remove unused require

Remove unused require

--- src/packages/outline-view/src/outline-view.coffee
+++ src/packages/outline-view/src/outline-view.coffee
@@ -1,4 +1,4 @@
-{View, $$} = require 'space-pen'
+{$$} = require 'space-pen'
 SelectList = require 'select-list'
 TagGenerator = require 'outline-view/src/tag-generator'
 TagReader = require 'outline-view/src/tag-reader'


Add compare class

Add compare class

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

--- app/src/utils/compare.coffee
+++ app/src/utils/compare.coffee
@@ -0,0 +1,55 @@
+
+ledger.utils ?= {}
+
+###
+  Utility class for dealing with comparison result.
+###
+class ledger.utils.ComparisonResult
+
+  ###
+    @param [Any] lhs The left hand side object of the comparison.
+    @param [Any] rhs The right hand side object of the comparison.
+    @param [Function] comparisonHandler The function that performs the comparison. It takes lhs and rhs in parameter and returns
+      an integer. The result must be equal to 0 if lhs and rhs are equals, if lhs is greater than rhs it must be positive and non null.
+      Finally the result must be negative and non null if lhs is less than rhs.
+  ###
+  constructor: (lhs, rhs, comparisonHandler) ->
+    @_handler = comparisonHandler
+    @_lhs = lhs
+    @_rhs = rhs
+
+  ###
+    Performs the comparison by using the comparisonHandler.
+    @see ledger.utils.ComparisonResult#constructor
+  ###
+  compare: () -> @_handler(@_lhs, @_rhs)
+
+  ###
+    Checks if lhs and rhs are equal
+    @return [Boolean] True if lhs and rhs are equal, false otherwise
+  ###
+  eq: () -> @compare() == 0
+
+  ###
+    Checks if lhs is less than rhs.
+    @return [Boolean] True if lhs is less than rhs, false otherwise
+  ###
+  lt: () -> @compare() < 0
+
+  ###
+    Checks if lhs and rhs are equal or if lhs is less than rhs
+    @return [Boolean] True if lhs and rhs are equal or if lhs is less than rhs, false otherwise
+  ###
+  lte: () -> @compare() <= 0
+
+  ###
+    Checks if lhs is greater than rhs
+    @return [Boolean] True if lhs is greater than rhs, false otherwise
+  ###
+  gt: () -> @compare() > 0
+
+  ###
+    Checks if lhs and rhs are equal or if lhs is greater than rhs
+    @return [Boolean] True if lhs and rhs are equal or if lhs is greater than rhs, false otherwise
+  ###
+  gte: () -> @compare() >= 0


Use line comments instead of block comments

error: pathspec 'settings/d-struct.cson' did not match any file(s) known to git

--- settings/d-struct.cson
+++ settings/d-struct.cson
@@ -0,0 +1,3 @@
+'.source.d':
+  'editor':
+    'commentStart': '// '


Specify callNow as false to observeConfig

Previously the project paths were always loaded on first launch
since reloadPaths was being set to true.

--- lib/project-view.coffee
+++ lib/project-view.coffee
@@ -14,8 +14,10 @@

     @reloadPaths = false if @paths?.length > 0

-    @subscribe $(window), 'focus', => @reloadPaths = true
-    @observeConfig 'fuzzy-finder.ignoredNames', => @reloadPaths = true
+    @subscribe $(window), 'focus', =>
+      @reloadPaths = true
+    @observeConfig 'fuzzy-finder.ignoredNames', callNow: false, =>
+      @reloadPaths = true

   toggle: ->
     if @hasParent()


[bot] Adding a timeout for Twitch API requests

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


Restore assignment of @project ivar in TextBuffer

Because TextBuffers need a reference to `project` during deserialization,
and because the project global deserializes text buffers while it itself
is being deserialized (which happens before the global is actually
assigned), we have to pass a project reference into TextBuffer. This is
really annoying and makes me want to store the references to open buffers
elsewhere. But for now it's the only way to break the circularity.

--- src/app/text-buffer.coffee
+++ src/app/text-buffer.coffee
@@ -33,12 +33,13 @@
   # initialText - A {String} setting the starting text
   constructor: (optionsOrState={}, params={}) ->
     if optionsOrState instanceof telepath.Document
+      {@project} = params
       @state = optionsOrState
       @text = @state.get('text')
       filePath = @state.get('relativePath')
       @id = @state.get('id')
     else
-      {filePath, initialText} = optionsOrState
+      {@project, filePath, initialText} = optionsOrState
       @text = site.createDocument(initialText, shareStrings: true) if initialText
       @id = guid.create().toString()
       @state = site.createDocument
@@ -47,7 +48,7 @@
         version: @constructor.version

     if filePath
-      @setPath(project.resolve(filePath))
+      @setPath(@project.resolve(filePath))
       if @text
         @updateCachedDiskContents()
       else
@@ -74,7 +75,7 @@
     unless @destroyed
       @file?.off()
       @destroyed = true
-      project?.removeBuffer(this)
+      @project?.removeBuffer(this)

   retain: ->
     @refcount++
@@ -156,7 +157,7 @@
     @state.get('relativePath')

   setRelativePath: (relativePath) ->
-    @setPath(project.resolve(relativePath))
+    @setPath(@project.resolve(relativePath))

   # Sets the path for the file.
   #
@@ -168,7 +169,7 @@
     @file = new File(path)
     @file.read() if @file.exists()
     @subscribeToFile()
-    @state.set('relativePath', project.relativize(path))
+    @state.set('relativePath', @project.relativize(path))
     @trigger "path-changed", this

   # Retrieves the current buffer's file extension.
@@ -593,7 +594,7 @@
   checkoutHead: ->
     path = @getPath()
     return unless path
-    project.getRepo()?.checkoutHead(path)
+    @project.getRepo()?.checkoutHead(path)

   # Checks to see if a file exists.
   #


Initial commit

Initial commit

engine.coffee, CoffeeScript i.e., transcompiles to JavaScript -> engine.js
Help: http://coffeescript.org/.

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

--- source/core/coffee/module/engine.coffee
+++ source/core/coffee/module/engine.coffee
@@ -0,0 +1,18 @@
+#
+# CBBL®
+# Computational Biology and Bioinformatics Laboratory.
+# _______________________________________________________________
+# CoffeeScript, http://coffeescript.org/.
+# The AMD JavaScript - for defining "Engine" configurations.
+# _______________________________________________________________
+# Architecture and Code Handcrafted by Prabhat Kumar.
+# Architectuur en Code handgemaakt door Prabhat Kumar.
+# @author    : Prabhat Kumar [http://prabhatkumar.org/]
+# @copyright : Sequømics Corporation [http://sequomics.com/]
+# _______________________________________________________________
+# @date      : 10-May-2016
+# @license   : Apache, version 2.0
+# @require   : Node.js®
+# @require   : NPM
+# @require   : Grunt
+# _______________________________________________________________


Fix bug in cloning field options.

Fix bug in cloning field options.

The typo in the initPropertyFields() function would cause a class's
private field-option members to be a reference to the parent classes
members, causing child member options to be defined on the parent.

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


don't let TabCAT.Clock clear out TabCAT namespace


this might work, hopefully

this might work, hopefully

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


upd: test

upd: test

--- test/basic.coffee
+++ test/basic.coffee
@@ -54,9 +54,11 @@
 	if out and out.then
 		out.then (v) ->
 			report assert v, shouldBe
+		, (->)
 	else
 		report assert fn(), shouldBe

+Yaku.enableLongStackTrace()

 $val = { val: 'ok' }

@@ -99,28 +101,45 @@
 				r 'ok'
 			, 10

-test 'unhandled rejection', $val, ->
-	new Yaku (r) ->
-		old = Yaku.onUnhandledRejection
-
-		Yaku.onUnhandledRejection = (reason, p) ->
-			old reason, p
-			Yaku.onUnhandledRejection = old
-			r reason
-
-		Yaku.reject $val
-
-test 'unhandled rejection inside a catch', $val, ->
-	new Yaku (r) ->
-		old = Yaku.onUnhandledRejection
-
-		Yaku.onUnhandledRejection = (reason, p) ->
-			old reason, p
-			Yaku.onUnhandledRejection = old
-			r reason
-
-		Yaku.reject().catch ->
-			Yaku.reject $val
+Yaku.resolve().then ->
+	test 'unhandled rejection', $val, ->
+		new Yaku (r) ->
+			old = Yaku.onUnhandledRejection
+
+			Yaku.onUnhandledRejection = (reason, p) ->
+				old reason, p
+				Yaku.onUnhandledRejection = old
+				r reason
+
+			setTimeout ->
+				Yaku.reject $val
+			, 3000
+
+.then ->
+	test 'no unhandled rejection', $val, ->
+		new Yaku (resolve, reject) ->
+			old = Yaku.onUnhandledRejection
+
+			Yaku.onUnhandledRejection = (reason, p) ->
+				Yaku.onUnhandledRejection = old
+				reject()
+
+			Yaku.reject().catch ->
+				setTimeout ->
+					resolve $val
+				, 100
+
+.then ->
+	test 'unhandled rejection inside a catch', $val, ->
+		new Yaku (r) ->
+			old = Yaku.onUnhandledRejection
+
+			Yaku.onUnhandledRejection = (reason, p) ->
+				Yaku.onUnhandledRejection = old
+				r reason
+
+			Yaku.reject().catch ->
+				Yaku.reject $val

 randomPromise = (i) ->
 	new Yaku (r) ->


NewMemberLinkGroup loader fix

NewMemberLinkGroup loader fix

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


Fixed the matches order on the ladder team page.

--- app/views/play/ladder/team_view.coffee
+++ app/views/play/ladder/team_view.coffee
@@ -87,6 +87,7 @@
       }

     ctx.matches = (convertMatch(match) for match in @session.get('matches') or [])
+    ctx.matches.reverse()
     ctx

   afterRender: ->


Fix error when klout_score is defined but klout_profile is not

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/gnip/search-api-rails-demo.git/'


Strip whitespace from CC input field

Strip whitespace from CC input field

--- app/assets/javascripts/campaigns.js.coffee
+++ app/assets/javascripts/campaigns.js.coffee
@@ -69,7 +69,7 @@
     $form = $(form)

     cardData =
-      number: $form.find('#card_number').val()
+      number: $form.find('#card_number').val().replace(/\s/g, "")
       expiration_month: $form.find('#expiration_month').val()
       expiration_year: $form.find('#expiration_year').val()
       security_code: $form.find('#security_code').val()


get rid of switch

get rid of switch

--- resources/assets/coffee/_classes/store-supporter-tag-price.coffee
+++ resources/assets/coffee/_classes/store-supporter-tag-price.coffee
@@ -66,16 +66,10 @@

   durationText: ->
     duration = @durationInYears()
-    yearsText = switch duration.years
-                when 0
-                  ''
-                else
+    yearsText = if duration.years > 0
                   Lang.choice('supporter_tag.duration.years', duration.years, length: duration.years)

-    monthsText = switch duration.months
-                 when 0
-                   ''
-                 else
+    monthsText = if duration.months > 0
                    Lang.choice('supporter_tag.duration.months', duration.months, length: duration.months)

     _.compact([yearsText, monthsText]).join(', ')


Use a wider documentation browser to support the new docs

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


[repl] fix macro declarations in the repl

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 Helpers class including a bunch of helper methods - to be tested

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

--- src/browser/libraries/Helpers.coffee
+++ src/browser/libraries/Helpers.coffee
@@ -0,0 +1,96 @@
+_      = require 'underscore'
+Config = require './Config.coffee'
+
+class Helpers
+
+    constructor: ->
+        global = @
+
+        ###*
+         * Capitalize words
+         * @return {String}
+        ###
+        String::capitalizeWords = -> @replace /^.|\s./g, (char)-> char.toUpperCase()
+
+        ###*
+         * Bound to the global object but used only with
+         * jQuery ($) objects. Temporarily till jQuery 2.0 is available through npm
+         *
+         * @param  {Function} callback
+         * @return {Object}
+        ###
+        Object::onEnter = (callback)-> global.bind_enter_keypress @, callback
+
+    ###*
+     * Verify whether a text is in the arabic langauge
+     *
+     * @param  {String}  str
+     * @return {Boolean}
+    ###
+    is_arabic: (str)->
+            arabic = /[\u0600-\u06FF]/
+            arabic.test str
+
+    ###*
+     * Open a new browser window
+     * @param  {String} url
+     * @param  {String} name  window name
+     * @param  {Object} props window properties
+     * @return {Window}
+    ###
+    open_window: (url, name, props)-> window.open url, name, _.map(props, (value, key)-> "#{key}=#{value}").join(',')
+
+    url:
+        ###*
+         * Parse and return a query string (location.search) as an object
+         *
+         * @param  {String} query_string location.search
+         * @param  {String} key          (Optional) a parameter to return out of the query
+         * @return {Object}
+        ###
+        query: (query_string, key)->
+                    query_string = query_string.substr(1).split '&'
+                    parsed_query_string = {}
+                    _.map(query_string, (value)-> parsed_query_string[value.split('=')[0]] = decodeURIComponent value.split('=')[1] )
+                    if key? then parsed_query_string[key] else parsed_query_string
+
+        ###*
+         * Build a query string out of an object
+         *
+         * @param  {Object} params
+         * @return {String}
+        ###
+        build_query: (params)-> _.map(params, (value, key)-> "#{key}=#{encodeURIComponent value}").join '&'
+
+    ###*
+     * Bind the enter key press event to an array of DOM Elements
+     * @param  {Object}   elements jQuery object
+     * @param  {Function} callback
+     * @return {void}
+    ###
+    bind_enter_keypress: (elements, callback)->
+
+        if elements? and callback?
+            for element in elements
+                element.onkeypress = (e)=> @on_enter e, callback
+
+    ###*
+     * Call a method when the enter event occurs
+     * @param  {Object}   event
+     * @param  {Function} callback
+     * @return {void}
+    ###
+    on_enter: (event, callback)->
+        if @is_enter event
+            callback(event) if typeof callback is 'function'
+
+    ###*
+     * Detect an Enter key press
+     * @param  {Object}  event
+     * @return {Boolean}
+    ###
+    is_enter: (event)->
+        keycode = event?.which ? event.keyCode
+        keycode is 13
+
+module.exports = new Helpers


Added scripts/prime-number.coffee

Added scripts/prime-number.coffee

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

--- scripts/prime-number.coffee
+++ scripts/prime-number.coffee
@@ -0,0 +1,53 @@
+# Description:
+#  Yukiho speaks about prime numbers
+#
+# Commands:
+#   [number] - When number is prime number, Hubot talks us about prime numbers
+#   素数 - Hubot speaks about prime numbers
+
+module.exports = (robot) ->
+  robot.hear /-?\d{1,7}/g, (msg) ->
+    #msg.send msg.match[0]
+    for strNum in msg.match
+      num = Number(strNum)
+      if(testPrimality(num) == false)
+        continue
+
+      m = num + "は素数です．修論ダメです"
+
+      msg.send m
+      return
+
+  robot.hear /素数/i, (msg) ->
+    maxNumber = 10000
+    primeNumbers = getPrimeNumbers(maxNumber)
+    i = Math.floor(Math.random() * primeNumbers.length)
+    if i >= primeNumbers.length then i = primeNumbers - 1
+    pn = primeNumbers[i]
+    m = "好きなの素数は" + pn + "です．修論ダメです"
+
+    msg.send m
+
+getPrimeNumbers = (max) ->
+  if max <= 1
+    return []
+  primeNumbers = []
+  primeNumbers.push(2)
+  for n in [2..max]
+    isPrime = true
+    for i in [0..primeNumbers.length]
+      if (primeNumbers[i] * primeNumbers[i] > n)
+        break
+      if 0 == (n % primeNumbers[i])
+        isPrime = false
+        break
+    if isPrime
+      primeNumbers.push(n)
+
+  return primeNumbers
+
+testPrimality = (num) ->
+  if num <= 1
+    return false
+  primeNumbers = getPrimeNumbers(num)
+  return (primeNumbers[primeNumbers.length - 1] == num)


corrects running tests

corrects running tests

--- components/split_test/running_tests.coffee
+++ components/split_test/running_tests.coffee
@@ -35,5 +35,5 @@
     outcomes:
       featured: 0.5
       artworks: 0.5
-    edge: 'new'
+    edge: 'artworks'
     dimension: 'dimension6'


Fix Date Preset auto-selection

Fix Date Preset auto-selection

Fix autoselection when from/to are function and not values

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


Init Settings directly instead of via settings.load, and only do it once

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -68,8 +68,6 @@
     @port = true
     Settings.init()

-  load: -> @init() unless @port
-
 #
 # Give this frame a unique (non-zero) id.
 #
@@ -156,7 +154,7 @@
 #
 initializePreDomReady = ->
   Settings.addEventListener "load", LinkHints.init.bind LinkHints
-  settings.load()
+  Settings.init()

   initializeModes()
   checkIfEnabledForUrl()
@@ -240,7 +238,6 @@
 #
 onFocus = (event) ->
   if event.target == window
-    settings.load()
     chrome.runtime.sendMessage handler: "frameFocused", frameId: frameId
     checkIfEnabledForUrl true


Remove unused code in handleDeleteForFindMode

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -725,14 +725,7 @@
     window.getSelection().addRange(range)
   focusFoundLink() || selectFoundInputElement()

-# Return true if character deleted, false otherwise.
-handleDeleteForFindMode = ->
-  if findModeQuery.rawQuery.length == 0
-    HUD.hide()
-    false
-  else
-    HUD.showFindMode findModeQuery.rawQuery.substring(0, findModeQuery.rawQuery.length - 1)
-    true
+handleDeleteForFindMode = -> HUD.hide(); false

 # <esc> sends us into insert mode if possible, but <cr> does not.
 # <esc> corresponds approximately to 'nevermind, I have found it already' while <cr> means 'I want to save


Workspace: Impelemented switching to class.

--- client/app/Applications/Classroom.kdapplication/Views/classroomclassthumbview.coffee
+++ client/app/Applications/Classroom.kdapplication/Views/classroomclassthumbview.coffee
@@ -41,8 +41,14 @@
     @loader.hide()

   click: ->
-    log "should open class"
-    @emit "EnrollmentRequested", @getData()  if @getOptions().type isnt "enrolled"
+    data    = @getData()
+    appView = @getDelegate()
+    chapter = data.chapter
+
+    @loader.show()
+    appView.goToClass data.name, chapter, =>
+      @loader.hide()
+    @emit "EnrollmentRequested", data  if @getOptions().type isnt "enrolled"

   pistachio: ->
     data      = @getData()


landing: already member user creating a team last step fix


Adds tatu script

Adds tatu script

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

--- src/tatu.coffee
+++ src/tatu.coffee
@@ -0,0 +1,13 @@
+module.exports = (node, attr = 'data-tu') ->
+  result = {}
+
+  for el in node.querySelectorAll "[#{attr}]"
+    prop = el.getAttribute attr
+
+    if prop of result
+      result[prop] = [result[prop]] unless result[prop] instanceof Array
+      result[prop].push el.textContent
+    else if prop
+      result[prop] = el.textContent
+
+  result


Shape tool spec

Shape tool spec

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

--- spec/shape-tool-spec.coffee
+++ spec/shape-tool-spec.coffee
@@ -0,0 +1,52 @@
+SVG = require '../vendor/svg'
+
+ShapeTool = require '../src/shape-tool'
+SelectionModel = require '../src/selection-model'
+Size = require '../src/size'
+Point = require '../src/point'
+Rectangle = require '../src/rectangle'
+
+describe 'ShapeTool', ->
+  [tool, svg, canvas, selectionModel] = []
+
+  beforeEach ->
+    canvas = document.createElement('canvas')
+    jasmine.attachToDOM(canvas)
+    svg = SVG(canvas)
+    selectionModel = new SelectionModel()
+    tool = new ShapeTool(svg, {selectionModel})
+
+  describe "when activated with Rectangle", ->
+    beforeEach ->
+      tool.activate('Rectangle')
+      expect(selectionModel.getSelected()).toBe null
+
+    it "creates a rectangle when dragging", ->
+      svg.node.dispatchEvent(jasmine.buildMouseEvent('mousedown', pageX: 20, pageY: 30))
+      selected = selectionModel.getSelected()
+      expect(selected instanceof Rectangle).toBe true
+      expect(selected.getPosition()).toEqual new Point(20, 30)
+      expect(selected.getSize()).toEqual new Size(0, 0)
+
+      svg.node.dispatchEvent(jasmine.buildMouseEvent('mousemove', pageX: 30, pageY: 50))
+      expect(selected.getPosition()).toEqual new Point(20, 30)
+      expect(selected.getSize()).toEqual new Size(10, 20)
+
+      svg.node.dispatchEvent(jasmine.buildMouseEvent('mousemove', pageX: 10, pageY: 50))
+      expect(selected.getPosition()).toEqual new Point(10, 30)
+      expect(selected.getSize()).toEqual new Size(10, 20)
+
+      svg.node.dispatchEvent(jasmine.buildMouseEvent('mousemove', pageX: 10, pageY: 10))
+      expect(selected.getPosition()).toEqual new Point(10, 10)
+      expect(selected.getSize()).toEqual new Size(10, 20)
+
+      svg.node.dispatchEvent(jasmine.buildMouseEvent('mousemove', pageX: 30, pageY: 10))
+      expect(selected.getPosition()).toEqual new Point(20, 10)
+      expect(selected.getSize()).toEqual new Size(10, 20)
+
+      svg.node.dispatchEvent(jasmine.buildMouseEvent('mouseup'))
+
+      # mousemove events dont change it after the mouse up
+      svg.node.dispatchEvent(jasmine.buildMouseEvent('mousemove', pageX: 200, pageY: 150))
+      expect(selected.getPosition()).toEqual new Point(20, 10)
+      expect(selected.getSize()).toEqual new Size(10, 20)


fix indentation

fix indentation

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


add util.uid and util.guid

add util.uid and util.guid

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

--- src/util.coffee
+++ src/util.coffee
@@ -0,0 +1,10 @@
+newId = require("uuid-pure").newId
+
+exports.uid = (length)->
+  newId length, 64
+
+exports.guid = ->
+  "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace /[xy]/g, (c) ->
+    r = Math.random() * 16 | 0
+    v = if c is "x" then r else (r & 0x3 | 0x8)
+    v.toString 16


fixed javascript so that it would only initialize map when the gon object existed

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


switch to classes for presence client

switch to classes for presence client

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


onInit, onReInit, onBeforeChange, onAfterChange are callbacks

--- app/scripts/app.coffee
+++ app/scripts/app.coffee
@@ -20,10 +20,10 @@
       fade: "@"
       infinite: "@"
       lazyLoad: "@"
-      onBeforeChange: "@"
-      onAfterChange: "@"
-      onInit: "@"
-      onReInit: "@"
+      onBeforeChange: "&"
+      onAfterChange: "&"
+      onInit: "&"
+      onReInit: "&"
       pauseOnHover: "@"
       responsive: "&"
       slide: "@"


Set useragent on api requests to github

Set useragent on api requests to github

--- plugins/github-issues/index.coffee
+++ plugins/github-issues/index.coffee
@@ -32,6 +32,7 @@
     @request
       .post("#{BASE_URL}/repos/#{config.repo}/issues")
       .auth(config.username, config.password)
+      .set("User-Agent", "Bugsnag")
       .send(payload)
       .on "error", (err) ->
         callback(err)


Generate activity js

Generate activity js

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

--- app/assets/javascripts/activities.js.coffee
+++ app/assets/javascripts/activities.js.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/


Load caseArchive to preload in the scene

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/GregDesplaces/classe-1914.git/'


No Header Row test

No Header Row test

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

--- test/no-header.coffee
+++ test/no-header.coffee
@@ -0,0 +1,15 @@
+jsoncsv = require '../index'
+should = require 'should'
+
+describe 'No Header Row', ->
+  it 'should not contain a header', (done) ->
+    items = [
+      { k: 'foo' }
+      { k: 'bar' }
+    ]
+    jsoncsv.csvBuffered items, {
+      ignoreHeader: true
+      fields: [ { name: 'k' } ]  # Label not needed
+    }, (err, csv) ->
+      csv.should.equal 'foo\r\nbar\r\n'
+      done()


Allow users to be mentioned using real name

--- packages/rocketchat-ui-message/message/popup/messagePopupConfig.coffee
+++ packages/rocketchat-ui-message/message/popup/messagePopupConfig.coffee
@@ -71,12 +71,12 @@
 				exp = new RegExp("#{RegExp.escape filter}", 'i')

 				# Get users from messages
-				items = filteredUsersMemory.find({ts: {$exists: true}, username: exp}, {limit: 5, sort: {ts: -1}}).fetch()
+				items = filteredUsersMemory.find({ts: {$exists: true}, $or: [{username: exp}, {name: exp}]}, {limit: 5, sort: {ts: -1}}).fetch()

 				# Get online users
 				if items.length < 5 and filter?.trim() isnt ''
 					messageUsers = _.pluck(items, 'username')
-					Meteor.users.find({$and: [{username: exp}, {username: {$nin: [Meteor.user()?.username].concat(messageUsers)}}]}, {limit: 5 - messageUsers.length}).fetch().forEach (item) ->
+					Meteor.users.find({$and: [{$or:[{username: exp}, {name: exp}]}, {username: {$nin: [Meteor.user()?.username].concat(messageUsers)}}]}, {limit: 5 - messageUsers.length}).fetch().forEach (item) ->
 						items.push
 							_id: item.username
 							username: item.username


adding actual grid_plot.coffee demo script

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

--- demo/coffee/grid_plot.coffee
+++ demo/coffee/grid_plot.coffee
@@ -0,0 +1,59 @@
+
+Collections = require('../base').Collections
+make_glyph_test = require('../testutils').make_glyph_test
+Rand = require('../common/random').Rand
+
+xs = ((x/50) for x in _.range(630))
+ys1 = (Math.sin(x) for x in xs)
+ys2 = (Math.cos(x) for x in xs)
+
+source = Collections('ColumnDataSource').create(
+  data:
+    x: xs
+    y1: ys1
+    y2: ys2
+)
+
+xdr = Collections('DataRange1d').create(
+  sources: [{ref: source.ref(), columns: ['x']}]
+)
+
+ydr = Collections('DataRange1d').create(
+  sources: [{ref: source.ref(), columns: ['y1']}]
+)
+
+ydr2 = Collections('DataRange1d').create(
+  sources: [{ref: source.ref(), columns: ['y2']}]
+)
+
+scatter1 = {
+  x: 'x'
+  y: 'y1'
+  radius: 8
+  radius_units: 'screen'
+  type: 'circle'
+  fill_color: 'red'
+  line_color: 'black'
+}
+
+scatter2 = {
+  x: 'x'
+  y: 'y2'
+  width: 5
+  height: 5
+  type: 'rects'
+  fill_color: 'blue'
+}
+
+plot1 = make_glyph_test("plot1", source, {}, scatter1, xdr, ydr,
+        {dims: [600,600], plot_title: "Plot 1"})
+plot2 = make_glyph_test("plot2", source, {}, scatter2, xdr, ydr2,
+        {dims: [600,600], plot_title: "Plot 2"})
+
+gridplot = Collections('GridPlotContainer').create(children: [[plot1, plot2]])
+
+test(
+  'gridplot',
+  gridplot
+)
+


Change message in weather command

Change message in weather command

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/opengallery/og-bot.git/'


Add commands about weather using SK weather API


Rewrite tests using TestUtils

Rewrite tests using TestUtils

--- test/tests.coffee
+++ test/tests.coffee
@@ -1,109 +1,89 @@
 {assert} = chai
-ImageLoader = ReactImageLoader
+{TestUtils} = React.addons
+ImageLoader = React.createFactory ReactImageLoader

 nocache = (url) -> "#{ url }?r=#{ Math.floor Math.random() * Date.now() / 16 }"
 defer = (fn) -> setTimeout fn, 0

 describe 'ReactImageLoader', ->
-  div = null
-
-  render = (component) ->
-    React.renderComponent component, div
-    div.children[0]
-
-  beforeEach ->
-    div = document.createElement 'div'

   it 'gives the wrapper a className', ->
-    wrapper = render (ImageLoader className: 'test value')
-    assert wrapper.classList.contains('imageloader'),
-      "Expected wrapper to have 'imageloader' class"
-    assert wrapper.classList.contains('test'),
-      "Expected wrapper to have 'test' class"
-    assert wrapper.classList.contains('value'),
-      "Expected wrapper to have 'value' class"
+    loader = TestUtils.renderIntoDocument (ImageLoader className: 'test value')
+    assert TestUtils.findRenderedDOMComponentWithClass loader, 'imageloader'
+    assert TestUtils.findRenderedDOMComponentWithClass loader, 'test'
+    assert TestUtils.findRenderedDOMComponentWithClass loader, 'value'

   it 'uses a custom wrapper', ->
-    ref = null
-    wrapper = render (ImageLoader wrapper: -> ref = (React.DOM.div null))
-    assert.equal ref.getDOMNode(), wrapper,
-      'Expected wrapper to be custom'
+    loader = TestUtils.renderIntoDocument (ImageLoader null)
+    assert TestUtils.findRenderedDOMComponentWithTag loader, 'span'
+    loader = TestUtils.renderIntoDocument (ImageLoader wrapper: React.DOM.div)
+    assert TestUtils.findRenderedDOMComponentWithTag loader, 'div'

   it 'does not render the image without a src', ->
-    wrapper = render (ImageLoader className: 'test value')
-    assert wrapper.classList.contains('pending'),
-      "Expected wrapper to have 'pending' class"
-    assert.isFalse wrapper.classList.contains('loading'),
-      "Expected wrapper not to have 'loading' class"
-    assert.equal wrapper.childElementCount, 0,
-      'Expected wrapper to have no children'
+    loader = TestUtils.renderIntoDocument (ImageLoader className: 'test value')
+    assert TestUtils.findRenderedDOMComponentWithClass loader, 'pending'
+    assert.throws -> TestUtils.findRenderedDOMComponentWithClass loader, 'loading'
+    assert.equal loader.getDOMNode().childElementCount, 0, 'Expected wrapper to have no children'

   it 'renders the image as not visible', ->
-    wrapper = render (ImageLoader src: nocache 'tiger.svg')
-    img = wrapper.getElementsByTagName('img')[0]
-    assert img.style.display is 'none', "Expected img display to be 'none'"
+    loader = TestUtils.renderIntoDocument (ImageLoader src: nocache 'tiger.svg')
+    img = TestUtils.findRenderedDOMComponentWithTag loader, 'img'
+    assert.equal img.props.style.display, 'none', "Expected img display to be 'none'"

   it 'renders the image as visible when load completes', (done) ->
-    wrapper = render (ImageLoader
+    loader = TestUtils.renderIntoDocument (ImageLoader
       src: nocache 'tiger.svg'
       onLoad: ->
         # FIXME: We set a timeout here because the style change we're testing
         # happens on the next render. Is there a cleaner, less brittle way to
         # test this?
         defer ->
-          img = wrapper.getElementsByTagName('img')[0]
-          assert.notOk img.style.display, 'Expected img display to be falsy'
+          img = TestUtils.findRenderedDOMComponentWithTag loader, 'img'
+          assert.notOk img.props.style.display, 'Expected img display to be falsy'
           done()
-    )
+      )

   it 'shows alternative content on error', (done) ->
-    wrapper = render (ImageLoader
+    loader = TestUtils.renderIntoDocument (ImageLoader
       src: nocache 'fake.jpg'
       onError: ->
         # FIXME: We set a timeout here because the style change we're testing
         # happens on the next render. Is there a cleaner, less brittle way to
         # test this?
         defer ->
-          span = wrapper.getElementsByTagName('span')[0]
-          assert.equal span.childNodes[0].data, 'error',
-            'Expected error message to be rendered'
+          span = TestUtils.findRenderedDOMComponentWithTag loader, 'span'
+          textNodes = TestUtils.findAllInRenderedTree span, (n) -> TestUtils.isTextComponent n
+          assert.lengthOf textNodes, 1, 'Expected one text node'
+          assert.equal textNodes[0].props, 'error', 'Expected error message to be rendered'
           done()
       'error'
-    )
+      )

   it 'shows a preloader if provided', ->
-    ref = null
-    wrapper = render (ImageLoader
-      preloader: -> ref = (React.DOM.div null)
-    )
-    assert.isTrue ref.isMounted(), 'Expected preloader to be mounted'
-    assert.equal ref.getDOMNode(), wrapper.getElementsByTagName('div')[0],
-      'Expected preloader to be rendered'
+    loader = TestUtils.renderIntoDocument (ImageLoader preloader: React.DOM.div)
+    assert TestUtils.findRenderedDOMComponentWithTag loader, 'div'

   it 'removes a preloader when load completes', (done) ->
-    ref = null
-    wrapper = render (ImageLoader
+    loader = TestUtils.renderIntoDocument (ImageLoader
       src: nocache 'tiger.svg'
-      preloader: -> ref = (React.DOM.div null)
+      preloader: React.DOM.div
       onLoad: ->
         # FIXME: We set a timeout here because the style change we're testing
         # happens on the next render. Is there a cleaner, less brittle way to
         # test this?
         defer ->
-          assert.equal wrapper.childElementCount, 1,
-            'Expected wrapper to have exactly one child'
-          assert.isFalse ref.isMounted(), 'Expected preloader not to be mounted'
+          assert.throws -> TestUtils.findRenderedDOMComponentWithTag loader, 'div'
           done()
-    )
+      )
+
   it 'transfers img props to the underlying img element', ->
-    wrapper = render (ImageLoader
+    loader = TestUtils.renderIntoDocument (ImageLoader
       src: nocache 'tiger.svg'
       alt: 'this is alt text'
       style:
         width: 100
-    )
-    img = wrapper.getElementsByTagName('img')[0]
-    assert.equal img.style.width, '100px', "Expected img width to be '100px'"
-    assert.equal img.attributes.alt.value, 'this is alt text',
-      'Expected img to have alt text'
+      )
+    img = TestUtils.findRenderedDOMComponentWithTag loader, 'img'
+    assert.equal img.props.style.width, 100, "Expected img width to be 100"
+    assert.equal img.props.alt, 'this is alt text', 'Expected img to have alt text'


Adding engine modules

Adding engine modules

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

--- src/engine_developer.coffee
+++ src/engine_developer.coffee
@@ -0,0 +1,18 @@
+Engine.Developer = (I, self) ->
+  self.bind "draw", (canvas) ->
+    if I.paused
+      #TODO: Move this into the debug draw method of the objects themselves
+      canvas.withTransform I.cameraTransform, (canvas) ->
+        I.objects.each (object) ->
+          canvas.fillColor 'rgba(255, 0, 0, 0.5)'
+          canvas.fillRect(object.bounds().x, object.bounds().y, object.bounds().width, object.bounds().height)
+
+      canvas.fillColor 'rgba(0, 0, 0, 0.5)'
+      canvas.fillRect(430, 10, 200, 60)
+      canvas.fillColor '#fff'
+      canvas.fillText("Developer Mode. Press Esc to resume", 440, 25)
+      canvas.fillText("Shift+Left click to add boxes", 440, 43)
+      canvas.fillText("Right click red boxes to edit properties", 440, 60)
+
+  return {}
+


:sparkles: Add success and error notification;

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/jerone/flex-toolbar.git/'


update test

update test

--- src/desktop/components/inquiry_questionnaire/test/views/account.coffee
+++ src/desktop/components/inquiry_questionnaire/test/views/account.coffee
@@ -2,11 +2,25 @@
 sinon = require 'sinon'
 Backbone = require 'backbone'
 setup = require './setup'
+
 Account = benv.requireWithJadeify require.resolve('../../views/account'), [
   'templates.login'
   'templates.register'
   'templates.forgot'
 ]
+
+before (done) ->
+  benv.setup ->
+    benv.expose
+      $: benv.require('jquery'), jQuery: benv.require('jquery'),
+      sd: {
+        AP: { loginPagePath: '/login' }
+      }
+    Backbone.$ = $
+    done()
+
+after ->
+  benv.teardown()

 describe 'Account', setup ->
   beforeEach ->
@@ -20,7 +34,7 @@
       @view.$('.iq-headline').text()
         .should.containEql 'Create an account to send your message'
       @view.$('input').map(-> $(this).attr('name')).get()
-        .should.eql ['name', 'email', 'password']
+        .should.eql ['name', 'email', 'password', '_csrf']

     it 're-renders when the mode changes', ->
       @view.active.set 'mode', 'forgot'


Add "/assigned to <username> <repo_name> <limit>"

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

--- scripts/assigned.coffee
+++ scripts/assigned.coffee
@@ -0,0 +1,54 @@
+# Description:
+#   Get a list of the issues assigned to your on a repo
+#
+# Dependencies:
+#   "githubot": "0.4.x"
+#
+# Configuration:
+#   HUBOT_GITHUB_TOKEN
+#   HUBOT_GITHUB_USER
+#   HUBOT_GITHUB_API
+#
+# Commands:
+#   hubot assigned to me
+#   hubot assigned to mattr-
+#   hubot assigned to me 4
+#   hubot assigned to me jekyll/hyde
+#   hubot assigned to me jekyll/hyde 4
+#
+# Notes:
+#   HUBOT_GITHUB_API allows you to set a custom URL path (for Github enterprise users)
+#
+# Author:
+#   parkr
+
+_ = require('underscore')
+
+api_url = ->
+  process.env.HUBOT_GITHUB_API || "https://api.github.com"
+
+issues_url = (repo) ->
+  "#{api_url}/repos/#{repo}/issues"
+
+limit_issues = (issues, limit) ->
+  issues = _.first issues, limit
+
+module.exports = (robot) ->
+  github = require("githubot")(robot)
+  robot.respond /assigned to (me|[\w\-_]+) ?(\w+\/[\w\-_]+)? ?(\d+)?/i, (msg) ->
+    assignee = msg.match[1]
+    repo = github.qualified_repo msg.match[2]
+    limit = msg.match[3] if msg.match[3]?
+
+    query_params =
+      state: "open",
+      sort: "created",
+      assignee: assignee
+
+    github.get issues_url(repo), (all_issues) ->
+      issues = limit_issues(issues, limit) if limit?
+      if _.isEmpty issues
+        msg.send "No open issues found for #{assignee}. Yay!"
+      else
+        for issue in issues
+          msg.send "##{issue.number} #{issue.title} #{issue.html_url}"


fuck you

fuck you

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

--- scripts/fuck-you.coffee
+++ scripts/fuck-you.coffee
@@ -0,0 +1,22 @@
+# Description
+#   Fuck you
+#
+# Author:
+#   ivey
+
+images = [
+ "http://mlkshk.com/r/P4WO.gif",
+ "http://i.imgur.com/50Z5z.gif",
+ "http://i.imgur.com/hIqwF.jpg",
+ "http://media.tumblr.com/tumblr_m5dkqkDV7B1r3zat8.gif",
+ "http://i.imgur.com/RFh48.gif",
+ "http://i.imgur.com/pv3sT.gif",
+ "http://24.media.tumblr.com/tumblr_lem3c4zQnj1qdtfdbo1_500.gif",
+ "http://i.imgur.com/Vi7cJ.gif"
+]
+
+module.exports = (robot) ->
+  robot.respond /fuck you/i, (msg) ->
+    msg.send msg.random images
+
+


Fix token helper.

Fix token 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/philbooth/GitHubReminder.git/'


Client: Activity: Created CreateChannelPArticipantsDropdownItem

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


increased concurrency [deploy: production]

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