Configures grunt connect

Configures grunt connect

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

--- grunt-tasks/connect.coffee
+++ grunt-tasks/connect.coffee
@@ -0,0 +1,6 @@
+module.exports = (grunt) ->
+  grunt.config 'connect',
+    server:
+      options:
+        port: 7777
+        keepalive: true


more refactoring of Call

more refactoring of Call

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


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

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

--- src/camera.coffee
+++ src/camera.coffee
@@ -0,0 +1,107 @@
+Camera = (I={}) ->
+  Object.reverseMerge I,
+    cameraBounds: Rectangle
+      x: 0
+      y: 0
+      width: 1200
+      height: 622
+    screen: Rectangle
+      x: 0
+      y: 0
+      width: App.width / 2
+      height: App.height
+    deadzone: Point(0, 0)
+    zoom: 1
+    cameraRotation: 0
+    transform: Matrix()
+    scroll: Point(0, 0)
+
+  currentType = "centered"
+  currentObject = null
+
+  transformCamera = (object) ->
+    objectCenter = object.center()
+
+    centerOffset = objectCenter.subtract(I.screen.width / 2, I.screen.height / 2)
+
+    deadzone = I.deadzone.scale(1 / (2 * I.zoom))
+
+    centerRect = Rectangle
+      x: centerOffset.x - deadzone.x
+      y: centerOffset.y - deadzone.y
+      width: 2 * deadzone.x
+      height: 2 * deadzone.y
+
+    I.scroll = Point(
+      I.scroll.x.clamp(centerRect.left, centerRect.right).clamp(I.cameraBounds.left, I.cameraBounds.right - I.screen.width)
+      I.scroll.y.clamp(centerRect.top, centerRect.bottom).clamp(I.cameraBounds.top, I.cameraBounds.bottom - I.screen.height)
+    )
+
+    I.transform = Matrix.translate(-I.scroll.x, -I.scroll.y)
+      .scale(I.zoom, I.zoom, objectCenter)
+      .rotate(I.cameraRotation, objectCenter)
+
+  followTypes =
+    centered: (object) ->
+      I.deadzone = Point(0, 0)
+
+      transformCamera(object)
+
+    topdown: (object) ->
+      helper = Math.max(I.cameraBounds.width, I.cameraBounds.height) / 4
+
+      I.deadzone = Point(helper, helper)
+
+      transformCamera(object)
+
+    platformer: (object) ->
+      width = I.cameraBounds.width / 8
+      height = I.cameraBounds.height / 3
+
+      I.deadzone = Point(width, height)
+
+      transformCamera(object)
+
+  self = Core(I).extend
+    follow: (object, type) ->
+      currentObject = object
+      currentType = type
+
+      # TODO: Easing
+      I.scroll = object.center()
+
+  self.attrAccessor "transform"
+
+  self.include(Bindable)
+
+  self.bind "afterUpdate", ->
+    if currentObject
+      followTypes[currentType](currentObject)
+
+      if I.shakeCooldown > 0
+        I.shakeCooldown = I.shakeCooldown.approach(0, 1)
+
+        I.transform.tx += signedRand(I.shakeIntensity)
+        I.transform.ty += signedRand(I.shakeIntensity)
+      else
+        followTypes[currentType](currentObject)
+
+  self.bind "draw", (canvas, objects) ->
+    canvas.withTransform Matrix.translate(I.screen.x, I.screen.y), (canvas) ->
+      canvas.context().beginPath()
+      canvas.context().rect(0, 0, I.screen.width, I.screen.height);
+      canvas.context().clip()
+
+      canvas.withTransform self.transform(), (canvas) ->
+        self.trigger "beforeDraw", canvas
+        objects.invoke "draw", canvas
+
+      self.trigger 'flash', canvas
+
+  self.include(Camera.Rotate)
+  self.include(Camera.Zoom)
+  self.include(Camera.Shake)
+  self.include(Camera.Flash)
+  self.include(Camera.Fade)
+
+  return self


bug fix

bug fix

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


remove ternary operation

remove ternary operation

--- src/config.coffee
+++ src/config.coffee
@@ -57,10 +57,10 @@
     return false unless @isWin32()

     vsPath = path.join @x86ProgramFilesDirectory(), "Microsoft Visual Studio 10.0", "Common7", "IDE"
-    fs.existsSync vsPath ? '2010' : ''
+    if fs.existsSync vsPath then '2010' else ''

   isVs2012Installed: ->
     return false unless @isWin32()

     vsPath = path.join @x86ProgramFilesDirectory(), "Microsoft Visual Studio 11.0", "Common7", "IDE"
-    fs.existsSync vsPath ? '2012' : ''
+    if fs.existsSync vsPath then '2012' else ''


Fix the animation

Fix the animation

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


:lipstick:

:lipstick:

--- src/root-view.coffee
+++ src/root-view.coffee
@@ -173,8 +173,10 @@
     initialLine = options.initialLine
     path = project.relativize(path)
     if activePane = @getActivePane()
-      editSession = activePane.itemForUri(path) if path
-      editSession ?= project.open(path, {initialLine})
+      if path
+        editSession = activePane.itemForUri(path) ? project.open(path, {initialLine})
+      else
+        editSession = project.open()
       activePane.showItem(editSession)
     else
       editSession = project.open(path, {initialLine})


bug fix

bug fix


myteam: show Delete Team link just for team owner

--- client/home/lib/myteam/index.coffee
+++ client/home/lib/myteam/index.coffee
@@ -14,6 +14,7 @@
 canSeeMembers = require 'app/util/canSeeMembers'
 isAdmin = require 'app/util/isAdmin'
 showError = require 'app/util/showError'
+globals = require 'globals'

 SECTIONS =
   'Invite Using Slack' : HomeTeamConnectSlack
@@ -120,16 +121,19 @@
       @wrapper.addSubView headerize 'Teammates'
       @wrapper.addSubView @teammates = section 'Teammates'

-      @wrapper.addSubView new kd.CustomHTMLView
-        cssClass : 'delete-team'
-        partial : 'DELETE TEAM'
-        click : ->
-          partial = '

-              CAUTION! You are going to delete your team. You and your
-              team members will not be able to access this team again.
-              This action CANNOT be undone.
-

-
Please enter current password into the field below to continue:
'

-          TeamFlux.actions.deleteTeam(partial).catch (err) ->
-            showError err
+      if 'owner' in globals.userRoles
+
+        @wrapper.addSubView new kd.CustomHTMLView
+          cssClass : 'delete-team'
+          partial : 'DELETE TEAM'
+          click : ->
+            partial = '

+                CAUTION! You are going to delete your team. You and your
+                team members will not be able to access this team again.
+                This action CANNOT be undone.
+

+
Please enter current password into the field below to continue:
'
+
+            TeamFlux.actions.deleteTeam(partial).catch (err) ->
+              showError err


Forgot to check Bower in actually

Forgot to check Bower in actually

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

--- library/membrane/bower.coffee
+++ library/membrane/bower.coffee
@@ -0,0 +1,135 @@
+###
+Copyright (c) 2013, Alexander Cherniuk <ts33kr@gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###
+
+_ = require "lodash"
+bower = require "bower"
+asciify = require "asciify"
+connect = require "connect"
+logger = require "winston"
+events = require "eventemitter2"
+assert = require "assert"
+colors = require "colors"
+crypto = require "crypto"
+nconf = require "nconf"
+https = require "https"
+path = require "path"
+http = require "http"
+util = require "util"
+
+{Screenplay} = require "./visual"
+
+# This abstract base class provides the dynamic Bower support for
+# the services that inherit or compose this ABC. This implementation
+# allows for each service to have its own, isolated tree of packages
+# that will be dynamically installed via Bower package manager. The
+# implementation provides convenient way of requiring frontend libs.
+module.exports.BowerSupport = class BowerSupport extends Screenplay
+
+    # This is a marker that indicates to some internal subsystems
+    # that this class has to be considered abstract and therefore
+    # can not be treated as a complete class implementation. This
+    # mainly is used to exclude or account for abstract classes.
+    @abstract yes
+
+    # Install the specified package via Bower into the specific
+    # location within the system that is figured out automatically.
+    # All packages installed via Bower will be served as the static
+    # assets, by using the `pub` env dir. The package installation
+    # is per service and automatically will be included in `prelude`.
+    @bower: (target, options={}) ->
+        previous = @bowerings or []
+        noTarget = "target must be a string"
+        noOptions = "options must be an object"
+        assert _.isObject(options), noOptions
+        assert _.isString(target), noTarget
+        return @bowerings = previous.concat
+            options: options
+            target: target
+
+    # A hook that will be called prior to registering the service
+    # implementation. Please refer to this prototype signature for
+    # information on the parameters it accepts. Beware, this hook
+    # is asynchronously wired in, so consult with `async` package.
+    # Please be sure invoke the `next` arg to proceed, if relevant.
+    register: (kernel, router, next) ->
+        hash = crypto.createHash "md5"
+        hash.update @constructor.identify()
+        id = hash.digest("hex").toString()
+        bowerings = @constructor.bowerings ?= []
+        options = _.map(bowerings, (b) -> b.options)
+        options = _.merge Object.create({}), options...
+        directory = kernel?.scope?.envPath "pub", "bower", id
+        assert _.isString(directory), "failed to get dir"
+        options.directory = bowerings.directory = directory
+        targets = _.map bowerings, (b) -> b.target
+        running = "Running Bower install for %s service"
+        identify = @constructor?.identify().toString()
+        logger.info running.grey, identify.underline
+        @installation kernel, targets, options, next
+
+    # An internal routine that launches the actual Bower installer.
+    # It takes a series of pre calculated parameters to be able to
+    # perform the installation properly. Plese refer to the register
+    # hook implementation in this ABC service for more information.
+    installation: (kernel, targets, options, next) ->
+        install = bower.commands.install
+        bowerings = @constructor.bowerings ?= []
+        installer = install targets, {}, options
+        installer.on "error", (error) ->
+            reason = "failed Bower package installation"
+            logger.error error.message.toString().red, error
+            kernel.shutdownKernel reason.toString()
+        installer.on "end", (installed) =>
+            bowerings.installed = installed
+            message = "Get Bower lib %s@%s at %s"
+            for packet in _.values(installed or {})
+                name = packet.pkgMeta?.name.underline
+                version = packet.pkgMeta?.version.underline
+                where = @constructor.identify().underline
+                logger.debug message.cyan, name, version, where
+            return next()
+
+    # This server side method is called on the context prior to the
+    # context being compiled and flushed down to the client site. The
+    # method is wired in an asynchronous way for greater functionality.
+    # This is the place where you would be importing the dependencies.
+    prelude: (context, request, next) ->
+        list = bower.commands.list
+        bowerings = @constructor.bowerings ?= []
+        cached context if cached = bowerings.cached
+        return next() if _.isFunction cached
+        options = directory: bowerings.directory
+        esc = (p) -> new RegExp RegExp.escape "#{p}"
+        match = (k) -> (b) -> esc(k).test b.target
+        sorter = (v, k) -> _.findIndex bowerings, match(k)
+        list(paths: yes, options).on "end", (paths) ->
+            bowerings.cached = (context) ->
+                sorted = _.sortBy paths, sorter
+                files = _.flatten _.values sorted
+                for file in files then do (file) ->
+                    ext = (e) -> path.extname(file) is e
+                    context.scripts.push file if ext ".js"
+                    context.sheets.push file if ext ".css"
+            bowerings.cached context; next()


Add test for BufferToCanvas

Add test for BufferToCanvas

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

--- spec/BufferToCanvas-node.coffee
+++ spec/BufferToCanvas-node.coffee
@@ -0,0 +1,63 @@
+noflo = require 'noflo'
+unless noflo.isBrowser()
+  chai = require 'chai' unless chai
+  BufferToCanvas = require '../components/BufferToCanvas-node.coffee'
+  testutils = require './testutils'
+else
+  BufferToCanvas = require 'noflo-image/components/BufferToCanvas-node.js'
+  testutils = require 'noflo-image/spec/testutils.js'
+
+describe.only 'BufferToCanvas component', ->
+  c = null
+  inBuffer = null
+  outCanvas = null
+  error = null
+
+  beforeEach ->
+    c = BufferToCanvas.getComponent()
+    inBuffer = noflo.internalSocket.createSocket()
+    outCanvas = noflo.internalSocket.createSocket()
+    error = noflo.internalSocket.createSocket()
+    c.inPorts.buffer.attach inBuffer
+    c.outPorts.canvas.attach outCanvas
+    c.outPorts.error.attach error
+
+  describe 'when instantiated', ->
+    it 'should have one input ports', ->
+      chai.expect(c.inPorts.buffer).to.be.an 'object'
+    it 'should have a output port', ->
+      chai.expect(c.outPorts.canvas).to.be.an 'object'
+    it 'should have an error output port', ->
+      chai.expect(c.outPorts.error).to.be.an 'object'
+
+  describe 'with a buffer', ->
+    @timeout 1000
+    it 'should make a canvas with the correct size', (done) ->
+      groupId = 'buffer-canvas'
+      groups = []
+      outCanvas.once 'begingroup', (group) ->
+        groups.push group
+      outCanvas.once 'endgroup', (group) ->
+        groups.pop()
+      outCanvas.once 'data', (data) ->
+        chai.expect(data).to.be.an 'object'
+        chai.expect(data.width).to.equal 80
+        chai.expect(data.height).to.equal 80
+        done()
+      error.once 'data', (err) -> done(err)
+
+      url = 'saturation.png'
+      buffer = testutils.getBuffer url
+      inBuffer.beginGroup groupId
+      inBuffer.send buffer
+      inBuffer.endGroup()
+
+  describe 'with a zero sized buffer', ->
+    it 'should return an error', (done) ->
+      @timeout 1000
+      error.on 'data', (err) ->
+        chai.expect(err).to.be.an 'object'
+        done()
+
+      buffer = ''
+      inBuffer.send buffer


new line added

new line added

--- app/assets/javascripts/main.js.coffee
+++ app/assets/javascripts/main.js.coffee
@@ -219,6 +219,7 @@
       $(".discussion-additional-info").toggle()
       event.preventDefault()
     )
+
 Application.seeMoreDescription = () ->
   #expand/shrink description text
   if $("body.discussions.show").length > 0


Add comment

Add comment

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


Trim stack traces

Trim stack traces

--- spec/atom-reporter.coffee
+++ spec/atom-reporter.coffee
@@ -27,7 +27,7 @@
     lines[index] = "at #{prefixMatch[1]}" if prefixMatch

   lines = lines.map (line) -> line.trim()
-  lines.join('\n')
+  lines.join('\n').trim()

 module.exports =
 class AtomReporter extends View


Use `show me issues for <user/repo>` to list open issues (Github)

You need to set the following variables:
   HUBOT_GITHUB_TOKEN = <oauth token>
   HUBOT_GITHUB_USER = <user name>

HUBOT_GITHUB_USER is optional, but if you set it, you can ask `show
me issues for hubot` instead of `show me issues for github/hubot`.

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

--- src/scripts/github-issues.coffee
+++ src/scripts/github-issues.coffee
@@ -0,0 +1,27 @@
+# Show open issues from a Github repository.
+#
+# You need to set the following variables:
+#   HUBOT_GITHUB_TOKEN = <oauth token>
+#   HUBOT_GITHUB_USER = <user name>
+#
+# HUBOT_GITHUB_USER is optional, but if you set it, you can ask `show me issues
+# for hubot` instead of `show me issues for github/hubot`.
+#
+# show me issues for <user/repo> -- Shows open issues for that project.
+module.exports = (robot) ->
+  robot.respond /show\s+(me\s+)?issues\s+(for\s+)?(.*)/i, (msg)->
+    oauth_token = process.env.HUBOT_GITHUB_TOKEN
+    repo = msg.match[3].toLowerCase()
+    repo = "#{process.env.HUBOT_GITHUB_USER}/#{repo}" unless ~repo.indexOf("/")
+    msg.http("https://api.github.com/repos/#{repo}/issues")
+      .headers(Authorization: "token #{oauth_token}", Accept: "application/json")
+      .query(state: "open", sort: "created")
+      .get() (err, res, body) ->
+        if err
+          msg.send "GitHub says: #{err}"
+          return
+        issues = JSON.parse(body)
+        for issue in issues
+          labels = ("##{label.name}" for label in issue.labels)
+          msg.send "[#{issue.number}] #{issue.title} #{labels.join(" ")}"
+


First pass at the library

First pass at the library

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

--- src/kissmetrics.coffee
+++ src/kissmetrics.coffee
@@ -0,0 +1,58 @@
+ENV = if typeof exports isnt 'undefined' then 'node' else 'browser'
+
+https = require 'https' if ENV is 'node'
+
+httpRequest = (args) ->
+	args.port ?= 80
+	args.path ?= ''
+	url        = "https://#{args.host}:#{args.port}/#{args.path}"
+
+	if ENV is 'node'
+		https.get url
+	else
+		(new Image()).src = url
+
+
+class KissmetricsClient
+	constructor: (@key, @person) ->
+		@host = 'trk.kissmetrics.com'
+		@port = 80
+		@query_types =
+			record : 'e'
+			set    : 's'
+			alias  : 'a'
+
+
+	record: (action, properties = {}) ->
+		properties._n = action
+		@generateQuery 'record', properties
+
+	set: (properties) ->
+		# Each property has to be sent in its own query
+		for name, value of properties
+			data = {}
+			data[name] = value
+			@generateQuery 'set', data
+
+	alias: (to) ->
+		@generateQuery 'alias', _n: to
+
+	generateQuery: (type, data) ->
+		data._k = @key
+		data._p = @person
+
+		queryParts  = ("#{encodeURIComponent(key)}=#{encodeURIComponent(val)}" for key, val of data)
+		queryString = queryParts.join '&'
+
+		@request "#{@query_types[type]}?#{queryString}"
+
+	request: (endpoint) ->
+		httpRequest
+			host : @host
+			port : @port
+			path : endpoint
+
+if ENV is 'node'
+	exports.KissmetricsClient = KissmetricsClient
+else
+	@KissmetricsClient = KissmetricsClient


more warnings about mpd conf settings

more warnings about mpd conf settings

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


Fix expected response body

Fix expected response body

Signed-off-by: Sonmez Kartal <d2d15c3d37396a5f2a09f8b42cf5f27d43a3fbde@koding.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/andrewjcasal/koding.git/'


Don't exit grunt on passenger restart failure

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


Added 'Game Over' screen

Added 'Game Over' screen

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

--- src/game/game_over_stage.coffee
+++ src/game/game_over_stage.coffee
@@ -0,0 +1,46 @@
+class GameOverStage extends Stage
+  constructor: (width, height, ctx) ->
+    super(width, height, ctx)
+    @controller = Controller.get()
+
+  _init: () =>
+    @gameOverText = "GAME OVER"
+    @retryText = "Hit ENTER restart reality."
+    @background = @getNoise()
+
+  _update: (step) =>
+    if @controller.isPressed(Keys.ENTER)
+      @state = STATE.finished
+
+  _render: () ->
+    @ctx.save()
+
+    @background = @getNoise()
+    @ctx.putImageData(@background, 0, 0)
+
+    EFFECTS.fillText3D(@gameOverText, '72px Georgia', @ctx, 80, 120)
+    EFFECTS.fillText3D(@retryText, '42px Georgia', @ctx, 40, 200)
+
+    @ctx.restore()
+
+  getNoise: () ->
+    imageData = @ctx.createImageData(@width, @height)
+
+
+    i = 0
+    while i < imageData.data.length
+      color = (Math.random() * 100)|0
+      imageData.data[i++] = 0
+      imageData.data[i++] = 0
+      imageData.data[i++] = 0
+      imageData.data[i++] = color
+
+
+      ###
+      for i in [0..imageData.data.length]
+      imageData.data[i] = 255 * Math.random()|0
+      ###
+
+    #imageData.data[i] = (Math.random() < 0.5) ? '#000000' | '#FFFFFF'
+    return imageData
+


Wait for repo to refresh in test

Wait for repo to refresh in 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/kevinrenaers/atom.git/'


Rename spec

Rename spec

--- spec/pane-container-spec.coffee
+++ spec/pane-container-spec.coffee
@@ -224,7 +224,7 @@
       container.on 'pane-container:active-pane-item-changed', activeItemChangedHandler

     describe "when there are no panes", ->
-      it "is triggered when a new pane item is added", ->
+      it "is triggered when a new pane containing a pane item is added", ->
         container.setRoot()
         expect(container.getPanes().length).toBe 0
         activeItemChangedHandler.reset()


translated some sentences

translated some sentences

--- app/locale/ja.coffee
+++ app/locale/ja.coffee
@@ -676,7 +676,7 @@
     error_saving: "セーブ中にエラーが発生しました"
     saved: "変更しました"
     password_mismatch: "パスワードが違います"
-#    password_repeat: "Please repeat your password."
+    password_repeat: "もう一度パスワードを入力してください"
     job_profile: "求職情報" # Rest of this section (the job profile stuff and wizard stuff) is deprecated
     job_profile_approved: "CodeCombatは、あなたの求職情報を承りました。無効にする、もしくは4週間の間変更をしなければ雇用者はあなたの求職情報を見ることができなくなります。"
 #    job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job."
@@ -751,18 +751,18 @@
     back: "バック"
     revert: "戻す"
 #    revert_models: "Revert Models"
-#    pick_a_terrain: "Pick A Terrain"
+    pick_a_terrain: "地形を選択してください"
     dungeon: "ダンジョン"
-#    indoor: "Indoor"
+    indoor: "屋内"
     desert: "砂漠"
-#    grassy: "Grassy"
+    grassy: "草原"
 #    small: "Small"
 #    large: "Large"
 #    fork_title: "Fork New Version"
 #    fork_creating: "Creating Fork..."
 #    generate_terrain: "Generate Terrain"
 #    more: "More"
-#    wiki: "Wiki"
+    wiki: "ウィキ"
     live_chat: "ライブチャット"
 #    thang_main: "Main"
 #    thang_spritesheets: "Spritesheets"
@@ -894,10 +894,10 @@
 #    changes_auto_save: "Changes are saved automatically when you toggle checkboxes."
 #    diligent_scribes: "Our Diligent Scribes:"
     powerful_archmages: "私たちの強力なアークメイジたち:"
-#    creative_artisans: "Our Creative Artisans:"
-#    brave_adventurers: "Our Brave Adventurers:"
-#    translating_diplomats: "Our Translating Diplomats:"
-#    helpful_ambassadors: "Our Helpful Ambassadors:"
+    creative_artisans: "私たちのクリエイティブなアーチザンたち:"
+    brave_adventurers: "私たちの勇敢な冒険者たち:"
+    translating_diplomats: "私たちの翻訳をしてくれる外交官たち:"
+    helpful_ambassadors: "私たちの有能な大使たち:"

 #  ladder:
 #    please_login: "Please log in first before playing a ladder game."
@@ -913,10 +913,10 @@
 #    ratio: "Ratio"
 #    leaderboard: "Leaderboard"
 #    battle_as: "Battle as "
-#    summary_your: "Your "
-#    summary_matches: "Matches - "
-#    summary_wins: " Wins, "
-#    summary_losses: " Losses"
+#    summary_your: "あなたの "
+#    summary_matches: "戦闘数 - "
+#    summary_wins: " 勝利数, "
+#    summary_losses: " 敗北数"
 #    rank_no_code: "No New Code to Rank"
 #    rank_my_game: "Rank My Game!"
 #    rank_submitting: "Submitting..."
@@ -929,15 +929,15 @@
 #    no_ranked_matches_pre: "No ranked matches for the "
 #    no_ranked_matches_post: " team! Play against some competitors and then come back here to get your game ranked."
 #    choose_opponent: "Choose an Opponent"
-#    select_your_language: "Select your language!"
-#    tutorial_play: "Play Tutorial"
-#    tutorial_recommended: "Recommended if you've never played before"
-#    tutorial_skip: "Skip Tutorial"
+    select_your_language: "使う言語を選んでください！"
+    tutorial_play: "チュートリアルで遊ぶ"
+    tutorial_recommended: "はじめて遊ぶ人におすすめ"
+    tutorial_skip: "チュートリアルをスキップする"
 #    tutorial_not_sure: "Not sure what's going on?"
-#    tutorial_play_first: "Play the Tutorial first."
+    tutorial_play_first: "はじめからチュートリアルを遊ぶ"
 #    simple_ai: "Simple AI"
-#    warmup: "Warmup"
-#    friends_playing: "Friends Playing"
+    warmup: "ウォームアップ"
+    friends_playing: "友達と遊ぶ"
 #    log_in_for_friends: "Log in to play with your friends!"
 #    social_connect_blurb: "Connect and play against your friends!"
 #    invite_friends_to_battle: "Invite your friends to join you in battle!"
@@ -952,22 +952,22 @@
 #    tournament_blurb_criss_cross: "Win bids, construct paths, outwit opponents, grab gems, and upgrade your career in our Criss-Cross tournament! Check out the details"
 #    tournament_blurb_zero_sum: "Unleash your coding creativity in both gold gathering and battle tactics in this alpine mirror match between red sorcerer and blue sorcerer. The tournament began on Friday, March 27 and will run until Monday, April 6 at 5PM PDT. Compete for fun and glory! Check out the details"
 #    tournament_blurb_blog: "on our blog"
-#    rules: "Rules"
-#    winners: "Winners"
+    rules: "ルール"
+    winners: "勝者"

 #  user:
 #    stats: "Stats"
-#    singleplayer_title: "Singleplayer Levels"
-#    multiplayer_title: "Multiplayer Levels"
+    singleplayer_title: "シングルプレイヤーレベル"
+    multiplayer_title: "マルチプレイヤーレベル"
 #    achievements_title: "Achievements"
-#    last_played: "Last Played"
-#    status: "Status"
-#    status_completed: "Completed"
-#    status_unfinished: "Unfinished"
-#    no_singleplayer: "No Singleplayer games played yet."
-#    no_multiplayer: "No Multiplayer games played yet."
+    last_played: "最終プレイ"
+    status: "ステータス"
+    status_completed: "コンプリート"
+    status_unfinished: "未完了"
+    no_singleplayer: "まだシングルプレイヤーのゲームをプレイしていません."
+    no_multiplayer: "まだマルチプレイヤーのゲームをプレイしていません."
 #    no_achievements: "No Achievements earned yet."
-#    favorite_prefix: "Favorite language is "
+    favorite_prefix: "お気に入りの言語は "
 #    favorite_postfix: "."

 #  achievements:


Update ru.coffee

Update ru.coffee

--- app/locale/ru.coffee
+++ app/locale/ru.coffee
@@ -322,7 +322,7 @@
     tip_lines_of_code: "Измерение прогресса программирования в строках кода - это как измерять прогресс построения самолета по его весу. — Bill Gates"
     tip_source_code: "Я хочу изменить мир, но они вряд ли дадут мне исходники."
     tip_javascript_java: "Java к JavaScript относится так же, как кол относится к колготкам. - Chris Heilmann (перефраз.)"
-#    tip_move_forward: "Whatever you do, keep moving forward. - Martin Luther King Jr."
+    tip_move_forward: "Что бы вы ни делали, вы должны двигаться вперед. - Мартин Лютер Кинг младший."

   game_menu:
     inventory_tab: "Инвентарь"


how did that even happen

how did that even happen

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/jencka/2001-A-SPACE-SACRIFICE.git/'


rewrite!

rewrite!

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

--- src/svg.coffee
+++ src/svg.coffee
@@ -0,0 +1,33 @@
+fs = require('fs')
+vm = require('vm')
+jsdom = require('jsdom')
+
+class SVG
+    constructor: () ->
+        filename = require.resolve('../../node_modules/raphael/raphael')
+        code = fs.readFileSync(filename)
+        @_script = vm.createScript(code, 'raphael.vm')
+
+    _raphael: (win, doc, nav) ->
+        ctx =
+            module:    {}
+            window:    win
+            document:  doc
+            navigator: nav
+            console:   console
+        @_script.runInNewContext(ctx)
+        ctx.module.exports
+
+    generate: (width, height, callback) ->
+        win = jsdom.createWindow(jsdom.dom)
+        doc = win.document = jsdom.jsdom("")
+        nav = win.navigator
+        doc.implementation.addFeature(
+            "http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1")
+        paper = @_raphael(win, doc, nav)(0, 0, width or 42, height or 42)
+        callback?(paper)
+        doc.body.firstChild?.outerHTML or ""
+
+
+
+module.exports = new SVG()


Added ability to pass data to resolve

Added ability to pass data to resolve

The resolve method would only parse query string parameters from the route, now it can be passed any other data that should be passed along with the route resolution.

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


Add class method lineCOmmentStringForScope to TextMateBundle

--- src/app/text-mate-bundle.coffee
+++ src/app/text-mate-bundle.coffee
@@ -32,6 +32,10 @@
   @getPreferenceInScope: (scopeSelector, preferenceName) ->
     @preferencesByScopeSelector[scopeSelector][preferenceName]

+  @lineCommentStringForScope: (scope) ->
+    shellVariables = @getPreferenceInScope(scope, 'shellVariables')
+    lineComment = (_.find shellVariables, ({name}) -> name == "TM_COMMENT_START")['value']
+
   grammars: null

   constructor: (@path) ->


Use TokenIterator in DisplayBuffer instead of tokens shim

--- src/display-buffer.coffee
+++ src/display-buffer.coffee
@@ -2,14 +2,15 @@
 Serializable = require 'serializable'
 {CompositeDisposable, Emitter} = require 'event-kit'
 {Point, Range} = require 'text-buffer'
+Grim = require 'grim'
 TokenizedBuffer = require './tokenized-buffer'
+TokenIterator = require './token-iterator'
 RowMap = require './row-map'
 Fold = require './fold'
 Model = require './model'
 Token = require './token'
 Decoration = require './decoration'
 Marker = require './marker'
-Grim = require 'grim'

 class BufferToScreenConversionError extends Error
   constructor: (@message, @metadata) ->
@@ -651,16 +652,19 @@
     top = targetRow * @lineHeightInPixels
     left = 0
     column = 0
-    for token in @tokenizedLineForScreenRow(targetRow).tokens
-      charWidths = @getScopedCharWidths(token.scopes)
+
+    iterator = TokenIterator.instance.reset(@tokenizedLineForScreenRow(targetRow))
+    while iterator.next()
+      charWidths = @getScopedCharWidths(iterator.getScopes())
       valueIndex = 0
-      while valueIndex < token.value.length
-        if token.hasPairedCharacter
-          char = token.value.substr(valueIndex, 2)
+      value = iterator.getText()
+      while valueIndex < value.length
+        if iterator.isPairedCharacter()
+          char = value
           charLength = 2
           valueIndex += 2
         else
-          char = token.value[valueIndex]
+          char = value[valueIndex]
           charLength = 1
           valueIndex++

@@ -681,16 +685,19 @@

     left = 0
     column = 0
-    for token in @tokenizedLineForScreenRow(row).tokens
-      charWidths = @getScopedCharWidths(token.scopes)
+
+    iterator = TokenIterator.instance.reset(@tokenizedLineForScreenRow(row))
+    while iterator.next()
+      charWidths = @getScopedCharWidths(iterator.getScopes())
+      value = iterator.getText()
       valueIndex = 0
-      while valueIndex < token.value.length
-        if token.hasPairedCharacter
-          char = token.value.substr(valueIndex, 2)
+      while valueIndex < value.length
+        if iterator.isPairedCharacter()
+          char = value
           charLength = 2
           valueIndex += 2
         else
-          char = token.value[valueIndex]
+          char = value[valueIndex]
           charLength = 1
           valueIndex++


Adds a 'decide' script, because coins aren't as fun

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

--- src/scripts/decide.coffee
+++ src/scripts/decide.coffee
@@ -0,0 +1,15 @@
+# Allows Hubot to help you decide between multiple options.
+#
+# decide "<option1>" "<option2>" "<optionx>" - Randomly picks an option.
+#                                        More fun than using a coin.
+#
+# Examples:
+#
+# decide "Vodka Tonic" "Tom Collins" "Rum & Coke"
+# decide "Stay in bed like a lazy bastard" "You have shit to code, get up!"
+#
+
+module.exports = (robot) ->
+  robot.respond /decide "(.*)"/i, (msg) ->
+    options = msg.match[1].split('" "')
+    msg.reply("Definitely \"#{ msg.random options }\".")


Stop users from deleting existing nodes in a model when in lockdown mode [#159145561]

--- src/code/mixins/app-view.coffee
+++ src/code/mixins/app-view.coffee
@@ -3,6 +3,7 @@
 GoogleFileStore = require "../stores/google-file-store"
 HashParams      = require "../utils/hash-parameters"
 tr              = require '../utils/translate'
+AppSettingsStore = require '../stores/app-settings-store'

 module.exports =

@@ -26,7 +27,8 @@
         # 8 is backspace, 46 is delete
         if e.which in [8, 46] and not $(e.target).is('input, textarea')
           e.preventDefault()
-          deleteFunction()
+          if not AppSettingsStore.store.settings.lockdown
+            deleteFunction()
     else
       $(window).off 'keydown'


Link to section in API docs for ContextMenuManager::add

--- src/context-menu-manager.coffee
+++ src/context-menu-manager.coffee
@@ -105,9 +105,9 @@
       # Detect deprecated file path as first argument
       if itemsBySelector? and typeof itemsBySelector isnt 'object'
         Grim.deprecate """
-          ContextMenuManager::add has changed to take a single object as its
+          `ContextMenuManager::add` has changed to take a single object as its
           argument. Please see
-          https://atom.io/docs/api/latest/ContextMenuManager for more info.
+          https://atom.io/docs/api/latest/ContextMenuManager#context-menu-cson-format for more info.
         """
         itemsBySelector = arguments[1]
         devMode = arguments[2]?.devMode
@@ -116,9 +116,9 @@
       for key, value of itemsBySelector
         unless _.isArray(value)
           Grim.deprecate """
-            ContextMenuManager::add has changed to take a single object as its
+            `ContextMenuManager::add` has changed to take a single object as its
             argument. Please see
-            https://atom.io/docs/api/latest/ContextMenuManager for more info.
+            https://atom.io/docs/api/latest/ContextMenuManager#context-menu-cson-format for more info.
           """
           itemsBySelector = @convertLegacyItemsBySelector(itemsBySelector, devMode)


:lipstick:

:lipstick:

--- src/task-bootstrap.coffee
+++ src/task-bootstrap.coffee
@@ -34,4 +34,4 @@

 setupGlobals()
 handleEvents()
-handler = require(taskPath)+handler = require(taskPath)


Document methods

Document methods

--- src/workspace-view.coffee
+++ src/workspace-view.coffee
@@ -322,14 +322,17 @@
     atom.project?.destroy()
     super

+  # Private: Adds the destroyed item's uri to the list of items to reopen.
   onPaneItemDestroyed: (e, item) =>
     if uri = item.getUri?()
       @destroyedItemUris.push(uri)

+  # Public: Reopens the last-closed item uri if it hasn't already been reopened.
   reopenItemSync: ->
     if uri = @destroyedItemUris.pop()
       @openSync(uri)

+  # Private: Removes the item's uri from the list of potential items to reopen.
   itemOpened: (item) ->
     if uri = item.getUri?()
       _.remove(@destroyedItemUris, uri)


Remove unnecessary fat arrows

Remove unnecessary fat arrows

--- src/workspace-view.coffee
+++ src/workspace-view.coffee
@@ -131,7 +131,7 @@

     @command 'window:install-shell-commands', => @installShellCommands()

-    @command 'window:run-package-specs', => ipc.sendChannel('run-package-specs', path.join(atom.project.getPath(), 'spec'))
+    @command 'window:run-package-specs', -> ipc.sendChannel('run-package-specs', path.join(atom.project.getPath(), 'spec'))
     @command 'window:increase-font-size', => @increaseFontSize()
     @command 'window:decrease-font-size', => @decreaseFontSize()
     @command 'window:reset-font-size', => @model.resetFontSize()
@@ -146,7 +146,7 @@
     @command 'window:toggle-invisibles', -> atom.config.toggle("editor.showInvisibles")
     @command 'window:log-deprecation-warnings', -> logDeprecationWarnings()

-    @command 'window:toggle-auto-indent', =>
+    @command 'window:toggle-auto-indent', ->
       atom.config.toggle("editor.autoIndent")

     @command 'pane:reopen-closed-item', => @getModel().reopenItem()
@@ -169,11 +169,11 @@
         detailedMessage: error.message

     resourcePath = atom.getLoadSettings().resourcePath
-    CommandInstaller.installAtomCommand resourcePath, true, (error) =>
+    CommandInstaller.installAtomCommand resourcePath, true, (error) ->
       if error?
         showErrorDialog(error)
       else
-        CommandInstaller.installApmCommand resourcePath, true, (error) =>
+        CommandInstaller.installApmCommand resourcePath, true, (error) ->
           if error?
             showErrorDialog(error)
           else


TODO added for select

TODO added for select

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


Added brew task

Added brew task

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

--- tasks/brew.coffee
+++ tasks/brew.coffee
@@ -0,0 +1,30 @@
+module.exports = (grunt) ->
+  fs = require("fs")
+  path = require("path")
+  chalk = require("chalk")
+
+  grunt.registerMultiTask "brew", "Install utilities with Homebrew.", ->
+    cmd = 'brew install ' + this.data
+    grunt.verbose.writeln "Running: #{chalk.cyan cmd}"
+    exec cmd
+
+    grunt.log.ok "Installed " + this.data
+
+  grunt.registerMultiTask "brew_tap", "Add additional taps to Homebrew.", ->
+    cmd = 'brew tap ' + this.data
+    grunt.verbose.writeln "Running: #{chalk.cyan cmd}"
+    exec cmd
+
+    grunt.log.ok "Installed " + this.data
+
+  grunt.registerMultiTask "brew_cask_app", "Install apps with Homebrew Cask.", ->
+    cmd = 'brew cask install --appdir=/Applications ' + this.data
+    grunt.verbose.writeln "Running: #{chalk.cyan cmd}"
+    exec cmd
+
+  grunt.registerMultiTask "brew_cask_font", "Install fonts with Homebrew Cask.", ->
+    cmd = 'brew cask install --appdir=/Applications ' + this.data
+    grunt.verbose.writeln "Running: #{chalk.cyan cmd}"
+    exec cmd
+
+    grunt.log.ok "Installed " + this.data


[macros] better `cat behaviour

[macros] better `cat behaviour

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


client: add credit card view placeholders

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

error: pathspec 'client/component-lab/CreditCard/constants.coffee' did not match any file(s) known to git

--- client/component-lab/CreditCard/constants.coffee
+++ client/component-lab/CreditCard/constants.coffee
@@ -0,0 +1,29 @@
+Placeholder =
+  NUMBER: '•••• •••• •••• ••••'
+  EXP_MONTH: 'MM'
+  EXP_YEAR: 'YY'
+  CVC: '•••'
+  NUMBER_AMEX: '•••• •••••• •••••'
+  CVC_AMEX: '••••'
+  NAME: '••••• •••••'
+
+NumberPattern =
+  DEFAULT: [4, 4, 4, 4]
+  AMEX: [4, 6, 5]
+
+Brand =
+  JCB: 'jcb'
+  MAESTRO: 'maestro'
+  MASTER_CARD: 'master-card'
+  AMERICAN_EXPRESS: 'american-express'
+  DINERS_CLUB: 'diners-club'
+  DISCOVER: 'discover'
+  VISA: 'visa'
+  DEFAULT: 'default'
+
+DOT = '•'
+
+module.exports = {
+  Placeholder, NumberPattern, Brand, DOT
+}
+


Updated tests for Mongo module

Updated tests for Mongo 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/renanhangai/servitude.git/'


Add custom html view tests

Add custom html view tests

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

--- test/core/customhtmlview.coffee
+++ test/core/customhtmlview.coffee
@@ -0,0 +1,12 @@
+should = require 'should'
+KDCustomHTMLView = require '../../lib/core/customhtmlview'
+
+
+describe 'KDCustomHTMLView', ->
+  it 'exists', ->
+    KDCustomHTMLView.should.exist
+
+  describe 'constructor', ->
+    it 'should instantiate without error', ->
+      router = new KDCustomHTMLView
+      router.should.exist


Add basic coordinate-based overlay system

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

--- src/public/models/vector.coffee
+++ src/public/models/vector.coffee
@@ -0,0 +1,134 @@
+define [
+	'public/helpers/mixable'
+	'public/helpers/mixin.eventbindings'
+
+	'underscore'
+	], ( Mixable, EventBindings, _ ) ->
+
+	# Vector class. Extends Array and as such provides most of it's functionality.
+	# This class is used for all Matrix operations
+	#
+	class Vector extends Array
+
+		_.extend(@, Mixable)
+		@concern EventBindings
+
+		# Constructs a new Vector.
+		#
+		# @param args... [Float] Matrix values. The length of args decides the dimension of the matrix
+		#
+		constructor: (args...) ->
+			super()
+			for i in args
+				@push(i)
+
+		# Adds one Vector to another
+		#
+		# @param v [Vector] A Vector to be added
+		# @return [Vector] Answer of the operation
+		#
+		add: ( v ) =>
+			sum = new Vector()
+
+			for i in [0...@length]
+				sum.push( @[i] + v[i] )
+			return sum
+
+		# Substracts one Vector from another
+		#
+		# @param v [Vector] A Vector to be substracted
+		# @return [Vector] Answer of the operation
+		#
+		substract: ( v ) =>
+			res = new Vector()
+
+			for i in [0...@length]
+				res.push( @[i] - v[i] )
+			return res
+
+		# Scales the Vector
+		#
+		# @param scaler [Float] A scaler to apply to the vector
+		# @return [Vector] Answer of the operation
+		#
+		scale: ( scaler ) =>
+			res = new Vector()
+
+			for i in [0...@length]
+				res[i] = @[i] * scaler
+			return res
+
+		# Calculates the distance between two Vectors
+		#
+		# @param v [Vector] A Vector to calculate to calculate the distance
+		# @return [Float] Returns the distance
+		#
+		getDistance: ( v ) =>
+			distance = 0
+			for i in [0...@length]
+				difference = @[i] - v[i]
+				distance += Math.pow(difference, 2)
+			distance = Math.sqrt(distance)
+			return distance
+
+		# Calculates the length of a Vector. The same as @getDistance (zeroVector)
+		#
+		# @return [Float] Returns the length of an array.
+		#
+		getLength: () =>
+			distance = 0
+			for i in [0...@length]
+				distance += Math.pow(@[i], 2)
+			distance = Math.sqrt(distance)
+			return distance
+
+		# Calculates the unit vector of self
+		#
+		# @return [Vector] Returns the unit vector
+		#
+		unit: () =>
+			res = new Vector()
+			length = @getLength()
+			for i in [0...@length]
+				res.push( @[i] / length )
+			return res
+
+		# Calculates the force from the tokens. The force constant is hardcoded here
+		#
+		# @return [Vector] Returns the force vector
+		#
+		calculateForce: () =>
+			res = new Vector()
+			for i in [0...@length]
+				res.push(1 / @[i])
+			return res
+
+		# Constructs a Zero vector
+		#
+		# @param dim [Int] A Dimension of desired Vector
+		# @return [Vector] Returns a Zero Vector
+		#
+		@makeZeroVector: ( dim ) ->
+			res = new Vector()
+			for i in [0...dim]
+				res.push(0)
+			return res
+
+		# Serializes this vector to a JSON string
+		#
+		# @return [String] the JSON string representing this vector
+		#
+		serialize: ( ) =>
+			return JSON.stringify(@)
+
+		# Generates a vector from a JSON string and returns this
+		#
+		# @param vectorString [String] a string in JSON format
+		# @return [Vector] a new Vector
+		#
+		@deserialize: (vectorString) ->
+			object = JSON.parse(vectorString)
+			res = new Vector()
+			for i in [0...object.length] by 1
+				res.push(object[i])
+			return res


Implement ApplicationModel's getAll function

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

--- lib/models/application.coffee
+++ lib/models/application.coffee
@@ -0,0 +1,8 @@
+canvas = require('./_canvas')
+
+exports.getAll = ->
+	return canvas.get
+		resource: 'application'
+		options:
+			orderby: 'app_name asc'
+			expand: 'device'


Hide adjustments in cart by default, show by click

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

--- app/assets/javascripts/store/checkout.js.coffee
+++ app/assets/javascripts/store/checkout.js.coffee
@@ -0,0 +1,8 @@
+$(document).ready ->
+  $('#cart_adjustments').hide()
+
+  $('th.cart-adjustment-header').html('Order Adjustments...')
+  $('th.cart-adjustment-header a').click ->
+    $('#cart_adjustments').toggle()
+    $('th.cart-adjustment-header a').html('Order Adjustments')
+    false


Add pong frame

Add pong frame

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

--- src/coffee/frame/pong.coffee
+++ src/coffee/frame/pong.coffee
@@ -0,0 +1,71 @@
+ClockWallPatternUtils = require '../../ClockWallPatternUtils'
+
+# Patterns for a pong game
+
+paddleDesign = [
+  """
+  ┌┐
+  ||
+  └┘
+  """
+]
+paddleGrowKeyframes = [
+  [
+    """
+    ┌-┐
+    | |
+    | |
+    | |
+    └-┘
+    """
+  ]
+,
+  [
+    """
+    ┌---┐
+    |   |
+    |   |
+    |   |
+    |   |
+    |   |
+    └---┘
+    """
+  ]
+]
+ballDesign = [
+  """
+  ┌┐
+  └┘
+  """
+]
+
+patterns =
+  paddle: ClockWallPatternUtils.toClockWallPattern(paddleDesign)
+  ball: ClockWallPatternUtils.toClockWallPattern(ballDesign)
+
+# A game of pong
+class FramePong extends Frame
+  getPatterns: ->
+    width = Frame.DEFAULT_WIDTH
+    height = Frame.DEFAULT_HEIGHT
+
+    hands = CommonClockWallPattern.empty(width, height)
+
+    # middle =
+    #   x: Math.floor(width / 2)
+    #   y: Math.floor(height / 2)
+
+    # for y in [0...height]
+    #   for x in [0...width]
+    #     xDiff = x - middle.x
+    #     yDiff = y - middle.y
+    #     if !(x == middle.x and y == middle.y)
+    #       angle = Math.atan2(yDiff, xDiff)
+    #       hands[y][x] = HandRotationUtils.angleToHandRotation(angle)
+
+    # # Make the very middle clock horizontal
+    # hands[middle.y][middle.x] = HandRotationUtils.toHandRotation('-')
+
+    hands
+
+module.exports = FramePong


Fix calling showItemInFolder in renderer

The remote method always assumes the existence of the remote object but
doesn't keep a reference to it, so if we only keep the reference of a
remote method we will get into troubles once the remote object is
garbage collected.

We should probably fix this in remote module, but since most things are
already working quite good, I'm using the work-around for now.

Fix #3139.

--- atom/common/api/lib/shell.coffee
+++ atom/common/api/lib/shell.coffee
@@ -1,4 +1,5 @@
 module.exports = process.atomBinding 'shell'

 if process.platform is 'win32' and process.type is 'renderer'
-  module.exports.showItemInFolder = require('remote').process.atomBinding('shell').showItemInFolder
+  module.exports.showItemInFolder = (item) ->
+    require('remote').require('shell').showItemInFolder item


Added jQuery view.

Added jQuery view.

error: pathspec 'lib/jquery-view.coffee' did not match any file(s) known to git

--- lib/jquery-view.coffee
+++ lib/jquery-view.coffee
@@ -0,0 +1,62 @@
+window.Compaginator ?= {}
+class window.Compaginator.JqueryView
+
+  constructor: (paginator, cssSelector) ->
+    @render paginator, cssSelector
+
+  render: (paginator, cssSelector) ->
+
+    html = @constructor._renderPagination(paginator)
+
+    el = $(cssSelector)
+    el.html html
+
+    @_initEvents paginator, cssSelector
+
+  _initEvents: (paginator, cssSelector) ->
+
+    $(cssSelector + ' ul li.clickable').on('click', ->
+      paginator.setCurrentPage $(@).find('a').html()
+      false
+    )
+    $(cssSelector + ' ul li.previous').on('click', ->
+      paginator.setPrevPage $(@).find('a').html()
+      false
+    )
+    $(cssSelector + ' ul li.next').on('click', ->
+      paginator.setNextPage $(@).find('a').html()
+      false
+    )
+
+  @_renderPagination: (paginator) ->
+
+    html = '
'
+    html += @_renderPrevious paginator
+
+    $.each paginator.getDisplayPages(), (index, page) =>
+      html += @_renderPage page
+
+    html += @_renderNext paginator
+
+    html += '
'
+
+  @_renderPage: (page) ->
+      if page.active is true
+        '
' + page.page + '
'
+      else
+        if page.disabled is true
+          '
' + page.page + '
'
+        else
+          '
' + page.page + '
'
+
+  @_renderPrevious: (paginator) ->
+    if paginator.prevActive()
+      '
Previous
'
+    else
+      '
Previous
'
+
+  @_renderNext: (paginator) ->
+    if paginator.nextActive()
+      '
Next
'
+    else
+      '
Next
'


Fix leak

Fix leak

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/platanus/atom-rails-model-schema.git/'


Updated test/index.coffee: shallowCopy and deepCopy

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


added another test for #1416

added another test for #1416

--- test/function_invocation.coffee
+++ test/function_invocation.coffee
@@ -495,3 +495,8 @@
 test "#1416: don't omit one 'new' when compiling 'new new'", ->
   obj = new new Function "this.foo = 3"
   eq obj.foo, 3
+
+test "#1416: don't omit one 'new' when compiling 'new new fn()()'", ->
+  fn = -> -> @a = 2
+  {a} = new new fn()()
+  eq a, 2


added Bandango.NumberField

added Bandango.NumberField

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

--- app/assets/javascripts/components/number_field.js.coffee
+++ app/assets/javascripts/components/number_field.js.coffee
@@ -0,0 +1,7 @@
+onlyNumberHelper = (input) ->
+  Number input.toString().replace(/[^\d.]/g, "")
+
+Bandango.NumberField = Ember.TextField.extend
+  _cleanValue: (->
+    @set "value", onlyNumberHelper(@get("value"))
+  ).observes("value")


cleanup

cleanup

--- client/create.coffee
+++ client/create.coffee
@@ -105,7 +105,6 @@
         extensions:
             contextLink: new ContextLinkExtension()

-    console.log editor.toolbar
     # editor.toolbar.appendChild(toolbarFormContextAnchor());

     # editor.contextAnchorForm = editor.toolbar.querySelector('.medium-editor-toolbar-form-context-anchor');
@@ -428,8 +427,6 @@
         horizontalIndex = parentSection.data('index')
         url = parentSection.find('input.youtube-link-input').val()
         videoId = url.match(/.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/)?[1]
-        console.log videoId
-

         Meteor.call 'youtubeVideoInfo', videoId, (err, info) ->
@@ -440,8 +437,6 @@
             if not info
                 console.log 'video not found'
                 return
-
-            console.log info

             newContextBlock =


Implement explicit refreshInterval

Implement explicit refreshInterval

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


Remove movies and works js entrance

Remove movies and works js entrance

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


Start working on a validation system

Start working on a validation system

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

--- validation.coffee
+++ validation.coffee
@@ -0,0 +1,87 @@
+define 'Task', 'object',
+  keys:
+    id: 'string'
+    listId: 'string'
+    date: 'number'
+    name: 'string'
+    notes: 'string'
+    priority: 'number'
+    completed: 'boolean'
+
+define 'List', 'object',
+  keys:
+    id: 'string'
+    name: 'string'
+    tasks: 'array'
+
+
+define 'Pref', 'object',
+  keys:
+    id: 'string'
+    sort: 'boolean'
+    night: 'string'
+    language: 'string'
+    weekstart: 'number'
+    dateFormat: 'string'
+    confirmDelete: 'boolean'
+    completedDuration: 'string'
+
+define 'Queue', 'object',
+  keys:
+    task: 'TaskQueue'
+    list: 'ListQueue'
+    pref: 'PrefQueue'
+
+define 'TaskQueue', 'object',
+  keys:
+    '*': 'TaskEvent'
+
+define 'ListQueue', 'object',
+  keys:
+    '*': 'ListEvent'
+
+define 'PrefQueue', 'object',
+  keys:
+    '*': 'PrefEvent'
+
+define 'QueueEvent', 'array',
+  keys:
+    0: 'number'
+  inherit: (arr) ->
+    switch arr[0]
+      when 0
+        return 'CreateEvent'
+      when 1
+        return 'UpdateEvent'
+      when 2
+        return 'DestroyEvent'
+
+define 'CreateEvent', 'array',
+  keys:
+    2: 'number'
+
+define 'UpdateEvent', 'array',
+  keys:
+    2: 'Timestamps'
+
+define 'DestroyEvent', 'array',
+  keys:
+    2: 'number'
+  inherit: 'QueueEvent'
+
+define 'TaskEvent', 'array',
+  keys:
+    1: 'Task'
+  inherit: 'QueueEvent'
+
+define 'ListEvent', 'array',
+  keys:
+    1: 'List'
+
+define 'Pref', 'array',
+  keys:
+    1: 'Pref'
+  inherit: 'QueueEvent'
+
+
+


Allow sending messages to non-whitelisted devices by default

--- lib/simpleAuth.coffee
+++ lib/simpleAuth.coffee
@@ -23,7 +23,7 @@
     checkLists fromDevice, toDevice, toDevice?.receiveWhitelist, toDevice?.receiveBlacklist, false

   canSend: (fromDevice, toDevice) ->
-    checkLists fromDevice, toDevice, toDevice?.sendWhitelist, toDevice?.sendBlacklist, false
+    checkLists fromDevice, toDevice, toDevice?.sendWhitelist, toDevice?.sendBlacklist, true

   canConfigure: (fromDevice, toDevice, message) ->
     return false if !fromDevice or !toDevice


:lipstick: typo in TODO comment

:lipstick: typo in TODO comment

--- tasks/prebuild-less-task.coffee
+++ tasks/prebuild-less-task.coffee
@@ -20,7 +20,7 @@
         path.resolve('vendor')
       ]
       for theme in configuration
-        # TODO Using AtomPackage class once it runs outside of an Atom context
+        # TODO Use AtomPackage class once it runs outside of an Atom context
         themePath = path.resolve('node_modules', theme, 'stylesheets')
         importPaths.unshift(themePath) if grunt.file.isDir(themePath)


Increase logging from pivotal

Increase logging from pivotal

--- plugins/pivotal-tracker/index.coffee
+++ plugins/pivotal-tracker/index.coffee
@@ -28,9 +28,8 @@
       .send(params)
       .buffer(true)
       .end((res) ->
-        if res && res.status != 200
-          console.log "Status code: #{res.status}"
-          console.log res.text || "No response from pivotal!"
+        console.log "Status code: #{res.status}"
+        console.log res.text || "No response from pivotal!"
       );

 module.exports = PivotalTracker


Create binary-search-tree-check.coffee

Create binary-search-tree-check.coffee

error: pathspec 'binary-search-tree-check/binary-search-tree-check.coffee' did not match any file(s) known to git

--- binary-search-tree-check/binary-search-tree-check.coffee
+++ binary-search-tree-check/binary-search-tree-check.coffee
@@ -0,0 +1,9 @@
+isBinarySearchTree = isBST = (bst) ->
+  test = undefined
+
+  # Break the recursion if the left or right node is bigger than the current
+  # node or if the left node is larger than the right node
+  return false  if bst.left and bst.left.value > bst.value
+  return false  if bst.right and bst.right.value > bst.value
+  return false  if bst.left and bst.right and bst.left.value > bst.right.value
+  (if (test = bst.left and isBST(bst.left) and bst.right and isBST(bst.right)) is `undefined` then true else test)


Revert "Add support for scoped settings"

This reverts commit 01693ec0fdfe9c869abb51717dae14128e605892.

--- lib/settings.coffee
+++ lib/settings.coffee
@@ -1,6 +1,21 @@
+_ = require 'underscore-plus'
+
 module.exports =
-  flatten: (root, dict, path) ->
-    _ = require 'underscore-plus'
+class Settings
+  update: (settings={}) ->
+    @load(settings)
+
+  load: (settings={}) ->
+    flatSettings = {}
+    @flattenSettings flatSettings, settings
+    for setting, value of flatSettings
+      if _.isArray value
+        currentValue = atom.config.get setting
+        value = _.union currentValue, value
+      atom.config.setRawValue setting, value
+    # atom.config.emit 'updated'
+
+  flattenSettings: (root, dict, path) ->
     for key, value of dict
       dotPath = key
       dotPath = "#{path}.#{key}" if path?
@@ -8,32 +23,4 @@
       if not isObject
         root[dotPath] = value
       else
-        @flatten root, dict[key], dotPath
-
-  resetUserSettings: (settings, scope) ->
-    _ = require 'underscore-plus'
-    flatSettings = {}
-    options = if scope then {scopeSelector: scope} else {}
-    options.save = false
-
-    @flatten flatSettings, settings
-    for setting, value of flatSettings
-      if _.isArray value
-        valueOptions = if scope then {scope: scope} else {}
-        currentValue = atom.config.get setting, valueOptions
-        value = _.union currentValue, value
-      atom.config.set setting, value, options
-
-  enable: (settings) ->
-    if settings.global?
-      settings['*'] = settings.global
-      delete settings.global
-
-    if settings['*']?
-      scopedSettings = settings
-      settings = settings['*']
-      delete scopedSettings['*']
-
-      @resetUserSettings setting, scope for scope, setting of scopedSettings
-
-    @resetUserSettings settings
+        @flattenSettings root, dict[key], dotPath


makes tests pass and cleanup

makes tests pass and cleanup

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/kevgo/modularity-rails.git/'


NotificationCollection: implement fetch success and error handlers

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/rremizov/github-notifier.git/'


Something whitespace

Something whitespace

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


using colon for class variables

using colon for class variables

--- async/Sequence.coffee
+++ async/Sequence.coffee
@@ -40,7 +40,7 @@

     # The parameter modes (enum-like).
     # See the class documentation for more details.
-    @PARAM_MODES =
+    @PARAM_MODES:
         CONTEXT: "CONTEXT"
         IMPLICIT: "IMPLICIT"
         EXPLICIT: "EXPLICIT"


think I found where the general case is slipping through

--- lib/features/typechecking.coffee
+++ lib/features/typechecking.coffee
@@ -20,7 +20,7 @@
     @markersOfFile = new Map

     @disposables.add atom.workspace.observeTextEditors (editor) =>
-      if isScalaSource(editor)
+      if isScalaSource(editor) # TODO: check that the source is also in an ensime-activated project.  ensime:start should log which directories are ensime-enabled
         @editors.set(editor.getPath(), editor)
         @disposables.add editor.onDidDestroy () =>
           @editors.delete(editor.getPath())


added ngTemplateCache

added ngTemplateCache

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

--- tasks/ngTemplateCache.coffee
+++ tasks/ngTemplateCache.coffee
@@ -0,0 +1,48 @@
+module.exports = (grunt) ->
+	escapeContent = (content) ->
+		# escape single quotes
+		content = content.replace /'/g, '\\\''
+
+		# add single quotes at the beginning and end of each line
+		content = content.replace /\r?\n/g, '\' +\n\''
+
+	prettyDiff = require 'prettydiff'
+	linefeed = grunt.util.normalizelf grunt.util.linefeed
+
+	grunt.registerMultiTask 'ngTemplateCache', 'Creates a script file pushing all views into the template cache.', ->
+		options = @options(
+			module: 'app'
+			trim: './src'
+		)
+
+		grunt.verbose.writeflags options, 'Options'
+
+		@files.forEach (f) ->
+			prefix = "angular.module('#{options.module}').run(['$templateCache', function ($templateCache) {"
+			suffix = '}]);'
+
+			output = f.src.filter((filepath) ->
+				unless grunt.file.exists(filepath)
+					grunt.log.warn "Source file \" #{filepath}\" not found."
+
+					false
+				else
+					true
+			).map((filepath) ->
+				content = grunt.file.read filepath
+
+				minifyOptions =
+					conditional: true
+					html: 'html-yes'
+					mode: 'minify'
+					source: content
+
+				minified = prettyDiff.api(minifyOptions)[0]
+				escaped = escapeContent minified
+				cache = "\t$templateCache.put('#{filepath.replace(options.trim, '')}', '#{escaped}');"
+			)
+
+			output.unshift prefix
+			output.push suffix
+			grunt.file.write f.dest, output.join linefeed
+			grunt.log.writeln "File #{f.dest} created."


change the exetention of inc to be php

change the exetention of inc to be php

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/jmartsch/generator-fixate-pw.git/'


Update hu.coffee

Update hu.coffee

--- app/locale/hu.coffee
+++ app/locale/hu.coffee
@@ -175,29 +175,29 @@
     edit_settings: "Beállítások szerkesztése"
 #    profile_for_prefix: "Profile for "
 #    profile_for_suffix: ""
-#    approved: "Approved"
-#    not_approved: "Not Approved"
-#    looking_for: "Looking for:"
-#    last_updated: "Last updated:"
-#    contact: "Contact"
-#    work_experience: "Work Experience"
-#    education: "Education"
+   approved: "Jóváhagyva"
+    not_approved: "Nincs jóváhagyva"
+   looking_for: "Keres:"
+    last_updated: "Legutóbb napra-készre hozva:"
+    contact: "Kapcsolat"
+    work_experience: "Munkatapasztalat"
+    education: "Végzettség"
 #    our_notes: "Our Notes"
-#    projects: "Projects"
-
-#  employers:
-#    want_to_hire_our_players: "Want to hire expert CodeCombat players?"
-#    contact_george: "Contact George to see our candidates"
-#    candidates_count_prefix: "We currently have "
-#    candidates_count_many: "many"
-#    candidates_count_suffix: "highly skilled and vetted developers looking for work."
-#    candidate_name: "Name"
+    projects: "Projektek"
+
+  munkaadók:
+    want_to_hire_our_players: "Akarsz szakértő CodeCombat játékosokat alkalmazni?"
+    contact_george: "Vedd fel a kapcsolatot George-dzsal, hogy megtekinthesd jelöltjeinket"
+    candidates_count_prefix: "Pillanatnyilag van"
+    candidates_count_many: "sok"
+    candidates_count_suffix: "magasan képzett és ellenőrzött fejlesztő, aki munkát keres."
+    candidate_name: "Név"
 #    candidate_location: "Location"
-#    candidate_looking_for: "Looking For"
-#    candidate_role: "Role"
+    candidate_looking_for: "Keres"
+    candidate_role: "Szerep"
 #    candidate_top_skills: "Top Skills"
 #    candidate_years_experience: "Yrs Exp"
-#    candidate_last_updated: "Last Updated"
+    candidate_last_updated: "Legutóbb napra-készre hozva"

   play_level:
     level_load_error: "A pályát nem sikerült betölteni: "


Update pl.coffee

Update pl.coffee

--- app/locale/pl.coffee
+++ app/locale/pl.coffee
@@ -332,21 +332,21 @@
     art_sprites: "Sprite'y"
     art_other: "Dowolne inne prace niezwiązane z kodem, które są dostępne podczas tworzenia poziomów."
     art_access: "Obecnie nie ma uniwersalnego, prostego sposobu, by pozyskać te zasoby. Możesz wejść w ich posiadanie poprzez URL-e, z których korzysta strona, skontaktować się z nami w celu uzyskania pomocy bądź pomóc nam w ulepszeniu strony, aby zasoby te stały się łatwiej dostępne."
-    art_paragraph_1: "W celu uznania własności, wymień z nazwy i podaj link do codecombat.com w pobliżu miejsca, gdzie znajduje się użyty zasób bądź w miejscu odpowiednim dla twojego medium. Na przykład:"
+    art_paragraph_1: "W celu uznania autorstwa, wymień z nazwy i podaj link do codecombat.com w pobliżu miejsca, gdzie znajduje się użyty zasób bądź w miejscu odpowiednim dla twojego medium. Na przykład:"
     use_list_1: "W przypadku użycia w filmie lub innej grze, zawrzyj codecombat.com w napisach końcowych."
-    use_list_2: "W przypadku użycia na stronie internetowej, zawrzyj link w pobliżu miejsca użycia, na przykład po obrazkiem lub na ogólnej stronie poświęconej uznaniu twórców, gdzie możesz również wspomnieć o innych pracach licencjonowanych przy użyciu Creative Commons oraz oprogramowaniu open source używanym na stronie. Coś, co samo w sobie jednoznacznie odnosi się do CodeCombat, na przykład wpis na blogu dotyczący CodeCombat, nie wymaga już dodatkowego uznania własności."
-#    art_paragraph_2: "If the content being used is created not by CodeCombat but instead by a user of codecombat.com, attribute them instead, and follow attribution directions provided in that resource's description if there are any."
-#    rights_title: "Rights Reserved"
-#    rights_desc: "All rights are reserved for Levels themselves. This includes"
-#    rights_scripts: "Scripts"
-#    rights_unit: "Unit configuration"
-#    rights_description: "Description"
-#    rights_writings: "Writings"
-#    rights_media: "Media (sounds, music) and any other creative content made specifically for that Level and not made generally available when creating Levels."
-#    rights_clarification: "To clarify, anything that is made available in the Level Editor for the purpose of making levels is under CC, whereas the content created with the Level Editor or uploaded in the course of creation of Levels is not."
-#    nutshell_title: "In a Nutshell"
-#    nutshell_description: "Any resources we provide in the Level Editor are free to use as you like for creating Levels. But we reserve the right to restrict distribution of the Levels themselves (that are created on codecombat.com) so that they may be charged for in the future, if that's what ends up happening."
-#    canonical: "The English version of this document is the definitive, canonical version. If there are any discrepencies between translations, the English document takes precedence."
+    use_list_2: "W przypadku użycia na stronie internetowej, zawrzyj link w pobliżu miejsca użycia, na przykład po obrazkiem lub na ogólnej stronie poświęconej uznaniu twórców, gdzie możesz również wspomnieć o innych pracach licencjonowanych przy użyciu Creative Commons oraz oprogramowaniu open source używanym na stronie. Coś, co samo w sobie jednoznacznie odnosi się do CodeCombat, na przykład wpis na blogu dotyczący CodeCombat, nie wymaga już dodatkowego uznania autorstwa."
+    art_paragraph_2: "Jeśli użyte przez ciebie zasoby zostały stworzone nie przez CodeCombat, ale jednego z naszych użytkowników, uznanie autorstwa należy się jemu - postępuj wówczas zgodnie z zasadami uznania autorstwa dostarczonymi wraz z rzeczonym zasobem (o ile takowe występują)."
+    rights_title: "Prawa zastrzeżone"
+    rights_desc: "Wszelkie prawa są zastrzeżone dla poziomów jako takich. Zawierają się w tym:"
+    rights_scripts: "Skrypty"
+    rights_unit: "Konfiguracje jednostek"
+    rights_description: "Opisy"
+    rights_writings: "Teksty"
+    rights_media: "Multimedia (dźwięki, muzyka) i jakiekolwiek inne typy prac i zasobów stworzonych specjalnie dla danego poziomu, które nie zostały publicznie udostępnione do tworzenia poziomów."
+    rights_clarification: "Gwoli wyjaśnienia, wszystko, co jest dostępne w Edytorze Poziomów w celu tworzenia nowych poziomów podlega licencji CC, podczas gdy zasoby stworzone w Edytorze Poziomów lub przesłane w toku tworzenia poziomu - nie."
+    nutshell_title: "W skrócie"
+    nutshell_description: "Wszelkie zasoby, które dostarczamy w Edytorze Poziomów są darmowe w użyciu w jakikolwiek sposób w celu tworzenia poziomów. Jednocześnie, zastrzegamy sobie prawo do ograniczenia rozpowszechniania poziomów (stworzonych przez codecombat.com) jako takich, aby mogła być za nie w przyszłości pobierana opłata, jeśli dojdzie do takiej konieczności."
+    canonical: "Angielska wersja tego dokumentu jest ostateczna, kanoniczną wersją. Jeśli zachodzą jakieś rozbieżności pomiędzy tłumaczeniami, dokument anglojęzyczny ma pierwszeństwo."

 #  contribute:
 #    page_title: "Contributing"


ru

ru

community block, skill_docs done, small fixes

--- app/locale/ru.coffee
+++ app/locale/ru.coffee
@@ -318,7 +318,7 @@
     choose_inventory: "Выбрать предметы"
     equipped_item: "Выбранный"
     available_item: "Доступно"
-    restricted_title: "Ограниченный"
+    restricted_title: "Ограничено"
     should_equip: "(двойной клик чтобы надеть)"
     equipped: "(выбранный)"
     locked: "(заблокированный)"
@@ -339,7 +339,7 @@

   subscribe:
     subscribe_title: "Подпишись"
-    levels: "Разблокируй 25 уровней!. И еще 5 каждую неделю!"
+    levels: "Разблокируйте 25 уровней! И еще 5 каждую неделю!"
     heroes: "Более сильные герои!"
     gems: "3500 бонусных самоцветов каждый месяц!"
     items: "Более 250 бонусных предметов!"
@@ -381,8 +381,8 @@
     restricted_to_certain_heroes: "Только определенные герои могут играть этот уровень."

   skill_docs:
-#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
-#    read_only: "read-only"
+    writable: "доступно для записи" # Hover over "attack" in Your Skills while playing a level to see most of this
+    read_only: "только чтение"
     action_name: "имя"
     action_cooldown: "Применяется"
     action_specific_cooldown: "Восстановление"
@@ -525,8 +525,8 @@
     skip_scripts: "Пропустить все возможные скрипты."
     toggle_playback: "Переключить проигрывание/паузу."
     scrub_playback: "Перемотка назад и вперед во времени."
-    single_scrub_playback: "Scrub back and forward through time by a single frame."
-    scrub_execution: "Scrub through current spell execution."
+    single_scrub_playback: "Покадровая перемотка назад и вперед."
+    scrub_execution: "Перескочить через выполнение текущего заклинания."
     toggle_debug: "Включить отображение отладки."
     toggle_grid: "Включить наложение сетки."
     toggle_pathfinding: "Включить путевой оверлей.."
@@ -536,21 +536,21 @@

   community:
     main_title: "Сообщество CodeCombat"
-#    introduction: "Check out the ways you can get involved below and decide what sounds the most fun. We look forward to working with you!"
-#    level_editor_prefix: "Use the CodeCombat"
-#    level_editor_suffix: "to create and edit levels. Users have created levels for their classes, friends, hackathons, students, and siblings. If create a new level sounds intimidating you can start by forking one of ours!"
-#    thang_editor_prefix: "We call units within the game 'thangs'. Use the"
-#    thang_editor_suffix: "to modify the CodeCombat source artwork. Allow units to throw projectiles, alter the direction of an animation, change a unit's hit points, or upload your own vector sprites."
-#    article_editor_prefix: "See a mistake in some of our docs? Want to make some instructions for your own creations? Check out the"
-#    article_editor_suffix: "and help CodeCombat players get the most out of their playtime."
-#    find_us: "Find us on these sites"
-#    social_blog: "Read the CodeCombat blog on Sett"
-#    social_discource: "Join the discussion on our Discourse forum"
-#    social_facebook: "Like CodeCombat on Facebook"
-#    social_twitter: "Follow CodeCombat on Twitter"
-#    social_gplus: "Join CodeCombat on Google+"
-#    social_hipchat: "Chat with us in the public CodeCombat HipChat room"
-#    contribute_to_the_project: "Contribute to the project"
+    introduction: "Просмотрите ниже способы втянуться и решите, что для вас звучит наиболее весело и интересно. Мы с нетерпением ожидаем совместной работы с вами!"
+    level_editor_prefix: "Используйте"
+    level_editor_suffix: "CodeCombat чтобы создавать и редактировать уровни. Пользователи могут создавать уровни для своих одноклассников, друзей, хакатонов, студентов, братьев и сестер. Если создание нового уровня звучит устрашающе, вы можете начать, ответвившись от одного из наших!"
+    thang_editor_prefix: "Мы называем единицы внутри игры 'предметами'. Используйте"
+    thang_editor_suffix: "чтобы изменять ресурсы игры. Позволяйте единицам бросать снаряды, измените направление анимации, очки здоровья или загрузите свои собственные векторные изображения."
+    article_editor_prefix: "Увдели ошибку в нашей документации? Хотите сделать инструкции к вашим творениям? Посмотрите"
+    article_editor_suffix: "и помогите игрокам CodeCombat получить максимум от их времяпрепровождения."
+    find_us: "Найдите нас на этих сайтах"
+    social_blog: "Читайте блог CodeCombat на Sett"
+    social_discource: "Присоединяйтесь к обсуждению на нашем форуме"
+    social_facebook: "Оцените CodeCombat на Facebook"
+    social_twitter: "Следуйте за CodeCombat на Twitter"
+    social_gplus: "Присоединяйтесь к CodeCombat на Google+"
+    social_hipchat: "Общайтесь с нами в публичной чат-комнате CodeCombat на HipChat"
+    contribute_to_the_project: "Сотрудничайте с проектом"

   classes:
     archmage_title: "Архимаг"
@@ -630,7 +630,7 @@
 #    achievement_query_misc: "Key achievement off of miscellanea"
 #    achievement_query_goals: "Key achievement off of level goals"
 #    level_completion: "Level Completion"
-#    pop_i18n: "Populate I18N"
+    pop_i18n: "Популяризируйте I18N"

   article:
     edit_btn_preview: "Предпросмотр"


Fixed a couple syntax issues in Russian locale..

--- app/locale/ru.coffee
+++ app/locale/ru.coffee
@@ -82,7 +82,7 @@
     sending: "Отправка..."
     send: "Отправить отзыв"

-diplomat_suggestion:
+  diplomat_suggestion:
     title: "Помогите перевести CodeCombat!"
     sub_heading: "Нам нужен ваш языковой талант."
     pitch_body: "Мы создаём CodeCombat на английском, но у нас уже есть игроки со всего мира. Многие из них хотели бы играть на русском, но не знают английского, так что если вы знаете оба этих языка - зарегистрируйтесь как Дипломат и помогите перевести сайт CodeCombat и все уровни на русский язык."
@@ -180,4 +180,4 @@
     tome_select_spell: "Выбрать заклинание"
     tome_select_a_thang: "Выбрать кого-нибудь для "
     tome_available_spells: "Доступные заклинания"
-    hud_continue: Продолжить (нажмите Shift+Space)"
+    hud_continue: "Продолжить (нажмите Shift+Space)"


Ensures global points object doesn't get clobbered by hubot's brain in the loaded event.

--- src/scripts/points.coffee
+++ src/scripts/points.coffee
@@ -30,7 +30,7 @@

 module.exports = (robot) ->
     robot.brain.on 'loaded', ->
-        points = robot.brain.data.points
+        points = robot.brain.data.points or {}

     robot.respond /give (\d+) points to (.*?)\s?$/i, (msg) ->
         award_points(msg, msg.match[2], msg.match[1])
@@ -64,4 +64,4 @@
         points[username] ?= 0

         msg.send username + ' Has ' + points[username] + ' Points'
-       +


Adding word boundaries to polite, so that 'hi' and 'ty' don't constantly trigger

--- src/scripts/polite.coffee
+++ src/scripts/polite.coffee
@@ -33,14 +33,14 @@
   input.indexOf(name) != -1

 module.exports = (robot) ->
-  robot.hear /(thanks|thank you|cheers|nice one)/i, (msg) ->
+  robot.hear /\b(thanks|thank you|cheers|nice one)\b/i, (msg) ->
     msg.reply msg.random responses if youTalkinToMe(msg, robot)

-  robot.hear /(ty|thx)/i, (msg) ->
+  robot.hear /\b(ty|thx)\b/i, (msg) ->
     msg.reply msg.random shortResponses if youTalkinToMe(msg, robot)

-  robot.hear /(hello|hi|sup|howdy|good (morning|evening|afternoon))/i, (msg) ->
+  robot.hear /\b(hello|hi|sup|howdy|good (morning|evening|afternoon))\b/i, (msg) ->
     msg.reply "#{robot.name} at your service!" if youTalkinToMe(msg, robot)

-  robot.hear /(bye|night|goodbye|good night)/i, (msg) ->
+  robot.hear /\b(bye|night|goodbye|good night)\b/i, (msg) ->
     msg.reply msg.random farewellResponses if youTalkinToMe(msg, robot)


Update regex on SHIP IT script to match more combinations

--- src/scripts/shipit.coffee
+++ src/scripts/shipit.coffee
@@ -34,5 +34,5 @@
 ]

 module.exports = (robot) ->
-  robot.hear /ship it/i, (msg) ->
+  robot.hear /ship(ping|z|s)?( it)?/i, (msg) ->
     msg.send msg.random squirrels


Bind image load/error events using one

Bind image load/error events using one

--- src/cropit.coffee
+++ src/cropit.coffee
@@ -114,8 +114,8 @@
     @options.onImageLoading?()
     @setImageLoadingClass()

-    @$hiddenImage.load @onImageLoaded.bind @
-    @$hiddenImage.error @onImageError.bind @
+    @$hiddenImage.one 'load', @onImageLoaded.bind @
+    @$hiddenImage.one 'error', @onImageError.bind @

   onImageLoaded: ->
     @setImageLoadedClass()


Mention screen rows are used

Mention screen rows are used

--- src/editor.coffee
+++ src/editor.coffee
@@ -621,7 +621,7 @@
   largestFoldStartingAtScreenRow: (screenRow) ->
     @displayBuffer.largestFoldStartingAtScreenRow(screenRow)

-  # Public: Moves the selected lines up one row.
+  # Public: Moves the selected lines up one screen row.
   moveLineUp: ->
     selection = @getSelectedBufferRange()
     return if selection.start.row is 0
@@ -655,7 +655,7 @@

       @setSelectedBufferRange(selection.translate([-1]), preserveFolds: true)

-  # Public: Moves the selected lines down one row.
+  # Public: Moves the selected lines down one screen row.
   moveLineDown: ->
     selection = @getSelectedBufferRange()
     lastRow = @buffer.getLastRow()


removing session.js.coffee so that this project will work better in projects other than just firehose desk

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/wenchenglai/firehose-ember-shared.git/'


make pane resize behavior be valid when split or close panes dynamically.

--- spec/pane-resize-handle-element-spec.coffee
+++ spec/pane-resize-handle-element-spec.coffee
@@ -92,3 +92,40 @@
       newWidth = getElementWidth(horizontalResizeElements[1].previousSibling) / 2
       resizeElementMove(horizontalResizeElements[1], newWidth)
       expectPaneScale(1, 1, 0.5, 1.5, 0.5, 1.5)
+
+    it "transform the flex scale when dynamically split or close panes in the same direction", ->
+      leftPane = container.getActivePane()
+      middlePane = leftPane.splitRight()
+      rightPane = middlePane.splitRight()
+
+      expectPaneScale = (leftScale, middleScale, rightScale) ->
+        paneScales = [[leftPane, leftScale], [middlePane, middleScale], [rightPane, rightScale]];
+        expect(e[0].getFlexScale()).toBeCloseTo(e[1], 0.1) for e in paneScales
+
+      resizeElement = containerElement.querySelector('atom-pane-resize-handle')
+      resizeElementMove(resizeElement, getElementWidth(atom.views.getView(leftPane)) / 2)
+      expectPaneScale(0.5, 1.5, 1)
+
+      leftPane.close()
+      expect(middlePane.getFlexScale()).toBeCloseTo(1.2, 0.1)
+      expect(rightPane.getFlexScale()).toBeCloseTo(0.8, 0.1)
+
+      rightPane.close() # when close the same direction pane, the flexScale will recorver
+      expect(middlePane.getFlexScale()).toBeCloseTo(1, 0.1)
+
+    it "change the flex scale when dynamically split or close panes in orthogonal direction", ->
+      leftPane = container.getActivePane()
+      rightPane = leftPane.splitRight()
+
+      resizeElement = containerElement.querySelector('atom-pane-resize-handle')
+      resizeElementMove(resizeElement, getElementWidth(resizeElement.previousSibling) / 2)
+      expect(leftPane.getFlexScale()).toBeCloseTo(0.5, 0.1)
+
+      downPane = leftPane.splitDown()   # dynamically split pane, pane's flexScale will become to 1
+      expect(leftPane.getFlexScale()).toBeCloseTo(1, 0.1)
+      expect(leftPane.getParent().getFlexScale()).toBeCloseTo(0.5, 0.1)
+
+      downPane.close() # dynamically close pane, the pane's flexscale will recorver to origin value
+      expect(leftPane.getFlexScale()).toBeCloseTo(0.5, 0.1)
+
+


attempt to convert js to coffee

attempt to convert js to coffee

--- app/assets/javascripts/pages/agent-show-page.js.coffee
+++ app/assets/javascripts/pages/agent-show-page.js.coffee
@@ -1,6 +1,10 @@
 $('#target').click ->
   $('#memorytoggle').toggleClass 'hidden'
   return
+
+`$( "#target" ).click(function() {
+  $("#memorytoggle").toggleClass("hidden");
+});`

 class @AgentShowPage
   constructor: ->


done got it to work

done got it to work

--- app/assets/javascripts/pages/agent-show-page.js.coffee
+++ app/assets/javascripts/pages/agent-show-page.js.coffee
@@ -1,13 +1,8 @@
-$('#target').click ->
-  $('#memorytoggle').toggleClass 'hidden'
-  return
-
-`$( "#target" ).click(function() {
-  $("#memorytoggle").toggleClass("hidden");
-});`
-
 class @AgentShowPage
   constructor: ->
+   $('#target').click ->
+     $('#memorytoggle').toggleClass 'hidden'
+     return
     $(".agent-show #show-tabs a[href='#logs'], #logs .refresh").on "click", @fetchLogs
     $(".agent-show #logs .clear").on "click", @clearLogs
     $(".agent-show #memory .clear").on "click", @clearMemory


fix warnings

fix warnings

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


vms: WIP: introducing vm product form

vms: WIP: introducing vm product form

error: pathspec 'client/app/Applications/Environments.kdapplication/views/vms/vmproductform.coffee' did not match any file(s) known to git

--- client/app/Applications/Environments.kdapplication/views/vms/vmproductform.coffee
+++ client/app/Applications/Environments.kdapplication/views/vms/vmproductform.coffee
@@ -0,0 +1,6 @@
+class VmProductForm extends JView
+  pistachio: ->
+    """
+
So you want to buy a VM plan

+
+    """


Add angular app

Add angular app

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


myteam/member: fix buttonwithmenu toggle problem

--- client/home/lib/myteam/components/hometeamteammates/member.coffee
+++ client/home/lib/myteam/components/hometeamteammates/member.coffee
@@ -18,6 +18,13 @@
   onClickMemberRole: (role, event) ->
     kd.utils.stopDOMEvent event
     @setState { isMenuOpen: yes }
+
+
+  componentWillReceiveProps: (nextProps) ->
+
+    { isMenuOpen } = nextProps
+
+    @setState { isMenuOpen }

   getMenuItems: (role) ->
@@ -60,6 +67,7 @@

+        <AvatarView member={@props.member} />

{fullName}

       <Email email={email} />
@@ -85,10 +93,15 @@

 AvatarView = ({ member }) ->

-
-    <ProfilePicture account={member.toJS()} height={40} width={40} />
-
-
+  unless member.get 'status'
+
+      <ProfilePicture account={member.toJS()} height={40} width={40} />
+
+
+  else
+
+
+

 MemberRole = ({ role }) ->


Tests: IDE: Layout: Fixed undoSplitPanesNotShowOnScreen test.

--- client/test/lib/ide/layout.coffee
+++ client/test/lib/ide/layout.coffee
@@ -34,19 +34,19 @@
     browser.end()

+  undoSplitPanesNotShowOnScreen: (browser) ->

-  # undoSplitPanesNotShowOnList: (browser) ->
+    helpers.beginTest(browser)
+    helpers.waitForVMRunning(browser)

-  #   helpers.beginTest(browser)
-  #   helpers.waitForVMRunning(browser)
+    newPaneSelector   = '.kdsplitcomboview .kdsplitview-panel.panel-1 .application-tab-handle-holder'

-  #   layoutHelpers.undoSplit(browser)
+    layoutHelpers.undoSplit(browser)

-  #   browser
-  #     .waitForElementVisible     '.panel-1 .application-tab-handle-holder', 20000
-  #     .click                     '.panel-1 .application-tab-handle-holder .plus'
-  #     .waitForElementNotPresent  '.context-list-wrapper li.undo-split', 20000 # Assertion
-  #     .end()
+    browser
+      .waitForElementVisible   newPaneSelector, 20000
+      .waitForElementPresent   newPaneSelector + ' .general-handles .close-handle.hidden', 20000 # Assertion
+      .end()

   openDrawingBoard: (browser) ->


:lipstick: Remove extra newline

:lipstick: Remove extra newline

--- src/window.coffee
+++ src/window.coffee
@@ -32,7 +32,6 @@
   window.syntax = atom.syntax
   window.pasteboard = atom.pasteboard
   window.keymap = atom.keymap
-

 # Set up the default event handlers and menus for a non-editor windows.
 #


Add (empty) CoffeeScript-file.

Add (empty) CoffeeScript-file.

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


testutil functions for server start and close

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


atom: snippets: more

atom: snippets: more

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


Add objectToQuery helper

Add objectToQuery helper

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


Implement GET /users

Implement GET /users

Only usable by administrators.

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

--- api/routes/users.coffee
+++ api/routes/users.coffee
@@ -0,0 +1,35 @@
+options = require '../tools/optionsroute'
+middleware = require '../tools/middleware'
+
+httpStatus = require 'http-status-codes'
+commonResponses = require '../tools/commonresponses'
+privilegeLevels = require '../tools/privilegelevels'
+
+module.exports = (app, db) ->
+    app.options '/users', options ['GET', 'POST']
+    app.options '/users/:id', options ['GET', 'PATCH', 'DELETE']
+
+    app.get '/users'
+    , middleware.requireMinPrivilegeLevel(privilegeLevels.admin)
+    , (req, res, next) ->
+        db.all 'SELECT id, email, name, ulevel FROM tUser', (err, users) ->
+            return commonResponses.databaseError res if err?
+
+            res.status httpStatus.OK
+            .json users
+
+    app.post '/users', (req, res, next) ->
+        res.status httpStatus.NOT_IMPLEMENTED
+        .json { status: httpStatus.NOT_IMPLEMENTED }
+
+    app.get '/users/:id', (req, res, next) ->
+        res.status httpStatus.NOT_IMPLEMENTED
+        .json { status: httpStatus.NOT_IMPLEMENTED }
+
+    app.patch '/users/:id', (req, res, next) ->
+        res.status httpStatus.NOT_IMPLEMENTED
+        .json { status: httpStatus.NOT_IMPLEMENTED }
+
+    app.delete '/users/:id', (req, res, next) ->
+        res.status httpStatus.NOT_IMPLEMENTED
+        .json { status: httpStatus.NOT_IMPLEMENTED }


Obtain slider threshold values from controller

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


stash

stash

--- src/app/project.coffee
+++ src/app/project.coffee
@@ -9,6 +9,10 @@
 Directory = require 'directory'
 BufferedProcess = require 'buffered-process'

+# Public: Represents a project that's opened in Atom.
+#
+# Ultimately, a project is a git directory that's been opened. It's a collection
+# of directories and files that you can operate on.
 module.exports =
 class Project
   registerDeserializer(this)
@@ -35,9 +39,15 @@
   destroy: ->
     editSession.destroy() for editSession in @getEditSessions()

+  # Public: Retrieves the project path.
+  #
+  # Returns a {String}.
   getPath: ->
     @rootDirectory?.path

+  # Public: Sets the project path.
+  #
+  # path - A {String} representing the new path
   setPath: (path) ->
     @rootDirectory?.off()

@@ -49,9 +59,15 @@

     @trigger "path-changed"

+  # Public: Retrieves the name of the root directory.
+  #
+  # Returns a {String}.
   getRootDirectory: ->
     @rootDirectory

+  # Public: Retrieves the names of every file (that's not `git ignore`d) in the project.
+  #
+  # Returns an {Array} of {String}s.
   getFilePaths: ->
     deferred = $.Deferred()
     paths = []
@@ -61,6 +77,11 @@
     deferred.resolve(paths)
     deferred.promise()

+  # Public: Identifies if a path is ignored.
+  #
+  # path - The {String} name of the path to check
+  #
+  # Returns a {Boolean}.
   isPathIgnored: (path) ->
     for segment in path.split("/")
       ignoredNames = config.get("core.ignoredNames") or []
@@ -68,6 +89,11 @@

     @ignoreRepositoryPath(path)

+  # Public: Identifies if a path is ignored.
+  #
+  # path - The {String} name of the path to check
+  #
+  # Returns a {Boolean}.
   ignoreRepositoryPath: (path) ->
     config.get("core.hideGitIgnoredFiles") and git?.isPathIgnored(fsUtils.join(@getPath(), path))


Added core/string.coffee

Added core/string.coffee

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

--- src/core/string.coffee
+++ src/core/string.coffee
@@ -0,0 +1 @@
+require './string/ruby'


Search completion; better left/right controls.

--- pages/vomnibar.coffee
+++ pages/vomnibar.coffee
@@ -227,16 +227,18 @@
       else
         # Don't suppress the Delete.  We want it to happen.
         return true
-    else if action == "control-right" and @inputContainsASelectionRange()
+    else if action == "control-right"
+      [ start, end ] = [ @input.selectionStart, @input.selectionEnd ]
+      return true unless @inputContainsASelectionRange() and end == @input.value.length
       # "Control-Right" advances the start of the selection by a word.
-      [ start, end ] = [ @input.selectionStart, @input.selectionEnd ]
       text = @input.value[start...end]
       newText = text.replace /^\s*\S+\s*/, ""
       @input.setSelectionRange start + (text.length - newText.length), end

     else if action == "control-left"
+      [ start, end ] = [ @input.selectionStart, @input.selectionEnd ]
+      return true unless @inputContainsASelectionRange() and end == @input.value.length
       # "Control-Left" extends the start of the selection to the start of the current word.
-      [ start, end ] = [ @input.selectionStart, @input.selectionEnd ]
       text = @input.value[0...start]
       newText = text.replace /\S+\s*$/, ""
       @input.setSelectionRange start + (newText.length - text.length), end


Use subscribe instead of namespace

Use subscribe instead of namespace

--- src/cursor-view.coffee
+++ src/cursor-view.coffee
@@ -29,22 +29,21 @@
   shouldPauseBlinking: false

   initialize: (@cursor, @editorView) ->
-    @cursor.on 'moved.cursor-view', =>
+    @subscribe @cursor, 'moved', =>
       @needsUpdate = true
       @shouldPauseBlinking = true

-    @cursor.on 'visibility-changed.cursor-view', (visible) =>
+    @subscribe @cursor, 'visibility-changed', (visible) =>
       @needsUpdate = true

-    @cursor.on 'autoscrolled.cursor-view', =>
+    @subscribe @cursor, 'autoscrolled', =>
       @editorView.requestDisplayUpdate()

-    @cursor.on 'destroyed.cursor-view', =>
+    @subscribe @cursor, 'destroyed', =>
       @needsRemoval = true

   beforeRemove: ->
     @editorView.removeCursorView(this)
-    @cursor.off('.cursor-view')
     @stopBlinking()

   updateDisplay: ->


Refactored code.

Refactored code.

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


remove extra code

remove extra code