Update zh-HANT.coffee

Update zh-HANT.coffee

--- app/locale/zh-HANT.coffee
+++ app/locale/zh-HANT.coffee
@@ -1,17 +1,17 @@
 module.exports = nativeDescription: "繁体中文", englishDescription: "Chinese (Traditional)", translation:
   home:
     slogan: "玩遊戲學程式"
-    no_ie: "抱歉！Internet Explorer 8等舊的瀏覽器打不開此網站" # Warning that only shows up in IE8 and older
+    no_ie: "抱歉！Internet Explorer 8 等舊的瀏覽器打不開此網站" # Warning that only shows up in IE8 and older
     no_mobile: "CodeCombat不是針對手機設備設計的，所以可能會出問題！" # Warning that shows up on mobile devices
     play: "開始遊戲" # The big play button that opens up the campaign view.
     old_browser: "嗯... 您的瀏覽器太老了跑不動CodeCombat，抱歉！" # Warning that shows up on really old Firefox/Chrome/Safari
     old_browser_suffix: "您還是可以試試看，但它應該不能運行。"
-    ipad_browser: "抱歉，CodeCombat不能在iPad上的瀏覽器運行，但好消息是我們的iPad App正在等待蘋果公司審核。"
+    ipad_browser: "抱歉，CodeCombat 不能在 iPad 上的瀏覽器運行，但好消息是我們的 iPad App 正在等待蘋果公司審核。"
     campaign: "戰役"
     for_beginners: "新手專區"
     multiplayer: "多人連線" # Not currently shown on home page
     for_developers: "開發者專區" # Not currently shown on home page.
-    or_ipad: "或下載iPad版"
+    or_ipad: "或下載 iPad 版"

   nav:
     play: "返回地圖" # The top nav bar entry where players choose which levels to play
@@ -297,7 +297,7 @@
     tip_scrub_shortcut: "Ctrl+[ 快退; Ctrl+] 快進."
     tip_guide_exists: "點擊頁面上方的指南，可獲得更多有用的訊息."
     tip_open_source: "「CodeCombat」100% 開源!"
-    tip_beta_launch: "「CodeCombat」在2013年10月進入BETA測試。"
+    tip_beta_launch: "「CodeCombat」在2013年10月進入 BETA 測試。"
     tip_think_solution: "思考解決方法而不是問題."
     tip_theory_practice: "理論上, 理論和實作之間是沒有區別. 但是實作上, 這兩者是有區別的. - Yogi Berra"
     tip_error_free: "有兩種方式可以寫出沒有錯誤的程式; 但只有第三種可以達到預期效果. - Alan Perlis"
@@ -319,10 +319,10 @@
     tip_talk_is_cheap: "多說無益，公開您的代碼. - Linus Torvalds"
     tip_first_language: "您經歷的第一門程式語言是最慘痛的事情. - Alan Kay"
     tip_hardware_problem: "Q: 換一顆燈泡需要多少位程序員?  A: 一位也不用, 它是個硬體問題."
-    tip_hofstadters_law: "Hofstadter定律: 完成一件複雜的事花費的時間總是超乎預期, 甚至您早已知道這個現象(Hofstadter定律)."
+    tip_hofstadters_law: "Hofstadter 定律: 完成一件複雜的事花費的時間總是超乎預期, 甚至您早已知道這個現象( Hofstadter 定律)."
     tip_premature_optimization: "過早的優化是萬惡之源. - Donald Knuth"
     tip_brute_force: "當您游移不定時, 就是用暴力解. - Ken Thompson"
-    tip_extrapolation: "只有2種人在這世上: 一種人是能夠根據不完整資訊而推斷..."
+    tip_extrapolation: "只有 2 種人在這世上: 一種人是能夠根據不完整資訊而推斷..."
     tip_superpower: "編程讓我們最接近擁有超能力."
     tip_control_destiny: "在真正的開源, 您有權利控制自己的命運. - Linus Torvalds"
     tip_no_code: "在速度上，沒有任何代碼可以超過無代碼"
@@ -331,9 +331,9 @@
     tip_optimization_operator: "每種語言都有一個優化的運算符號. 對大部份而言，那符號是‘//’"
     tip_lines_of_code: "使用代碼行數來管理開發進度就好像使用秤重器來管理建造飛機. — Bill Gates"
     tip_source_code: "我想改變世界但他們不給我源代碼"
-    tip_javascript_java: "Java和JavaScript的關係就好比馬和馬雲. - Chris Heilmann"
+    tip_javascript_java: "Java 和 JavaScript 的關係就好比馬和馬雲. - Chris Heilmann"
     tip_move_forward: "不論您做啥, 持續前進. - Martin Luther King Jr."
-    tip_google: "擁有一個您不能解決的問題? Google它!"
+    tip_google: "擁有一個您不能解決的問題? Google 它!"
     tip_adding_evil: "增加一個邪惡之捏."
     tip_miss_lunch: "任何當使用電腦時就對時間無感之人, 傾向擁有夢想, 渴望夢想成真並且容易忘記吃飯. - Tim Berners-Lee"
     tip_hate_computers: "關於自我覺得恨透電腦的那群人. 其實他們真正應該恨的事情是糟糕的程序員. - Larry Niven"
@@ -393,13 +393,13 @@
     prompt_body: "想要取得更多?"
     prompt_button: "進入商店"
     recovered: "先前購買的寶石已回復. 請重新載入頁面."
-    or_subscribe: "或者3500顆寶石一個月, 如果您..."
+    or_subscribe: "或者 3500 顆寶石一個月, 如果您..."

   subscribe:
-    comparison_blurb: "訂閱CodeCombat來磨練您的技巧!"
-    feature1: "60個以上的基本關卡散佈在4張地圖中"
-    feature2: "7個強壯的新英雄並每隻都有不同技巧!"
-    feature3: "30個以上的額外關卡"
+    comparison_blurb: "訂閱 CodeCombat 來磨練您的技巧!"
+    feature1: "60 個以上的基本關卡散佈在4張地圖中"
+    feature2: "7 個強壯的新英雄並每隻都有不同技巧!"
+    feature3: "30 個以上的額外關卡"
     feature4: "每個月3500顆額外寶石!"
     feature5: "視頻教學"
     feature6: "頂級信箱支援"
@@ -413,20 +413,20 @@
     thank_you_months_suffix: "月來的支持"
     thank_you: "感謝您支持CodeCombat."
     sorry_to_see_you_go: "捨不得您離開! 請讓我們知道我們如何做得更好."
-    unsubscribe_feedback_placeholder: "O, 我們做錯事了嗎?"
+    unsubscribe_feedback_placeholder: "我們做錯事了嗎?"
     parent_button: "詢問您的父母"
-    parent_email_description: "我們將寄信向他們說明，所以他們能放心幫您訂閱CodeCombat."
+    parent_email_description: "我們將寄信向他們說明，所以他們能放心幫您訂閱 CodeCombat."
     parent_email_input_invalid: "信箱位址無效."
     parent_email_input_label: "父母信箱位址"
-    parent_email_input_placeholder: "輸入Enter父母信箱"
+    parent_email_input_placeholder: "輸入父母信箱"
     parent_email_send: "寄信"
     parent_email_sent: "已寄信!"
     parent_email_title: "您父母信箱是?"
     parents: "致家長"
     parents_title: "您的孩子將學習編寫程式."
-    parents_blurb1: "使用CodeCombat, 您的孩子學習真正的編寫程式. 他們學習從簡單的指令，漸進到更加進階的課題."
-    parents_blurb2: "每月支付$9.99美金, 他們每週獲得新挑戰以及使用信件取得專業程式員的幫助."
-    parents_blurb3: "沒有風險: 保證100%退費, 一步取消訂閱."
+    parents_blurb1: "使用 CodeCombat , 您的孩子學習真正的編寫程式. 他們學習從簡單的指令，漸進到更加進階的課題."
+    parents_blurb2: "每月支付 $9.99 美金, 他們每週獲得新挑戰以及使用信件取得專業程式員的幫助."
+    parents_blurb3: "沒有風險: 保證 100% 退費, 一步取消訂閱."
     stripe_description: "每月訂閱"
     subscription_required_to_play: "您將需要訂閱來開啟這關."
     unlock_help_videos: "訂閱來解開所有鎖住得教學影片."
@@ -438,9 +438,9 @@
     default: "預設"
     experimental: "測試中"
     python_blurb: "簡單且強大，適合新手跟專家。"
-    javascript_blurb: "網頁程式語言。(不是Java喔)"
-    coffeescript_blurb: "懶人版的Javascript。"
-    clojure_blurb: "Lisp進化版。"
+    javascript_blurb: "網頁程式語言。(不是 Java 喔)"
+    coffeescript_blurb: "懶人版的 Javascript。"
+    clojure_blurb: "Lisp 進化版。"
     lua_blurb: "許多遊戲引擎支援的程式語言。"
     io_blurb: "簡單但不有名。"
     status: "狀態"
@@ -822,7 +822,7 @@
     scribe_join_description: "告訴我們更多關於您的資訊, 您的編程經驗和一些您喜歡寫下的東西. 我們將從這些地方開始!"
     scribe_subscribe_desc: "取得公告關於寫作文章的郵件."
     diplomat_introduction_pref: "所以, 如果說我們從"
-    diplomat_launch_url: "十月的那次上線"
+    diplomat_launch_url: " 十月的那次上線 "
     diplomat_introduction_suf: "中得到了怎樣的啟發: 那就是在許多國家有許多人對CodeCombat產生興趣! 我們正在建立一群翻譯者，急於將一組組的英文翻譯成各國語言讓CodeCombat可以讓全世界更多人都可以接觸. 如果您喜歡搶先閱讀新內容並且讓您的國人都可以儘速的擁有, 那麼這職業也許適合您."
     diplomat_attribute_1: "擁有流利的英文並且喜歡翻譯某種語言. 當傳遞複雜想法時, 您必須這兩種語言都是熟悉的!"
     diplomat_i18n_page_prefix: "您可以開始從我們的"
@@ -1143,7 +1143,7 @@
     example_blog: "部落格"
     example_personal_site: "個人網站"
     links_header: "個人聯結"
-    links_blurb: "聯結任何您想凸顯的網站或介紹, 例如：聯結您的GitHub, 您的LinkedIn, 您的部落格."
+    links_blurb: "聯結任何您想凸顯的網站或介紹, 例如：聯結您的 GitHub, 您的 LinkedIn, 您的部落格."
     links_name: "聯結名稱"
     links_name_help: "您想聯結到?"
     links_link_blurb: "聯結網址"
@@ -1167,11 +1167,11 @@
     basics_looking_for_help: "您想要哪種的開發者職位?"
     name_header: "填寫您的姓名"
     name_anonymous: "匿名開發者"
-    name_help: "您希望僱主看到的姓名, 例如:'Nick Winter'."
+    name_help: "您希望僱主看到的姓名, 例如: 'Nick Winter'."
     short_description_header: "簡短的敘述您自己"
     short_description_blurb: "增加一則簡短介紹來幫助僱主快速的認識您."
     short_description: "簡短介紹"
-    short_description_help: "您是誰, 您正在尋找啥? 最多140字."
+    short_description_help: "您是誰, 您正在尋找啥? 最多 140 字."
     skills_header: "技能"
     skills_help: "按照熟練程度列出您所擁有的相關開發技能."
     long_description_header: "描述您所希望的位置"
@@ -1190,7 +1190,7 @@
     work_duration: "起止時間"
     work_duration_help: "您的在職時間是?"
     work_description: "描述"
-    work_description_help: "您在那是在做啥? (140字; 可選)"
+    work_description_help: "您在那是在做啥? (140 字; 可選)"
     education: "教育"
     education_header: "列出您的教育經歷"
     education_blurb: "列出您在學校的經歷."
@@ -1201,7 +1201,7 @@
     education_duration: "日期"
     education_duration_help: "何時?"
     education_description: "描述"
-    education_description_help: "凸顯任何有關這個教育經歷的地方. (140字; 可選)"
+    education_description_help: "凸顯任何有關這個教育經歷的地方. (140 字; 可選)"
     our_notes: "CodeCombat的筆記"
     remarks: "標記"
     projects: "專案"


refactor the coffeescript a bit more. Hopefully to resolve Jasmine failures

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


now caches doc.body and doc.title

now caches doc.body and doc.title

--- lib/assets/javascripts/turbolinks.js.coffee
+++ lib/assets/javascripts/turbolinks.js.coffee
@@ -1,4 +1,5 @@
 window.historyCache = []
+window.testArray = []
 visit = (url) ->
   if browserSupportsPushState?
     reflectNewUrl url
@@ -19,14 +20,14 @@
   while(window.historyCache.length > 0)
     cache = window.historyCache.pop()
     if cache.url == url
-      replaceHTML cache.html
+      replaceDocument cache.body, cache.title
       triggerPageChange
       return

   fetchReplacement url

 fullReplacement = (html, url) ->
-  replaceHTML html, "cache"
+  replaceHTML html
   triggerPageChange()

 reflectNewUrl = (url) ->
@@ -56,13 +57,18 @@
   else
     createDocumentUsingWrite

-replaceHTML = (html,cache) ->
+replaceHTML = (html) ->
   doc = createDocument html
+  title = doc.querySelector "title"
+  replaceDocument doc.body,title?.textContent, 'cache'
+
+
+replaceDocument = (body,title,cache) ->
   originalBody = document.body
-  document.documentElement.appendChild doc.body, originalBody
+  document.documentElement.appendChild body.cloneNode(true), originalBody
   document.documentElement.removeChild originalBody
-  document.title = title.textContent if title = doc.querySelector "title"
-  window.historyCache.push({url: document.location.href, html:html}) if cache
+  document.title = title
+  window.historyCache.push({url: document.location.href, title:title,body:body}) if cache

 extractLink = (event) ->


keymaps

keymaps

error: pathspec 'keymaps/clang-format.cson' did not match any file(s) known to git

--- keymaps/clang-format.cson
+++ keymaps/clang-format.cson
@@ -0,0 +1,2 @@
+'.editor':
+  'cmd-shift-k': 'clang-format:format'


added log ticker

added log ticker

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

--- bokehjs/src/coffee/ticking/log_ticker.coffee
+++ bokehjs/src/coffee/ticking/log_ticker.coffee
@@ -0,0 +1,101 @@
+
+define [
+  "ticking/adaptive_ticker",
+], (AdaptiveTicker) ->
+
+  range = (start, stop, step) ->
+    if typeof stop is "undefined"
+
+    # one param defined
+      stop = start
+      start = 0
+    step = 1  if typeof step is "undefined"
+    return []  if (step > 0 and start >= stop) or (step < 0 and start <= stop)
+    result = []
+    i = start
+
+    while (if step > 0 then i < stop else i > stop)
+      result.push i
+      i += step
+    return result
+
+  class LogTicker extends AdaptiveTicker.Model
+    type: 'LogTicker'
+
+    initialize: (attrs, options) ->
+      super(attrs, options)
+
+    get_ticks_no_defaults: (data_low, data_high, desired_n_ticks) ->
+
+      num_minor_ticks = 5
+      minor_ticks = []
+
+      if data_low <= 0 #Hotfix
+        data_low = 1
+
+      if data_low > data_high
+        [data_low, data_high] = [data_high, data_low]
+
+      log_low = Math.log(data_low) / Math.log(10)
+      log_high = Math.log(data_high) / Math.log(10)
+      log_interval = log_high - log_low
+
+      if log_interval < 1
+        interval = @get_interval(data_low, data_high, desired_n_ticks)
+        start_factor = Math.floor(data_low / interval)
+        end_factor   = Math.ceil(data_high / interval)
+
+        if _.isNaN(start_factor) or _.isNaN(end_factor)
+          factors = []
+        else
+          factors = _.range(start_factor, end_factor + 1)
+
+        ticks = (factor * interval for factor in factors when factor != 0)
+
+        if num_minor_ticks > 1
+          minor_interval = interval / num_minor_ticks
+          minor_offsets = (i*minor_interval for i in [1..num_minor_ticks])
+          for x in minor_offsets
+            minor_ticks.push(ticks[0]-x)
+          for tick in ticks
+            for x in minor_offsets
+              minor_ticks.push(tick+x)
+      else
+        startlog = Math.ceil(log_low)
+        endlog = Math.floor(log_high)
+        interval = Math.ceil((endlog - startlog) / 9.0)
+
+        ticks = range(startlog, endlog, interval)
+
+        if (endlog - startlog) % interval == 0
+          ticks = ticks.concat [endlog]
+
+        ticks = ticks.map (i) -> Math.pow(10, i)
+
+        if num_minor_ticks > 1
+          minor_interval = Math.pow(10, interval) / num_minor_ticks
+          minor_offsets = (i*minor_interval for i in [1..num_minor_ticks])
+          for x in minor_offsets
+            minor_ticks.push(ticks[0] / x)
+          for tick in ticks
+            for x in minor_offsets
+              minor_ticks.push(tick * x)
+
+      return {
+        "major": ticks
+        "minor": minor_ticks
+      }
+
+    defaults: () ->
+      return _.extend(super(), {
+        mantissas: [1, 5]
+      })
+
+  class LogTickers extends Backbone.Collection
+    model: LogTicker
+
+  return {
+    "Model": LogTicker,
+    "Collection": new LogTickers()
+  }
+


Fixed encode method

Fixed encode method

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


Fixed skipping through real-time playback to fire when the final goals are actually ready.

--- app/views/play/level/PlayLevelView.coffee
+++ app/views/play/level/PlayLevelView.coffee
@@ -604,7 +604,7 @@
     if finishedLoading
       @lastWorldFramesLoaded = 0
       if @waitingForSubmissionComplete
-        @onSubmissionComplete()
+        _.defer @onSubmissionComplete  # Give it a frame to make sure we have the latest goals
         @waitingForSubmissionComplete = false
     else
       @lastWorldFramesLoaded = @world.frames.length


Fix indent

Fix indent

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


Use avatar url directly

Use avatar url directly

--- src/packages/collaboration/lib/participant-view.coffee
+++ src/packages/collaboration/lib/participant-view.coffee
@@ -7,6 +7,5 @@
     @div class: 'participant', =>
       @img class: 'avatar', outlet: 'avatar'

-  initialize: ({id, email}) ->
-    emailMd5 = crypto.createHash('md5').update(email).digest('hex')
-    @avatar.attr('src', "http://www.gravatar.com/avatar/#{emailMd5}?s=32")
+  initialize: ({id, avatar_url}) ->
+    @avatar.attr('src', avatar_url)


activity/flux: add MessagesCollectionHelpers module

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


change debug info to fps

change debug info to fps

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


fix(init): setup default api key

fix(init): setup default api key

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


fix: custom headers removed - CF issue

fix: custom headers removed - CF issue

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


added robot.e.registerIntegration (#18)

added robot.e.registerIntegration (#18)

--- generators/script/templates/src/template.coffee
+++ generators/script/templates/src/template.coffee
@@ -26,6 +26,11 @@
     return
   robot.logger.info '<%= scriptName %> initialized'

+  # register integration
+  robot.e.registerIntegration {name: '<%= scriptName %>',
+  short_desc: 'what this integration does',
+  long_desc: 'how this integration does it'}
+
   #register some functions
   robot.e.create {verb: 'create', entity: 'ticket',
   help: 'create ticket', type: 'respond'}, (msg)->


Ivana css class title lms (#55)

Ivana css class title lms (#55)

* fix title css and class

* remove empty space

--- common/lib/xmodule/xmodule/js/src/sequence/display.coffee
+++ common/lib/xmodule/xmodule/js/src/sequence/display.coffee
@@ -132,7 +132,7 @@
   handleOnClickDropdownItem = ->
     $('#xblocks-dropdown-items a').click ->
       id = $(this).attr('id')
-      $title_div = $('#' + id + '.ft-element-title')
+      $title_div = $('#' + id + '.element-title')
       $('html, body').animate { scrollTop: $title_div.offset().top }, 1200

   # populate dropdown menu with xblocks for active unit (display_name and id).
@@ -141,9 +141,9 @@
     $active_tab = $('[aria-labelledby="' + active_tab_id + '"]')
     $dropdown_items = $('#xblocks-dropdown-items').empty()

-    titles = $active_tab.find('.ft-element-title')
+    titles = $active_tab.find('.element-title')
     titles.each (index) ->
-      $dropdown_items.append '' + titles[index].textContent + ''
+      $dropdown_items.append '' + $(titles[index]).find('span').text() + ''
     handleOnClickDropdownItem()

   toggleArrows: =>


moved FindRequired to merge

moved FindRequired to merge

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/crcn-archive/mesh.git/'


Added grammar for MAM

Added grammar for MAM

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

--- grammars/mam.cson
+++ grammars/mam.cson
@@ -0,0 +1,129 @@
+'fileTypes': [
+  'mam'
+]
+
+'name': 'MAM'
+
+'patterns': [
+  {
+    'include': '#value'
+  }
+]
+'repository':
+  'array':
+    'begin': '\\['
+    'beginCaptures':
+      '0':
+        'name': 'punctuation.definition.array.begin.json'
+    'end': '(,?)[\\s\\n]*(\\])'
+    'endCaptures':
+      '1':
+        'name': 'invalid.illegal.trailing-array-separator.json'
+      '2':
+        'name': 'punctuation.definition.array.end.json'
+    'name': 'meta.structure.array.json'
+    'patterns': [
+      {
+        'include': '#value'
+      }
+      {
+        'match': ','
+        'name': 'punctuation.separator.array.json'
+      }
+      {
+        'match': '[^\\s\\]]'
+        'name': 'invalid.illegal.expected-array-separator.json'
+      }
+    ]
+  'constant':
+    'match': '\\b(?:true|false|null)\\b'
+    'name': 'constant.language.json'
+  'number':
+    'comment': 'handles integer and decimal numbers'
+    'match': '-?(?=[1-9]|0(?!\\d))\\d+(\\.\\d+)?([eE][+-]?\\d+)?'
+    'name': 'constant.numeric.json'
+  'object':
+    'begin': '\\{'
+    'beginCaptures':
+      '0':
+        'name': 'punctuation.definition.dictionary.begin.json'
+    'comment': 'a JSON object'
+    'end': '\\}'
+    'endCaptures':
+      '0':
+        'name': 'punctuation.definition.dictionary.end.json'
+    'name': 'meta.structure.dictionary.json'
+    'patterns': [
+      {
+        'comment': 'the JSON object key'
+        'include': '#string'
+      }
+      {
+        'begin': ':'
+        'beginCaptures':
+          '0':
+            'name': 'punctuation.separator.dictionary.key-value.json'
+        'end': '(,)(?=[\\s\\n]*\\})|(,)|(?=\\})'
+        'endCaptures':
+          '1':
+            'name': 'invalid.illegal.trailing-dictionary-separator.json'
+          '2':
+            'name': 'punctuation.separator.dictionary.pair.json'
+        'name': 'meta.structure.dictionary.value.json'
+        'patterns': [
+          {
+            'comment': 'the JSON object value'
+            'include': '#value'
+          }
+          {
+            'match': '[^\\s,]'
+            'name': 'invalid.illegal.expected-dictionary-separator.json'
+          }
+        ]
+      }
+      {
+        'match': '[^\\s\\}]'
+        'name': 'invalid.illegal.expected-dictionary-separator.json'
+      }
+    ]
+  'string':
+    'begin': '"'
+    'beginCaptures':
+      '0':
+        'name': 'punctuation.definition.string.begin.json'
+    'end': '"'
+    'endCaptures':
+      '0':
+        'name': 'punctuation.definition.string.end.json'
+    'name': 'string.quoted.double.json'
+    'patterns': [
+      {
+        'match': '(?x:                # turn on extended mode\n                     \\\\                # a literal backslash\n                     (?:               # ...followed by...\n                       ["\\\\/bfnrt]     # one of these characters\n                       |               # ...or...\n                       u               # a u\n                       [0-9a-fA-F]{4}  # and four hex digits\n                     )\n                   )'
+        'name': 'constant.character.escape.json'
+      }
+      {
+        'match': '\\\\.'
+        'name': 'invalid.illegal.unrecognized-string-escape.json'
+      }
+    ]
+  'value':
+    'comment': 'the \'value\' diagram at http://json.org'
+    'patterns': [
+      {
+        'include': '#constant'
+      }
+      {
+        'include': '#number'
+      }
+      {
+        'include': '#string'
+      }
+      {
+        'include': '#array'
+      }
+      {
+        'include': '#object'
+      }
+    ]
+
+'scopeName': 'source.mam'


fix-relation-btn

fix-relation-btn

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


format

format

--- app/assets/javascripts/discussions.js.coffee
+++ app/assets/javascripts/discussions.js.coffee
@@ -17,7 +17,7 @@
 $ ->
   if $("body.discussions.show").length > 0
     $("textarea").atWho "@",
-      tpl: "
 ${name}  @${username}
"
+      tpl: "
 ${name}  @${username}
"
       callback: (query, callback) ->
         group = $("#comment-input").data("group")
         $.get "/users/mentions.json", q: query, group: group, ((result) ->


flux/payment: add constants

flux/payment: add constants


--- lib/ensime-startup.coffee
+++ lib/ensime-startup.coffee
@@ -12,29 +12,34 @@
 createSbtClasspathBuild = (scalaVersion, ensimeServerVersion, classpathFile) ->
   """
   import sbt._
-
   import IO._
-
   import java.io._

   scalaVersion := \"#{scalaVersion}\"
+
+  ivyScala := ivyScala.value map { _.copy(overrideScalaVersion = true) }
+
+  // we don't need jcenter, so this speeds up resolution
+  fullResolvers -= Resolver.jcenterRepo

   // allows local builds of scala
   resolvers += Resolver.mavenLocal

-  ivyScala := ivyScala.value map { _.copy(overrideScalaVersion = true) }
-
+  // for java support
+  resolvers += \"NetBeans\" at \"http://bits.netbeans.org/nexus/content/groups/netbeans\"
+
+  // this is where the ensime-server snapshots are hosted
   resolvers += Resolver.sonatypeRepo(\"snapshots\")

-  resolvers += \"Typesafe repository\" at \"http://repo.typesafe.com/typesafe/releases/\"
-
-  resolvers += \"Akka Repo\" at \"http://repo.akka.io/repository\"
-
   libraryDependencies ++= Seq(
-    \"org.ensime\" %% \"ensime\" % \"#{ensimeServerVersion}\",
-    \"org.scala-lang\" % \"scala-compiler\" % scalaVersion.value force(),
-    \"org.scala-lang\" % \"scala-reflect\" % scalaVersion.value force(),
-    \"org.scala-lang\" % \"scalap\" % scalaVersion.value force()
+    \"org.ensime\" %% \"ensime\" % \"#{ensimeServerVersion}\"
+  )
+
+  dependencyOverrides ++= Set(
+    \"org.scala-lang\" % \"scala-compiler\" % scalaVersion.value,
+    \"org.scala-lang\" % \"scala-library\" % scalaVersion.value,
+    \"org.scala-lang\" % \"scala-reflect\" % scalaVersion.value,
+    \"org.scala-lang\" % \"scalap\" % scalaVersion.value
   )

   val saveClasspathTask = TaskKey[Unit](\"saveClasspath\", \"Save the classpath to a file\")
@@ -113,7 +118,7 @@
   fs.writeFileSync(tempdir + path.sep + 'build.sbt', createSbtClasspathBuild(scalaVersion, ensimeServerVersion,
     mkClasspathFileName(scalaVersion, ensimeServerVersion)))

-  fs.writeFileSync(tempdir + path.sep + 'project' + path.sep + 'build.properties', 'sbt.version=0.13.8\n')
+  fs.writeFileSync(tempdir + path.sep + 'project' + path.sep + 'build.properties', 'sbt.version=0.13.9\n')

   # run sbt "saveClasspath" "clean"
   pid = spawn("#{sbtCmd}", ['-Dsbt.log.noformat=true', 'saveClasspath', 'clean'], {cwd: tempdir})


ScrollView disabled for time being

ScrollView disabled for time being

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/nahberry/tudu-list.git/'


Initial expire client ID utility module

Initial expire client ID utility module


Use replaceState instead of pushState for pagination

https://www.pivotaltracker.com/story/show/52701493

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


change CDN API

change CDN API

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


Finder: Controller: use machine.info.home for default rootPath

--- client/finder/lib/filetree/controllers/nfindercontroller.coffee
+++ client/finder/lib/filetree/controllers/nfindercontroller.coffee
@@ -105,43 +105,41 @@
       kd.warn '[Finder][mountMachine] Not a Machine instance!'
       machine = new Machine { machine }

-    { uid } = machine
-
-    @setOption 'machineToMount', machine
-
     unless machine.isRunning()
       return kd.warn "[Finder][mountMachine] Machine '#{machine.getName()}'
                       was not ready, I skipped it."

+    @setOption 'machineToMount', machine
+
+    { uid } = machine
+    mRoots  = (@appStorage.getValue 'machineRoots') or {}
     options.fetchContent ?= yes

-
-    mRoots  = (@appStorage.getValue 'machineRoots') or {}
-
-    path    = mRoots[uid] or options.mountPath or '/'
-    path   ?= '/root'  if machine.isManaged()
-    path   ?= if owner = machine.getOwner()
-    then "/home/#{owner}"
-    else '/'
-
-    @machines.push machineItem = FSHelper.createFileInstance
-      name           : path
-      path           : "[#{uid}]#{path}"
-      type           : 'machine'
-      machine        : machine
-      treeController : @treeController
-      parentPath     : 0
-
-    machineItem = @treeController.addNode machineItem
-
-    @emit 'MachineMounted', machine, path
-
-    if options.fetchContent and machineItem
-      @treeController.expandFolder machineItem, (err) =>
-        @treeController.selectNode machineItem
-        kd.utils.defer =>
-          if @getOptions().useStorage then @reloadPreviousState uid
-      , yes
+    findMountPath = (callback) ->
+      if path = mRoots[uid]
+      then callback path
+      else machine.ready -> callback machine.info.home
+
+    findMountPath (path) =>
+
+      @machines.push machineItem = FSHelper.createFileInstance
+        name           : path
+        path           : "[#{uid}]#{path}"
+        type           : 'machine'
+        machine        : machine
+        treeController : @treeController
+        parentPath     : 0
+
+      machineItem = @treeController.addNode machineItem
+
+      @emit 'MachineMounted', machine, path
+
+      if options.fetchContent and machineItem
+        @treeController.expandFolder machineItem, (err) =>
+          @treeController.selectNode machineItem
+          kd.utils.defer =>
+            if @getOptions().useStorage then @reloadPreviousState uid
+        , yes

   mountMachines: (machines) ->


fix commit on wrong branch

fix commit on wrong branch

--- packages/rocketchat-ui-message/client/message.coffee
+++ packages/rocketchat-ui-message/client/message.coffee
@@ -120,8 +120,7 @@
 			total = reaction.usernames.length
 			usernames = '@' + reaction.usernames.slice(0, 15).join(', @')

-			reg = new RegExp('@'+userUsername+'$')
-			usernames = usernames.replace(reg, t('You').toLowerCase())
+			usernames = usernames.replace('@'+userUsername, t('You').toLowerCase())

 			if total > 15
 				usernames = usernames + ' ' + t('And_more', { length: total - 15 }).toLowerCase()


I added location command.

I added location 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/askdkc/cb_slackbot.git/'


新機能紹介コメント追加。デモ用。

新機能紹介コメント追加。デモ用。

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


Fix welcome script to work

Fix welcome script to work

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


Remove public docs for Project::relativize

--- src/project.coffee
+++ src/project.coffee
@@ -266,9 +266,6 @@
       else
         undefined

-  # Public: Make the given path relative to a project directory.
-  #
-  # * `fullPath` {String} full path
   relativize: (fullPath) ->
     @relativizePath(fullPath)[1]


Correction of a misbehaviour due to the free 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/clochix/cozy-home.git/'


comment & todo added

comment & todo 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/Digipalvelutehdas/APIKA.git/'


Create index on users.email

Create index on users.email

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


Update pt.cson

Update pt.cson

--- lib/translations/pt.cson
+++ lib/translations/pt.cson
@@ -6,77 +6,77 @@
 "yes": "Sim"
 "no" : "Não"
 "menu":
- 	"title": "Menu"
-        "home": "Inicio"
-        "tags": "Etiquetas"
-        "pages": "Pages"
-    	"posts": "Posts"
-    	"authors": "Authors"
-        "search": "Buscar"
-        "bookmarks": "Favoritos"
-        "socialNetworks": "Redes Sociais"
-        "categories": "Categorias"
-        "settings": "Configurações"
-        "customPosts": "Custom posts"
-    	"customTaxonomy": "Custom Taxonomy"
+    "title": "Menu"
+    "home": "Inicio"
+    "tags": "Etiquetas"
+    "pages": "Pages"
+    "posts": "Posts"
+    "authors": "Authors"
+    "search": "Buscar"
+    "bookmarks": "Favoritos"
+    "socialNetworks": "Redes Sociais"
+    "categories": "Categorias"
+    "settings": "Configurações"
+    "customPosts": "Custom posts"
+    "customTaxonomy": "Custom Taxonomy"
 "pushNotifications":
-	 "newContent":
-            "title": "Nova publicação!"
-            "text": "Novo artigo: '{{postTitle}}' em {{appTitle}}, quer visualizar?"
+    "newContent":
+        "title": "Nova publicação!"
+        "text": "Novo artigo: '{{postTitle}}' em {{appTitle}}, quer visualizar?"
 "bookmark":
-        "title": "Favoritos"
-        "emptyList" : "Não há nada salvo!"
-        "bookmarked" : "Adicionado aos favoritos!"
-        "removed" : "Eliminado dos favoritos!"
+    "title": "Favoritos"
+    "emptyList" : "Não há nada salvo!"
+    "bookmarked" : "Adicionado aos favoritos!"
+    "removed" : "Eliminado dos favoritos!"
 "tags":
-        "title": "Etiquetas"
+    "title": "Etiquetas"
 "tag":
-        "title": "Etiqueta: {{name}}"
+    "title": "Etiqueta: {{name}}"
 "customTaxonomy":
-    	"title": "{{term}}: {{name}}"
+    "title": "{{term}}: {{name}}"
 "categories":
-        "title": "Categorias"
+    "title": "Categorias"
 "category":
-        "title": "Categoria {{name}}"
+    "title": "Categoria {{name}}"
 "home":
-        "title": "Inicio"
+    "title": "Inicio"
 "search":
-        "inputPlaceholder": "Buscar"
-        "title": "Search",
-        "titleQuery": "Buscar: {{query}}"
+    "inputPlaceholder": "Buscar"
+    "title": "Search",
+    "titleQuery": "Buscar: {{query}}"
 "sharing":
-        "shared": "Compartilhado!"
+    "shared": "Compartilhado!"
 "authors":
-    	"title": "Authors"
+    "title": "Authors"
 "author":
     "title": "Author: {{name}}"
 "pages":
     "title": "Pages"
 "posts":
-        "title": "Inicio"
-        "empty": "Não encontrou novas publicações!"
-        "featured": "Em destaque"
+    "title": "Inicio"
+    "empty": "Não encontrou novas publicações!"
+    "featured": "Em destaque"
 "post":
- 	"comments": "Comments"
-        "openInBrowser": "Abrir no navegador"
+    "comments": "Comments"
+    "openInBrowser": "Abrir no navegador"
 "about":
-        "title": "Sobre"
+    "title": "Sobre"
 "params":
-        "title": "Parâmetros"
-        "offlineMode": "Modo Offline"
-        "fontSize": "Tamanho da fonte"
-        "language": "Idioma"
+    "title": "Parâmetros"
+    "offlineMode": "Modo Offline"
+    "fontSize": "Tamanho da fonte"
+    "language": "Idioma"
 "languages":
-	"en": "English"
-	"fr": "French"
-        "zh": "Chinese"
-	"es": "Spanish"
-	"pl": "Polaco"
-	"de": "German"
-	"pt": "Português"
+    "en": "English"
+    "fr": "French"
+    "zh": "Chinese"
+    "es": "Spanish"
+    "pl": "Polaco"
+    "de": "German"
+    "pt": "Português"
 "fontSize":
-        "small": "Pequena"
-        "medium": "Média"
-        "large": "Grande"
-        "x-large": "Muito grande"
-        "xx-large": "Extra grande"
+    "small": "Pequena"
+    "medium": "Média"
+    "large": "Grande"
+    "x-large": "Muito grande"
+    "xx-large": "Extra grande"


Remove unused import

Remove unused import

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/ziagrosvenor/sound-machine.git/'


added email to query params and updated to customer_phone instead of customer number

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


废废tags

废废tags

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


reduced amount of flickr photos per page [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/'


create session service with method #clear

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

--- app/services/session.coffee
+++ app/services/session.coffee
@@ -0,0 +1,14 @@
+null
+
+### @ngInject ###
+global.cobudgetApp.factory 'Session', ($auth, CurrentUser, $q) ->
+  new class Session
+
+    clear: ->
+      deferred = $q.defer()
+      if CurrentUser()
+        $auth.signOut().then ->
+          deferred.resolve()
+      else
+        deferred.resolve()
+      deferred.promise


[➠] Refactoring, better naming.

[➠] Refactoring, better naming.

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


Put Sky Span up for testing.

Put Sky Span up for testing.

--- app/views/play/MainPlayView.coffee
+++ app/views/play/MainPlayView.coffee
@@ -183,6 +183,14 @@
         description: 'Combat the armies of other Wizards in a strategic forest arena! (Fast computer required.)'
         levelPath: 'ladder'
       }
+      {
+        name: 'Sky Span (Testing)'
+        difficulty: 3
+        id: 'sky-span'
+        image: '/file/db/level/526ae95c1e5cd30000000008/zone_of_danger_icon.png'
+        description: 'Preview version of an upgraded Dungeon Arena. Help us with hero balance before release!'
+        levelPath: 'ladder'
+      }
     ]

     playerCreated = [


Start the javascript for projects/backers#new

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

--- app/assets/javascripts/neighborly/projects/backers/new.js.coffee
+++ app/assets/javascripts/neighborly/projects/backers/new.js.coffee
@@ -0,0 +1,53 @@
+Neighborly.Projects = {} if Neighborly.Projects is undefined
+Neighborly.Projects.Backers = {} if Neighborly.Projects.Backers is undefined
+
+Neighborly.Projects.Backers.New =
+  modules: -> []
+
+  init: Backbone.View.extend
+    el: '.new-backer-page'
+
+    events:
+      'change #backer_value': 'resetReward'
+      'change input[type=radio]': 'clickReward'
+      'click #backer_anonymous': 'clickAnonymous'
+
+
+    initialize: ->
+      _.bindAll this, 'resetReward', 'clickReward'
+      @value = @$('#backer_value')
+      @rewards = @value.data('rewards')
+      @choices = @$('.reward-option')
+      @selectReward @$('input[type=radio]:checked')
+
+
+    #clickAnonymous: ->
+      #$('#anonymous_warning').fadeToggle()
+
+    clickReward: (event) ->
+      option = @$(event.currentTarget)
+      this.$('.custom.radio.checked').not(option.find('~ span')).removeClass('checked')
+      @selectReward option
+      @value.val @reward().minimum_value
+
+
+    reward: ->
+      $reward = @$('input[type=radio]:checked')
+      if $reward.length > 0
+        reward = {}
+        for r in @rewards
+          reward = r if parseInt(r.id) is parseInt($reward.val())
+
+        return reward
+
+    selectReward: ($reward) ->
+      $reward.prop 'checked', true
+      this.$('.custom.radio.checked').removeClass('checked')
+      $reward.find('~ span').addClass('checked')
+
+    resetReward: (event) ->
+      reward = @reward()
+      if reward
+        value = @value.val()
+        @selectReward @$('#backer_reward_id') if (!(/^(\d+)$/.test(value))) or (parseInt(value) < reward.minimum_value)
+


Groups: Activity: description block improved

--- client/Social/Activity/ContentDisplays/ActivityRightBlock.coffee
+++ client/Social/Activity/ContentDisplays/ActivityRightBlock.coffee
@@ -104,19 +104,31 @@
       @innerContaner = new KDCustomHTMLView cssClass : "right-block-box"

       @titleView = new KDCustomHTMLView
-        tagName  : "h3"
-        partial  : "#{group.title} Group"
+        tagName   : "h3"
+        pistachio : "{{ #(title)}}"
+      , group

       @bodyView = new KDCustomHTMLView
-        tagName  : "p"
-        partial  : group.body or ""
-        cssClass : "group-description"
+        tagName   : "p"
+        pistachio : "{{ #(body)}}"
+        cssClass  : "group-description"
+      , group
+
+

       @innerContaner.addSubView @titleView
       @innerContaner.addSubView @bodyView
       @addSubView @innerContaner

-  viewAppended:JView::viewAppended
+      if "admin" in KD.config.roles
+        hasBody = group.body.trim() isnt ""
+        @bodyView.setPartial "You can have a short description for your group here"  unless hasBody
+        @bodyView.setPartial " - "
+        @bodyView.addSubView new CustomLinkView
+          title    : if hasBody then "edit" else "Add a description"
+          click    : (event)->
+            KD.utils.stopDOMEvent event
+            KD.singletons.router.handleRoute "/Dashboard"

 class GroupMembers extends ActivityRightBase


Resolves bug with mouseenter and mouseleave callbacks for add components treema

--- app/views/editor/component/ThangComponentEditView.coffee
+++ app/views/editor/component/ThangComponentEditView.coffee
@@ -59,7 +59,13 @@
       supermodel: @supermodel
       schema: {type: 'array', items: LevelComponent.schema}
       data: ($.extend(true, {}, c) for c in components)
-      callbacks: {select: @onSelectAddableComponent, enter: @onAddComponentEnterPressed, dblclick: @onAddComponentDoubleClicked }
+      callbacks: {
+        select: @onSelectAddableComponent
+        enter: @onAddComponentEnterPressed
+        dblclick: @onAddComponentDoubleClicked
+        mouseenter: @onAddComponentMouseEnter
+        mouseleave: @onAddComponentMouseLeave
+      }
       readOnly: true
       noSortable: true
       nodeClasses:
@@ -192,6 +198,13 @@
   onAddComponentDoubleClicked: (e, treema) =>
     @onAddComponentEnterPressed treema

+  onAddComponentMouseEnter: (e, treema) ->
+    treema.$el.find('.add-button').show()
+
+  onAddComponentMouseLeave: (e, treema) ->
+    treema.$el.find('.add-button').hide()
+    return
+
   reportChanges: ->
     @callback?($.extend(true, [], @extantComponentsTreema.data))

@@ -247,13 +260,15 @@

 class ComponentNode extends TreemaObjectNode
   valueClass: 'treema-component'
-  addButtonTemplate: ''
+  addButtonTemplate: ''
   collection: false

   build: ->
     super()
     @$el.find('> .treema-row').append @addButtonTemplate
-    @$el.find('.add-button').click =>
+    addButton = @$el.find('.add-button')
+    addButton.hide()
+    addButton.click =>
       @callbacks.enter?(@)
     @$el

@@ -263,12 +278,4 @@

   onEnterPressed: (args...) ->
     super(args...)
-    @callbacks.enter?(@)
-
-  onMouseEnter: (e) ->
-    @$el.find('.add-button').show()
-    super()
-
-  onMouseLeave: (e) ->
-    @$el.find('.add-button').hide()
-    super()+    @callbacks.enter?(@)


Fixed conflicting test responses

Fixed conflicting test responses

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


changed pnotify message text from deleted to archived

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


Fix caching bug with stack clearing

Fix caching bug with stack clearing

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


Add "choose file/image" button text in Portuguese

Add free crop text

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


fix loading info state for 'uploaded' files


Fix: Hide "a former koding user" entries in ticker

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


ace: Fixed parameter order for addKeyCombo method.

--- client/landing/app/Applications/Ace.kdapplication/ace.coffee
+++ client/landing/app/Applications/Ace.kdapplication/ace.coffee
@@ -87,8 +87,10 @@
     findAndReplaceView.setTextIntoFindInput selectedText
     findAndReplaceView.on "FindAndReplaceViewClosed", => @focus()

-  addKeyCombo: (name, winKey, callback, macKey) ->
-    macKey or= winKey.replace "Ctrl", "Command"
+  addKeyCombo: (name, winKey, macKey, callback) ->
+    if typeof macKey is "function"
+      callback = macKey
+      macKey   = winKey.replace "Ctrl", "Command"
     @editor.commands.addCommand
       name    : name
       bindKey :


Fix removing sockets on disconnect

Fix removing sockets on disconnect

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


moved the custom html writing logic lower than the actual reporting so errors from custom logs wont affect the normal html reports

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/DocuSignDev/mocha-farm.git/'


Added KDTimeAgoView.

Added KDTimeAgoView.

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

--- components/time/timeagoview.coffee
+++ components/time/timeagoview.coffee
@@ -0,0 +1,20 @@
+class KDTimeAgoView extends KDView
+
+  KD.utils.repeat 5000, => @emit "OneMinutePassed"
+
+  constructor: (options = {}, data) ->
+
+    options.tagName = 'time'
+
+    super options, data
+
+    KDTimeAgoView.on "OneMinutePassed", =>
+      oldDate   = new Date @getData()
+      timestamp = oldDate.setMinutes oldDate.getMinutes() - 1
+
+      @setData dateFormat timestamp, "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
+
+      @updatePartial $.timeago @getData()
+
+  viewAppended: ->
+    @setPartial $.timeago @getData()


Create fire_model.coffee

Create fire_model.coffee

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

--- fire_model.coffee
+++ fire_model.coffee
@@ -0,0 +1,16 @@
+define (require) ->
+   ko = require 'ko'
+   require 'fire_value'
+
+   ko.fireModel = (model_obj, keys, options) ->
+      fire_ref = options.ref
+
+      for key, value of keys
+         options.ref = fire_ref.child key
+         if model_obj[key] is undefined
+            model_obj[key] = ko.observable(value ? null)
+
+         model_obj[key].extend
+            fireValue: options
+
+      return model_obj


adding db query runner

adding db query runner

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

--- db_runner.coffee
+++ db_runner.coffee
@@ -0,0 +1,10 @@
+pg = require('pg')
+
+config = require("./_config")
+
+tableName = config.table
+
+pg.connect config.connection_string, (err, client, done)->
+	q = "select count(*) from #{tableName}"
+	client.query q, (a,b)->
+		console.log a,b


[repl] Stop lying to code-readers. It ain't a fifo. It never was.

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


[repl] Cast arguments to string

[repl] Cast arguments to string


Add CreateServer test file

Add CreateServer test file

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

--- spec/CreateServer.coffee
+++ spec/CreateServer.coffee
@@ -0,0 +1,36 @@
+noflo = require 'noflo'
+chai = require 'chai' unless chai
+CreateServer = require '../components/CreateServer.coffee'
+
+describe 'CreateServer component', ->
+  c = null
+  port = null
+  address = null
+  type = null
+  proxy = null
+
+  beforeEach ->
+    c = CreateServer.getComponent()
+    port = noflo.internalSocket.createSocket()
+    address = noflo.internalSocket.createSocket()
+    type = noflo.internalSocket.createSocket()
+    proxy = noflo.internalSocket.createSocket()
+    out = noflo.internalSocket.createSocket()
+
+    c.inPorts.port.attach port
+    c.inPorts.address.attach address
+    c.inPorts.type.attach type
+    c.inPorts.proxy.attach proxy
+    c.outPorts.out.attach out
+
+  describe 'when instantiated', ->
+    it 'should have a "port" inport', ->
+      chai.expect(c.inPorts.port).to.be.an 'object'
+    it 'should have a "address" inport', ->
+      chai.expect(c.inPorts.address).to.be.an 'object'
+    it 'should have a "type" inport', ->
+      chai.expect(c.inPorts.type).to.be.an 'object'
+    it 'should have a "proxy" inport', ->
+      chai.expect(c.inPorts.proxy).to.be.an 'object'
+    it 'should have a "out" outport', ->
+      chai.expect(c.outPorts.out).to.be.an 'object'


Unfocus spec

Unfocus spec

--- spec/config-spec.coffee
+++ spec/config-spec.coffee
@@ -723,7 +723,7 @@
           expect(warnSpy).toHaveBeenCalled()
           expect(warnSpy.mostRecentCall.args[0]).toContain "foo.int"

-    fdescribe ".observeUserConfig()", ->
+    describe ".observeUserConfig()", ->
       updatedHandler = null

       writeConfigFile = (data) ->


Unspy Date.now when jasmine.useRealClock is called

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


bugfix #5 deprecate Intercom.io client side

 On branch master

	modified:   app/public/commonjs/mvp-main.coffee

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/FireworksProject/corkboard-website.git/'


fix(model): model scrolling after download

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


unblock method since it may take long to fullfill

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


A selection of more central cities

A selection of more central cities

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

--- components/locations/featured_cities.coffee
+++ components/locations/featured_cities.coffee
@@ -0,0 +1,16 @@
+_ = require 'underscore'
+cities = require './cities.coffee'
+selected = [
+  'new-york'
+  'london'
+  'los-angeles'
+  'paris'
+  'berlin'
+  'miami'
+  'san-francisco'
+  'hong-kong'
+  'milan'
+  'tokyo'
+]
+
+module.exports = _.filter cities, ({ slug }) -> _.contains selected, slug


fix show test

fix show test

--- apps/location/test/templates.coffee
+++ apps/location/test/templates.coffee
@@ -2,6 +2,7 @@
 path = require 'path'
 fs = require 'fs'
 Backbone = require 'backbone'
+sinon = require 'sinon'
 { fabricate } = require 'antigravity'
 PartnerShow = require '../../../models/partner_show'
 PartnerShows = require '../../../collections/partner_shows'
@@ -31,6 +32,7 @@
         fairs: new Fairs([@fair])
         sd: {}
         otherLocations: []
+        crop: sinon.stub()
       )

     it 'should be titled with location name', ->
@@ -53,6 +55,7 @@
         profiles: new Profiles()
         fairs: new Fairs()
         sd: {}
+        crop: sinon.stub()
         otherLocations: [['san-francisco', {name: 'San Francisco'}]]
       )

@@ -76,6 +79,7 @@
         fairs: new Fairs()
         sd: {}
         otherLocations: []
+        crop: sinon.stub()
       )

     it 'should list profiles', ->


unify unless err checks

unify unless err checks


codepicker enter

codepicker enter

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


Implement a few commands

Implement a few commands

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/tombell/hubot-github-issues.git/'


Fix breakage

Fix breakage

--- src/atom/project.coffee
+++ src/atom/project.coffee
@@ -11,7 +11,7 @@

   getFilePaths: ->
     projectUrl = @url
-    fs.async.list(@url, true).pipe (urls) ->
+    fs.async.listFiles(@url, true).pipe (urls) ->
       urls = (url.replace(projectUrl, "") for url in urls when fs.isFile(url))
       urls


get out of there

get out of there

--- src/atom/project.coffee
+++ src/atom/project.coffee
@@ -13,13 +13,5 @@
   open: (path) ->
     return false if not fs.isDirectory url

-    #if not @path
-
-    #parent = @path.replace(/([^\/])$/, "$1/")
-    #child = path.replace(/([^\/])$/, "$1/")
-
-    # If the child is contained by the parent, it can be opened by this window
-    #child.match "^" + parent
-
     @path = path
     @show()


Update packages.cson

Update packages.cson

Signed-off-by: Thanh Ha <ddef40ffcf330e0c1e91b15bb1b0d4953f1680d8@linux.com>

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


Minor changes

Minor changes

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


Add component to rotate buffers

Add component to rotate buffers

error: pathspec 'components/Rotate-node.coffee' did not match any file(s) known to git

--- components/Rotate-node.coffee
+++ components/Rotate-node.coffee
@@ -0,0 +1,78 @@
+noflo = require 'noflo'
+sharp = require 'sharp'
+Canvas = require('noflo-canvas').canvas
+
+# @runtime noflo-nodejs
+# @name Rotate
+
+exports.getComponent = ->
+  c = new noflo.Component
+
+  c.icon = 'expand'
+  c.description = 'Rotate a given image buffer to a new angle'
+
+  c.inPorts.add 'buffer',
+    datatype: 'object'
+    description: 'Image to be resized'
+  c.inPorts.add 'angle',
+    datatype: 'number'
+    description: 'New angle'
+    required: false
+  c.outPorts.add 'buffer',
+    datatype: 'object'
+  c.outPorts.add 'angle',
+    datatype: 'number'
+    required: false
+  c.outPorts.add 'error',
+    datatype: 'object'
+    required: false
+
+  noflo.helpers.WirePattern c,
+    in: ['buffer']
+    params: ['angle']
+    out: ['buffer', 'angle']
+    async: true
+    forwardGroups: true
+  , (payload, groups, out, callback) ->
+    {angle} = c.params
+    inputBuffer = sharp payload
+    if angle is null
+      # Rotate based on EXIF
+      inputBuffer.metadata (err, metadata) ->
+        exifOrientation = metadata.orientation
+        angle = switch exifOrientation
+          when 1 then 0
+          when 3 then 180
+          when 6 then 90
+          when 8 then -90
+          else 0
+        try
+          inputBuffer
+          .rotate(angle)
+          .withMetadata()
+          .toFormat 'png'
+          .toBuffer (err, outputBuffer, info) ->
+            if err
+              return callback err
+            out.buffer.send outputBuffer
+            out.angle.send angle
+            do callback
+        catch err
+          return callback err
+    else
+      # Rotate based on user defined angle
+      try
+        inputBuffer
+        .rotate(angle)
+        .withMetadata()
+        .toFormat 'png'
+        .toBuffer (err, outputBuffer, info) ->
+          if err
+            return callback err
+          out.buffer.send outputBuffer
+          out.angle.send angle
+          do callback
+      catch err
+        return callback err
+
+  c


main.dev.coffee: flag inheritance added

main.dev.coffee: flag inheritance added

--- config/main.dev.coffee
+++ config/main.dev.coffee
@@ -81,6 +81,7 @@
     botchannel : yes
     gitlab     : no

+  (require './inheritOptionFlags') credentials, options
   KONFIG = require('./generateKonfig')(options, credentials)
   (require './inheritEnvVars') KONFIG  if options.inheritEnvVars
   KONFIG.workers = require('./workers')(KONFIG, options, credentials)


General script

General script

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

--- scripts/claudebot.coffee
+++ scripts/claudebot.coffee
@@ -0,0 +1,26 @@
+# Description:
+#   ClaudeBot's Utility Belt
+#	For everything else that don't belong...
+#
+# Dependencies:
+#   "moment": "^2.5.1"
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   None
+#
+# Author:
+#   MrSaints
+#
+# Notes:
+#	* TODO: Brain save wrapper?
+
+moment = require 'moment'
+
+module.exports = (robot) ->
+	start = moment()
+
+	robot.router.get '/', (req, res) ->
+		res.send "I am Claude, the bot and I have been sentient since #{start.fromNow()}."


Fix function check for native host functions on iOS.

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


Use CoffeeScript in Rails

Use CoffeeScript in Rails

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

--- app/assets/javascripts/main.coffee
+++ app/assets/javascripts/main.coffee
@@ -0,0 +1,2 @@
+$ ->
+  console.log "Hello, CoffeeScript in Rails"


function-provider - Also allow usage outside functions.

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/Adirelle/atom-autocomplete-php.git/'


NEW-FUNC 'ui-view' helper for direct nested view injection

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

--- src/helpers/view.coffee
+++ src/helpers/view.coffee
@@ -0,0 +1,29 @@
+class Neck.Helper.view extends Neck.Helper
+  template: true
+  attributes: ['viewParams', 'viewInherit']
+  id: null
+
+  constructor: ->
+    super
+
+    @watch '_main', (newId)->
+      if newId and not (typeof newId is 'string')
+        throw "'ui-view' main accessor has to be string controller ID"
+
+      return if newId is @id
+      @$el.empty()
+
+      if @view
+        @view.$el = $()
+        @view.remove()
+
+      if @id = newId
+        Controller = @injector.load @id, type: 'controller'
+        @view = new Controller el: @$el, params: @scope.viewParams, template: @id, parent: if @scope.viewInherit then @parent
+
+        @view.scope._context = @view if @scope.viewInherit
+        @view.injector = @injector
+        @view.parseSelf = false
+
+        @view.render()
+


:lipstick:

:lipstick:

--- src/module-cache.coffee
+++ src/module-cache.coffee
@@ -103,12 +103,12 @@
 if debug
   global.loadCount = 0
   global.requireTime = 0
+  global.moduleCache = cache

   originalLoad = Module::load
   Module::load = ->
     global.loadCount++
     originalLoad.apply(this, arguments)
-

   originalRequire = Module::require
   Module::require = ->


updated the coffee script with click counter

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


Removing stray test console.log

Removing stray test console.log

--- app/views/play/WorldMapView.coffee
+++ app/views/play/WorldMapView.coffee
@@ -139,7 +139,6 @@
     # TODO: Cleanup @afterRender when this test is finished
     firstLevelID = 'dungeons-of-kithgard'
     testGroup = me.getDirectFirstGroup()
-    console.log 'WorldMapView initABTestAutoFirstLevel', testGroup
     unless @nextLevel? or (firstLevelID of @levelStatusMap) or testGroup is -1
       @ABTestSkipHighlight = testGroup is 1
       if testGroup is 1


Fixed ObjectID types on readFile and readFileStream 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/renanhangai/servitude.git/'


Split the View class into a separate file

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

--- src/readmill/view.coffee
+++ src/readmill/view.coffee
@@ -0,0 +1,182 @@
+jQuery = Annotator.$
+
+# View class for rendering the plugin badge that allows the user to login and
+# logout of the Readmill service as well as display the current book.
+#
+# This instance will publish various events when the user interacts with the
+# badge. These can be listened for using the @subscribe()/@on() methods.
+#
+# Examples
+#
+#   view = new View
+#   jQuery("body").append view.render
+#
+#   view.updateBook(book)
+#   view.on "connect",    -> view.login(user)
+#   view.on "disconnect", -> view.logout()
+#
+# Returns a new instance of View.
+class View extends Annotator.Class
+  # Map of events/handlers to be bound to @element.
+  events:
+    ".annotator-readmill-connect a click": "_onConnectClick"
+    ".annotator-readmill-logout a click":  "_onLogoutClick"
+
+  # Classes used to manipulate view state.
+  classes:
+    loggedIn: "annotator-readmill-logged-in"
+
+  # Template string for the inner html of the view.
+  template: """
+
+
+
+

+
+
+

+

+

+    Connect with Readmill
+

+

+    Log Out
+

+  """
+
+  # Public: Creates a new instance of the view class and creates the @element
+  # property which is a jQuery wrapper around the root View element.
+  #
+  # Returns nothing.
+  constructor: ->
+    super jQuery("
").html(@template)
+
+  # Public: Triggers the "connect" event passing in the View instance to
+  # all registered listeners. This is called when the user wishes to
+  # connect with the Readmill service. The implmentor should then call
+  # @login() once the user has authenticated and the user object has been
+  # retrieved from the server.
+  #
+  # Examples
+  #
+  #   view.connect()
+  #
+  # Returns itself.
+  connect: ->
+    @publish "connect", [this]
+
+  # Public: Triggers the "disconnect" event passing in the View instance to
+  # all registered listeners. This is called when the user wishes to
+  # logout of the Readmill service. The implmentor should then call
+  # @logout() once the user has been logged out from Readmill.
+  #
+  # Examples
+  #
+  #   view.disconnect()
+  #
+  # Returns itself.
+  disconnect: ->
+    @publish "disconnect", [this]
+
+  # Public: Updates the view to the "logged in" state. Showing the log out
+  # button and user details. This should be called once the user has been
+  # authenticated with the Readmill service.
+  #
+  # Publishes the "login" event once the view has updated.
+  #
+  # user - The user object retrieved from Readmill.
+  #
+  # Examples
+  #
+  #   user = getLoggedInUser()
+  #   view.login user
+  #
+  # Returns itself.
+  login: (user) ->
+    @updateUser(user) if user
+    @element.addClass @classes.loggedIn
+    @publish "login", [this]
+
+  # Public: Updates the view to the "logged out" state. Showing the connect
+  # button. This should be called if the accessToken expires or the user
+  # manually logs out.
+  #
+  # Publishes the "logout" event once the view has updated.
+  #
+  # Examples
+  #
+  #   view.on "disconnect" ->
+  #     view.logout()
+  #
+  # Returns itself.
+  logout: ->
+    @element.removeClass(@classes.loggedIn).html(@template)
+
+    @user = null
+    @updateBook()
+
+    @publish "logout", [this]
+
+  # Public: Updates the user elements within the view. Will update the @user
+  # property or simply use the current value. This method will not transition
+  # the view to the logged in state.
+  #
+  # user - A user object (deafult: @user).
+  #
+  # Returns itself.
+  updateUser: (@user=@user) ->
+    el = @element
+    if @user
+      el.find(".annotator-readmill-fullname").escape(@user.fullname)
+      el.find(".annotator-readmill-username").escape(@user.username)
+      el.find(".annotator-readmill-avatar").attr("href", @user.permalink_url)
+        .find("img").attr("src", @user.avatar_url)
+    this
+
+  # Public: Updates the portion of the view that display book information.
+  # Also updates the @book property.
+  #
+  # book - A book object (default: @book).
+  #
+  # Examples
+  #
+  #   book = getBook()
+  #   view.updateBook book
+  #
+  # Returns itself.
+  updateBook: (@book=@book) ->
+    text = if @book then @book.title else "Loading book…"
+    @element.find(".annotator-readmill-book").escape(text)
+    this
+
+  # Public: Renders the full view. Should be called once the instance is
+  # created just before/after it is appended to the document.
+  #
+  # Examples
+  #
+  #   jQuery("body").append view.render()
+  #
+  # Returns the @element property.
+  render: ->
+    @updateBook()
+    @updateUser()
+    @element
+
+  # Callback for click events on the "connect" button.
+  #
+  # event - A mouse jQuery.Event object.
+  #
+  # Returns nothing.
+  _onConnectClick: (event) =>
+    event.preventDefault()
+    @connect()
+
+  # Callback for click events on the "logout" button.
+  #
+  # event - A mouse jQuery.Event object.
+  #
+  # Returns nothing.
+  _onLogoutClick: (event) =>
+    event.preventDefault()
+    @disconnect()
+    @logout()


Update Atom version

Update Atom version

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


Fixing `cheer` script

Fixing `cheer` script

This script was broken due a change at imgur's API json representation. Now the JSON returns the encapsulated images gallery as a `data` element. This error was causing hubot to hang everytime someone tried to use this script

--- src/scripts/cheer.coffee
+++ src/scripts/cheer.coffee
@@ -26,6 +26,6 @@
     .http('http://imgur.com/r/aww.json')
       .get() (err, res, body) ->
         images = JSON.parse(body)
-        images = images.gallery
+        images = images.data
         image  = msg.random images
         msg.send "http://i.imgur.com/#{image.hash}#{image.ext}"


chagne default sort property updated_at => 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/hi104/ember-note.git/'


task readability improvemenets

task readability improvemenets

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


help fix

help fix


inspect depth

inspect depth


bug fix

bug fix


Mongo.toID now returns the _id property if an object has one


Fixed many errors with Mongo module when writing files


accounts for items that do not have course them or course type selected

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


Add a test

Add a test

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


Add timeout for loading resources on exporting PDF

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/will-hart/marp.git/'


add functions for dealing with cookies clientside

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

--- src/client/cookie.coffee
+++ src/client/cookie.coffee
@@ -0,0 +1,54 @@
+# functions to get, set, remove cookies clientside
+# source
+# https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#A_little_framework_a_complete_cookies_readerwriter_with_full_unicode_support
+
+module.exports.getCookie = (
+  document
+) ->
+  (sKey) ->
+    unless sKey?
+      return null
+    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null
+
+module.exports.setCookie = (
+  document
+) ->
+  (sKey, sValue, vEnd, sPath, sDomain, bSecure) ->
+    if (not sKey?) or /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)
+      return false
+    sExpires = ""
+    if (vEnd)
+      switch (vEnd.constructor)
+        when Number
+          sExpires = if vEnd is Infinity then "; expires=Fri, 31 Dec 9999 23:59:59 GMT" else "; max-age=" + vEnd
+        when String
+          sExpires = "; expires=" + vEnd
+        when Date
+          sExpires = "; expires=" + vEnd.toUTCString()
+    document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (if sDomain then "; domain=" + sDomain else "") + (if sPath then "; path=" + sPath else "") + (if bSecure then "; secure" else "")
+    return true
+
+module.exports.removeCookie = (
+  document
+  hasCookie
+) ->
+  (sKey, sPath, sDomain) ->
+    unless hasCookie(sKey)
+      return false
+    document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (if sDomain then "; domain=" + sDomain else "") + (if sPath then "; path=" + sPath else "")
+    return true
+
+module.exports.hasCookie = (
+  document
+) ->
+  (sKey) ->
+    unless sKey?
+      return false
+    return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie)
+
+module.exports.getCookieKeys = (
+  document
+) ->
+  ->
+    aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/)
+    return aKeys.map decodeURIComponent


teams: join: prepare user data on welcome tab

--- client/landing/site.landing/coffee/team/tabs/teamwelcometab.coffee
+++ client/landing/site.landing/coffee/team/tabs/teamwelcometab.coffee
@@ -24,6 +24,7 @@
     super options, data

     { mainController } = KD.singletons
+    teamData           = KD.utils.getTeamData()

     @header = new MainHeaderView
       cssClass : 'team'
@@ -32,7 +33,20 @@
     @correct = new KDButtonView
       title      : 'Yes, that\'s the right address'
       style      : 'TeamsModal-button TeamsModal-button--green correct'
-      callback   : -> KD.singletons.router.handleRoute '/Join'
+      callback   : ->
+        go = ->
+          KD.utils.storeNewTeamData 'signup', formData
+          KD.singletons.router.handleRoute '/Join'
+
+        formData          = {}
+        { email }         = teamData.invitation
+        formData.join     = yes
+        formData.username = email
+        formData.slug     = KD.config.group.slug
+
+        KD.utils.validateEmail { email },
+          success : -> formData.alreadyMember = no; go()
+          error   : -> formData.alreadyMember = yes; go()

     @decorateTeamMembers()


jupyter: add file from refactoring

jupyter: add file from refactoring

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

--- src/smc-webapp/jupyter/server-urls.coffee
+++ src/smc-webapp/jupyter/server-urls.coffee
@@ -0,0 +1,43 @@
+###
+Functions for getting or formatting url's for various backend endpoints
+###
+
+exports.get_server_url = (project_id) ->
+    return "#{window?.smc_base_url ? ''}/#{project_id}/raw/.smc/jupyter"
+
+exports.get_blob_url = (project_id, extension, sha1) ->
+    return "#{exports.get_server_url(project_id)}/blobs/a.#{extension}?sha1=#{sha1}"
+
+exports.get_logo_url = (project_id, kernel) ->
+    return "#{exports.get_server_url(project_id)}/kernelspecs/#{kernel}/logo-64x64.png"
+
+exports.get_complete_url = (project_id, path, code, cursor_pos) ->
+    s = "#{exports.get_server_url(project_id)}/kernels/complete?code=#{encodeURIComponent(code)}&path=#{encodeURIComponent(path)}"
+    if cursor_pos?
+        s += "&cursor_pos=#{encodeURIComponent(cursor_pos)}"
+    return s
+
+exports.get_introspect_url = (project_id, path, code, cursor_pos, level) ->
+    s = "#{exports.get_server_url(project_id)}/kernels/introspect?code=#{encodeURIComponent(code)}&path=#{encodeURIComponent(path)}"
+    if cursor_pos?
+        s += "&cursor_pos=#{encodeURIComponent(cursor_pos)}"
+    if level?
+        s += "&level=#{encodeURIComponent(level)}"
+    return s
+
+exports.get_store_url = (project_id, path, key, value) ->
+    return "#{exports.get_server_url(project_id)}/kernels/store?key=#{encodeURIComponent(key)}&value=#{encodeURIComponent(value)}&path=#{encodeURIComponent(path)}"
+
+
+
+# signal should be SIGINT or SIGKILL (see https://nodejs.org/api/process.html#process_process_kill_pid_signal)
+exports.get_signal_url = (project_id, path, signal) ->
+    return "#{exports.get_server_url(project_id)}/kernels/signal/#{signal}?path=#{encodeURIComponent(path)}"
+
+exports.get_kernel_info_url = (project_id, path) ->
+    return "#{exports.get_server_url(project_id)}/kernels/kernel_info?path=#{encodeURIComponent(path)}"
+
+# get more output messages for the given id
+exports.get_more_output_url = (project_id, path, id) ->
+    return "#{exports.get_server_url(project_id)}/kernels/more_output?path=#{encodeURIComponent(path)}&id=#{encodeURIComponent(id)}"
+


fix (supersonic.module.iframes) Move resize outside hideLoadIndicator as it does not belong there, debounce frame content changes to prevent unnecessary resizes and to give DOM time to render before resize.

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


Improvement of function buffer checker

Improvement of function buffer checker

--- lib/services/php-file-parser.coffee
+++ lib/services/php-file-parser.coffee
@@ -6,8 +6,10 @@
 ]

 namespaceDeclaration = 'namespace '
+module.exports =
+  # Simple cache to avoid duplicate computation for each providers
+  cache: []

-module.exports =
   ###*
    * Returns the current class from the buffer
    * @param {TextEditor} editor
@@ -56,17 +58,44 @@
   isInFunction: (editor, bufferPosition) ->
     text = editor.getTextInBufferRange([[0, 0], bufferPosition])

+    # If last request was the same
+    if @cache[text]?
+      return @cache[text]
+
+    # Reinitialize current cache
+    @cache = []
+
+    console.log 'ok'
     row = bufferPosition.row
     rows = text.split('\n')

+    openedBlocks = 0
+    closedBlocks = 0
+
+    result = false
+
     # for each row
     while row != -1
-      line = rows[row].trim()
+      line = rows[row]

-      # Looking for a line with function scope
-      if editor.scopeDescriptorForBufferPosition([row, 0]).getScopeChain().indexOf("function.php") != -1
-        return true
+      # Get chain of all scopes
+      chain = editor.scopeDescriptorForBufferPosition([row, line.length]).getScopeChain()
+
+      # }
+      if chain.indexOf("scope.end") != -1
+        closedBlocks++
+      # {
+      else if chain.indexOf("scope.begin") != -1
+        openedBlocks++
+      # function
+      else if chain.indexOf("function") != -1
+        # If more openedblocks than closedblocks, we are in a function
+        if openedBlocks > closedBlocks
+          result = true
+
+        break

       row--

-    return false
+    @cache[text] = result
+    return result


Add browser integration tests

Add browser integration tests

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

--- test/browser.spec.coffee
+++ test/browser.spec.coffee
@@ -0,0 +1,135 @@
+# Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+#     http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+helpers = require('./helpers')
+AWS = helpers.AWS
+config = {}
+try
+  config = require('./configuration')
+
+s3 = new AWS.S3(AWS.util.merge(config, config.s3))
+dynamodb = new AWS.DynamoDB(AWS.util.merge(config, config.dynamodb))
+sqs = new AWS.SQS(AWS.util.merge(config, config.sqs))
+sns = new AWS.SNS(AWS.util.merge(config, config.sns))
+sts = new AWS.STS(AWS.util.merge(config, config.sts))
+
+uniqueName = (prefix) ->
+  if prefix
+    prefix + '-' + AWS.util.date.getDate().getTime()
+  else
+    AWS.util.date.getDate().getTime().toString()
+
+eventually = (condition, next, done) ->
+  options = delay: 0, backoff: 500, maxTime: 10
+  delay = options.delay
+  started = AWS.util.date.getDate()
+  id = 0
+  nextFn = ->
+    now = AWS.util.date.getDate()
+    if (now - started < options.maxTime * 1000)
+      next (err, data) ->
+        if condition(err, data)
+          done(err, data)
+        else
+          timeoutFn = ->
+            clearInterval(id)
+            delay += options.backoff
+            nextFn()
+          id = setInterval(timeoutFn, delay)
+  nextFn()
+
+noError = (err) -> expect(err).toEqual(null)
+
+integration = (label, fn) ->
+  it label, ->
+    done = false
+    runs -> fn(-> done = true)
+    waitsFor -> done == true
+
+integrationTests = (fn) ->
+  if config.accessKeyId and AWS.util.isBrowser()
+    describe 'Integration tests', fn
+
+integrationTests ->
+  describe 'AWS.S3', ->
+    testWrite = (done, body, compareFn) ->
+      key = uniqueName('test')
+      s3.putObject {Key: key, Body: body}, (err, data) ->
+        noError(err)
+        s3.getObject {Key: key}, (err, data) ->
+          noError(err)
+          if compareFn
+            compareFn(data)
+          else
+            expect(data.Body.toString()).toEqual(body)
+          s3.deleteObject(Key: key).send(done)
+
+    integration 'GETs and PUTs objects to a bucket', (done) ->
+      testWrite done, 'ƒoo'
+
+    integration 'writes typed array data', (done) ->
+      testWrite done, new Uint8Array([2, 4, 8]), (data) ->
+        expect(data.Body[0]).toEqual(2)
+        expect(data.Body[1]).toEqual(4)
+        expect(data.Body[2]).toEqual(8)
+
+    integration 'writes blobs', (done) ->
+      testWrite done, new Blob(['a', 'b', 'c']), (data) ->
+        expect(data.Body[0]).toEqual(97)
+        expect(data.Body[1]).toEqual(98)
+        expect(data.Body[2]).toEqual(99)
+
+  describe 'AWS.DynamoDB', ->
+    integration 'writes and reads from a table', (done) ->
+      key = uniqueName('test')
+      dynamodb.putItem {Item: {id: {S: key}, data: {S: 'ƒoo'}}}, (err, data) ->
+        noError(err)
+        dynamodb.getItem {Key: {id: {S: key}}}, (err, data) ->
+          noError(err)
+          expect(data.Item.data.S).toEqual('ƒoo')
+          dynamodb.deleteItem({Key: {id: {S: key}}}).send(done)
+
+  describe 'AWS.STS', ->
+    integration 'gets a session token', (done) ->
+      sts.getSessionToken (err, data) ->
+        noError(err)
+        expect(data.Credentials.AccessKeyId).not.toEqual('')
+        done()
+
+  describe 'AWS.SQS', ->
+    integration 'posts and receives messages on a queue', (done) ->
+      msg = 'ƒoo'
+      sqs.createQueue {QueueName: uniqueName('aws-sdk-js')}, (err, data) ->
+        url = data.QueueUrl
+        sqs = new AWS.SQS(sqs.config)
+        sqs.config.params = QueueUrl: url
+        eventually ((err, data) -> data.QueueUrls.indexOf(url) >= 0),
+          ((cb) -> sqs.listQueues(cb)), ->
+            sqs.sendMessage {MessageBody:msg}, (err, data) ->
+              noError(err)
+              eventually ((err, data) -> data.Messages[0].Body == msg),
+                ((cb) -> sqs.receiveMessage(cb)), (err, data) ->
+                  noError(err)
+                  expect(data.Messages[0].MD5OfBody).toEqual(AWS.util.crypto.md5(msg, 'hex'))
+                  sqs.deleteQueue(done)
+
+  describe 'AWS.SNS', ->
+    integration 'creates and deletes topics', (done) ->
+      sns.createTopic {Name: uniqueName('aws-sdk-js')}, (err, data) ->
+        noError(err)
+        arn = data.TopicArn
+        sns = new AWS.SNS(sns.config)
+        sns.config.params = TopicArn: arn
+        sns.listTopics (err, data) ->
+          expect(data.Topics.filter((o) -> o.TopicArn == arn)).not.toEqual(null)
+          sns.deleteTopic(done)


add git commit script

add git commit script

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

--- src/github-commits.coffee
+++ src/github-commits.coffee
@@ -0,0 +1,53 @@
+# Description:
+#   An HTTP Listener for notifications on github pushes
+#
+# Dependencies:
+#   "url": ""
+#   "querystring": ""
+#   "gitio": "1.0.1"
+#
+# Configuration:
+#   Just put this url <HUBOT_URL>:<PORT>/hubot/gh-commits?room=<room> into you'r github hooks
+#
+# Commands:
+#   None
+#
+# URLS:
+#   POST /hubot/gh-commits?room=<room>[&type=<type]
+#
+# Authors:
+#   nesQuick
+
+url = require('url')
+querystring = require('querystring')
+gitio = require('gitio')
+
+module.exports = (robot) ->
+
+  robot.router.post "/hubot/gh-commits", (req, res) ->
+    query = querystring.parse(url.parse(req.url).query)
+
+    res.end
+
+    user = {}
+    user.room = query.room if query.room
+    user.type = query.type if query.type
+
+    try
+      payload = JSON.parse req.body.payload
+
+      if payload.commits.length > 0
+        robot.send user, "Got #{payload.commits.length} new commits from #{payload.commits[0].author.name} on #{payload.repository.name}"
+        for commit in payload.commits
+          do (commit) ->
+            gitio commit.url, (err, data) ->
+              robot.send user, "  * #{commit.message} (#{if err then commit.url else data})"
+      else
+        if payload.created
+          robot.send user, "#{payload.pusher.name} created: #{payload.ref}: #{payload.base_ref}"
+        if payload.deleted
+          robot.send user, "#{payload.pusher.name} deleted: #{payload.ref}"
+
+    catch error
+      console.log "github-commits error: #{error}. Payload: #{req.body.payload}"
+


Added supprot for view-id navigation for super-navbar-button.


Hacky fix to make robot.respond work.

Hacky fix to make robot.respond work.

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


Fixes #7 don't attempt to open tasks unless a project is open

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/mzgnr/imdone-atom.git/'


Refactor

Refactor

[#74763660]

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


Handle ESC[^ - reserved

Handle ESC[^ - reserved

--- app/assets/javascripts/player/vt.js.coffee
+++ app/assets/javascripts/player/vt.js.coffee
@@ -252,6 +252,8 @@
         @saveCursor()
       when "u"
         @restoreCursor()
+      when "^"
+        # reserved
       else
         throw "no handler for CSI term: " + term


Updated hashcode

Updated hashcode

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

--- src/core/hashcode.coffee
+++ src/core/hashcode.coffee
@@ -0,0 +1,16 @@
+do (String) ->
+  ###
+    Provides a hashcode for strings
+  ###
+  String::hashCode = ->
+    hash = 0
+
+    if @length == 0
+      return hash
+
+    for i in @
+      char = @charCodeAt(i)
+      hash = ((hash << 5) - hash) + char
+      hash = hash & hash # Convert to 32bit integer
+
+    hash


add tests for file model

add tests for file model

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

--- tests/models_file.coffee
+++ tests/models_file.coffee
@@ -0,0 +1,53 @@
+should = require 'should'
+moment = require 'moment'
+express = require 'express'
+fs = require 'fs'
+
+File = require '../server/models/file'
+
+
+describe 'File model', ->
+
+    createdFile = null
+    server = null
+
+    before (done) ->
+        app = express()
+        app.use express.static 'tests/files'
+        app.use express.static 'files'
+        server = app.listen 12223, (err) ->
+            done()
+
+    after (done) ->
+        server.close()
+        if createdFile?
+            createdFile.destroy done
+        else
+            done()
+
+    it 'Can create a Cozy File from a given pdf url', (done) ->
+        @timeout 5000
+
+        fileName = 'bill.pdf'
+        path = "/bills"
+        date = moment()
+        url = 'http://localhost:12223/bill.pdf'
+        tags = ["bill"]
+
+        File.createNew fileName, path, date, url, tags, (err, file) ->
+            should.exist file
+            createdFile = file
+            file.name.should.equal fileName
+            file.path.should.equal path
+            file.tags.length.should.equal 1
+            file.tags[0].should.equal "bill"
+
+            stream = file.getBinary 'file', (err) ->
+                originalContent = fs.readFileSync './tests/files/bill.pdf'
+                testContent = fs.readFileSync('/tmp/test-bill.pdf')
+                testContent.toString().should.equal originalContent.toString()
+                done()
+
+            stream.pipe fs.createWriteStream '/tmp/test-bill.pdf'
+
+


Add tasks/humans.coffee

Add tasks/humans.coffee

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

--- tasks/humans.coffee
+++ tasks/humans.coffee
@@ -0,0 +1,7 @@
+gulp = require 'gulp'
+humans = require 'gulp-humans'
+
+module.exports = () ->
+  return gulp.src this.opts.config.humans.src
+    .pipe humans(this.opts.config.humans.opts)
+    .pipe gulp.dest this.opts.config.humans.dest


remove highlights when removing annotation.

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


video: add ParticipantTypes

video: add ParticipantTypes

Simple Types to be used for convinience.

error: pathspec 'client/app/lib/videocollaboration/types/participant.coffee' did not match any file(s) known to git

--- client/app/lib/videocollaboration/types/participant.coffee
+++ client/app/lib/videocollaboration/types/participant.coffee
@@ -0,0 +1,48 @@
+###*
+ * Base class for representing a video participant.
+ * OpenTok has 2 different idea of users. `Publisher` and `Subscriber`.
+ * `Publisher` is logged in user. `Subscriber`s are other users that are
+ * connected to OpenTok session.
+ *
+ * This class acts as an Abstract class and is not even exported.
+ * @see {Publisher}
+ * @see {Subscriber}
+ *
+ * @class ParticipantType.BaseVideoParticipant
+###
+class BaseVideoParticipant
+
+  constructor: (nick, videoData) ->
+    @nick = nick
+    @videoData = videoData
+    @type = null
+
+  getType: -> @type
+
+
+###*
+ * Transformation from OpenTok Publisher -> Koding ChatVideoPublisher
+ *
+ * @class ParticipantType.Publisher
+###
+class Publisher extends BaseVideoParticipant
+
+  constructor: (nick, videoData) ->
+    super nick, videoData
+    @type = 'publisher'
+
+
+###*
+ * Transformation from OpenTok Subscriber -> Koding ChatVideoSubscriber
+ *
+ * @class ParticipantType.Subscriber
+###
+class Subscriber extends BaseVideoParticipant
+
+  constructor: (nick, videoData) ->
+    super nick, videoData
+    @type = 'subscriber'
+
+
+module.exports = participantTypes = { Publisher, Subscriber }
+


Add user schema

Add user schema

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

--- server/models/user.coffee
+++ server/models/user.coffee
@@ -0,0 +1,18 @@
+# A user on the site
+mongoose = require 'mongoose'
+
+Schema = mongoose.Schema
+ObjectId = Schema.ObjectId
+
+userSchema = new Schema
+  name:
+    type: String
+    required: true
+  bio:
+    type: String
+    required: true
+  uid:
+    type: Number
+    required: true
+
+exports.User = mongoose.model 'User', userSchema


add KCWharf strategy

add KCWharf strategy

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

--- strategies/KCWharf.coffee
+++ strategies/KCWharf.coffee
@@ -0,0 +1,18 @@
+# Buy Wharf with every $5 and King's Court with every $7. Probably not
+# optimized.
+{
+  name: 'KCWharf'
+  author: 'rspeer'
+  gainPriority: (state, my) -> [
+    "Colony" if my.countInDeck("Platinum") > 0
+    "Province" if state.countInSupply("Colony") <= 6
+    "Duchy" if 0 < state.gainsToEndGame() <= 5
+    "Estate" if 0 < state.gainsToEndGame() <= 2
+    "Platinum"
+    "King's Court"
+    "Gold"
+    "Wharf"
+    "Silver"
+    "Copper" if state.gainsToEndGame() <= 3
+  ]
+}


Update paths in task bootstrap for windows

Fixes #1049

--- src/task.coffee
+++ src/task.coffee
@@ -51,8 +51,10 @@
       #{coffeeCacheRequire}
       #{taskBootstrapRequire}
     """
+    bootstrap = bootstrap.replace(/\\/g, "\\\\") if process.platform == 'win32'

     taskPath = require.resolve(taskPath)
+    taskPath = taskPath.replace(/\\/g, "\\\\") if process.platform == 'win32'

     env = _.extend({}, process.env, {taskPath, userAgent: navigator.userAgent})
     args = [bootstrap, '--harmony_collections']


added tests

added tests

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

--- test/factoids_test.coffee
+++ test/factoids_test.coffee
@@ -0,0 +1,69 @@
+chai = require 'chai'
+sinon = require 'sinon'
+chai.use require 'sinon-chai'
+
+expect = chai.expect
+
+describe 'factoids', ->
+  beforeEach ->
+    @robot =
+      hear: sinon.spy()
+      respond: sinon.spy()
+      brain:
+        on: sinon.spy()
+      router:
+        get: sinon.spy()
+
+    @msg =
+      send: sinon.spy()
+      reply: sinon.spy()
+      message:
+        user:
+          name: 'sinon'
+
+    require('../src/factoids')(@robot)
+
+  it 'registers a hear listener', ->
+    expect(@robot.hear).to.have.been.calledWith(/^!([\w\s-]{2,}\w)( @.+)?/i)
+
+  describe 'registers respond listeners', ->
+    it 'responds to learn command', ->
+      expect(@robot.respond).to.have.been.calledWith(/learn (.{3,}) = (.+)/i)
+
+      @msg.match = ['', 'test', '123']
+      @robot.respond.args[0][1](@msg)
+      expect(@msg.send).to.have.been.calledWith('OK sinon, test is now 123')
+
+    it 'responds to learn command with substitution', ->
+      expect(@robot.respond).to.have.been.calledWith(/learn (.{3,}) =~ s\/(.+)\/(.+)\/(.*)/i)
+
+      @msg.match = ['', 'test', '123', '234', 'gi']
+      @robot.respond.args[1][1](@msg)
+      expect(@msg.send).to.have.been.calledWith('OK sinon, test is now 234')
+
+    it 'responds to forget command', ->
+      expect(@robot.respond).to.have.been.calledWith(/forget (.{3,})/i)
+
+      @msg.match = ['', 'test']
+      @robot.respond.args[2][1](@msg)
+      expect(@msg.reply).to.have.been.calledWith('OK, forgot test')
+
+    it 'responds to factoids command', ->
+      expect(@robot.respond).to.have.been.calledWith(/factoids/i)
+
+      @robot.respond.args[3][1](@msg)
+      expect(@msg.reply).to.have.been.calledWith('http://not-yet-set/hubot/factoids')
+
+    it 'responds to alias command', ->
+      expect(@robot.respond).to.have.been.calledWith(/alias (.{3,}) = (.{3,})/i)
+
+      @msg.match = ['', 'blah', 'test']
+      @robot.respond.args[4][1](@msg)
+      expect(@msg.send).to.have.been.calledWith('OK sinon, aliased blah to test')
+
+    it 'responds to drop command', ->
+      expect(@robot.respond).to.have.been.calledWith(/drop (.{3,})/i)
+
+      @msg.match = ['', 'blah']
+      @robot.respond.args[5][1](@msg)
+      expect(@msg.send).to.have.been.calledWith('OK, blah has been dropped.')


:green_heart: Fix specs

:green_heart: Fix specs

--- spec/tool-bar-spec.coffee
+++ spec/tool-bar-spec.coffee
@@ -6,7 +6,7 @@

     waitsForPromise ->
       atom.packages.activatePackage('tool-bar').then (pack) ->
-        toolBarService = pack.mainModule.provideStatusBar()
+        toolBarService = pack.mainModule.provideToolBar()

   describe '@activate', ->
     it 'appends only one tool bar', ->


platform docs in final format

platform docs in final format