');
+ }
+ return buf.join("");
+}
+```
+
+ Through the use of Jade's `./runtime.js` you may utilize these pre-compiled templates on the client-side _without_ Jade itself, all you need is the associated utility functions (in runtime.js), which are then available as `jade.attrs`, `jade.escape` etc. To enable this you should pass `{ client: true }` to `jade.compile()` to tell Jade to reference the helper functions
+ via `jade.attrs`, `jade.escape` etc.
+
+```js
+function anonymous(locals, attrs, escape, rethrow) {
+ var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow;
+ var buf = [];
+ with (locals || {}) {
+ var interp;
+ buf.push('\n
');
+ }
+ return buf.join("");
+}
+```
+
+## Public API
+
+```javascript
+ var jade = require('jade');
+
+ // Compile a function
+ var fn = jade.compile('string of jade', options);
+ fn(locals);
+```
+
+### Options
+
+ - `self` Use a `self` namespace to hold the locals. _false by default_
+ - `locals` Local variable object
+ - `filename` Used in exceptions, and required when using includes
+ - `debug` Outputs tokens and function body generated
+ - `compiler` Compiler to replace jade's default
+ - `compileDebug` When `false` no debug instrumentation is compiled
+
+## Syntax
+
+### Line Endings
+
+**CRLF** and **CR** are converted to **LF** before parsing.
+
+### Tags
+
+A tag is simply a leading word:
+
+ html
+
+for example is converted to ``
+
+tags can also have ids:
+
+ div#container
+
+which would render ``
+
+how about some classes?
+
+ div.user-details
+
+renders ``
+
+multiple classes? _and_ an id? sure:
+
+ div#foo.bar.baz
+
+renders ``
+
+div div div sure is annoying, how about:
+
+ #foo
+ .bar
+
+which is syntactic sugar for what we have already been doing, and outputs:
+
+ ``
+
+### Tag Text
+
+Simply place some content after the tag:
+
+ p wahoo!
+
+renders `
wahoo!
`.
+
+well cool, but how about large bodies of text:
+
+ p
+ | foo bar baz
+ | rawr rawr
+ | super cool
+ | go jade go
+
+renders `
foo bar baz rawr.....
`
+
+interpolation? yup! both types of text can utilize interpolation,
+if we passed `{ name: 'tj', email: 'tj@vision-media.ca' }` to the compiled function we can do the following:
+
+ #user #{name} <#{email}>
+
+outputs `
tj <tj@vision-media.ca>
`
+
+Actually want `#{}` for some reason? escape it!
+
+ p \#{something}
+
+now we have `
#{something}
`
+
+We can also utilize the unescaped variant `!{html}`, so the following
+will result in a literal script tag:
+
+ - var html = ""
+ | !{html}
+
+Nested tags that also contain text can optionally use a text block:
+
+ label
+ | Username:
+ input(name='user[name]')
+
+or immediate tag text:
+
+ label Username:
+ input(name='user[name]')
+
+Tags that accept _only_ text such as `script` and `style` do not
+need the leading `|` character, for example:
+
+ html
+ head
+ title Example
+ script
+ if (foo) {
+ bar();
+ } else {
+ baz();
+ }
+
+Once again as an alternative, we may use a trailing '.' to indicate a text block, for example:
+
+ p.
+ foo asdf
+ asdf
+ asdfasdfaf
+ asdf
+ asd.
+
+outputs:
+
+
foo asdf
+ asdf
+ asdfasdfaf
+ asdf
+ asd
+ .
+
+
+This however differs from a trailing '.' followed by a space, which although is ignored by the Jade parser, tells Jade that this period is a literal:
+
+ p .
+
+outputs:
+
+
.
+
+
+It should be noted that text blocks should be doubled escaped. For example if you desire the following output.
+
+
foo\bar
+
+use:
+
+ p.
+ foo\\bar
+
+### Comments
+
+Single line comments currently look the same as JavaScript comments,
+aka "//" and must be placed on their own line:
+
+ // just some paragraphs
+ p foo
+ p bar
+
+would output
+
+
+
foo
+
bar
+
+Jade also supports unbuffered comments, by simply adding a hyphen:
+
+ //- will not output within markup
+ p foo
+ p bar
+
+outputting
+
+
foo
+
bar
+
+### Block Comments
+
+ A block comment is legal as well:
+
+ body
+ //
+ #content
+ h1 Example
+
+outputting
+
+
+
+
+
+Jade supports conditional-comments as well, for example:
+
+ head
+ //if lt IE 8
+ script(src='/ie-sucks.js')
+
+outputs:
+
+
+
+
+
+
+### Nesting
+
+ Jade supports nesting to define the tags in a natural way:
+
+ ul
+ li.first
+ a(href='#') foo
+ li
+ a(href='#') bar
+ li.last
+ a(href='#') baz
+
+### Block Expansion
+
+ Block expansion allows you to create terse single-line nested tags,
+ the following example is equivalent to the nesting example above.
+
+ ul
+ li.first: a(href='#') foo
+ li: a(href='#') bar
+ li.last: a(href='#') baz
+
+
+### Attributes
+
+Jade currently supports '(' and ')' as attribute delimiters.
+
+ a(href='/login', title='View login page') Login
+
+When a value is `undefined` or `null` the attribute is _not_ added,
+so this is fine, it will not compile 'something="null"'.
+
+ div(something=null)
+
+Boolean attributes are also supported:
+
+ input(type="checkbox", checked)
+
+Boolean attributes with code will only output the attribute when `true`:
+
+ input(type="checkbox", checked=someValue)
+
+Multiple lines work too:
+
+ input(type='checkbox',
+ name='agreement',
+ checked)
+
+Multiple lines without the comma work fine:
+
+ input(type='checkbox'
+ name='agreement'
+ checked)
+
+Funky whitespace? fine:
+
+
+ input(
+ type='checkbox'
+ name='agreement'
+ checked)
+
+Colons work:
+
+ rss(xmlns:atom="atom")
+
+Suppose we have the `user` local `{ id: 12, name: 'tobi' }`
+and we wish to create an anchor tag with `href` pointing to "/user/12"
+we could use regular javascript concatenation:
+
+ a(href='/user/' + user.id)= user.name
+
+or we could use jade's interpolation, which I added because everyone
+using Ruby or CoffeeScript seems to think this is legal js..:
+
+ a(href='/user/#{user.id}')= user.name
+
+The `class` attribute is special-cased when an array is given,
+allowing you to pass an array such as `bodyClasses = ['user', 'authenticated']` directly:
+
+ body(class=bodyClasses)
+
+### HTML
+
+ Inline html is fine, we can use the pipe syntax to
+ write arbitrary text, in this case some html:
+
+```
+html
+ body
+ |
Title
+ |
foo bar baz
+```
+
+ Or we can use the trailing `.` to indicate to Jade that we
+ only want text in this block, allowing us to omit the pipes:
+
+```
+html
+ body.
+
Title
+
foo bar baz
+```
+
+ Both of these examples yield the same result:
+
+```
+
Title
+
foo bar baz
+
+```
+
+ The same rule applies for anywhere you can have text
+ in jade, raw html is fine:
+
+```
+html
+ body
+ h1 User #{name}
+```
+
+### Doctypes
+
+To add a doctype simply use `!!!`, or `doctype` followed by an optional value:
+
+ !!!
+
+Will output the _transitional_ doctype, however:
+
+ !!! 5
+
+or
+
+ !!! html
+
+or
+
+ doctype html
+
+doctypes are case-insensitive, so the following are equivalent:
+
+ doctype Basic
+ doctype basic
+
+it's also possible to simply pass a doctype literal:
+
+ doctype html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN
+
+yielding:
+
+ ',
+ 'default': '',
+ 'transitional': '',
+ 'strict': '',
+ 'frameset': '',
+ '1.1': '',
+ 'basic': '',
+ 'mobile': ''
+ };
+```
+
+To alter the default simply change:
+
+```javascript
+ jade.doctypes.default = 'whatever you want';
+```
+
+## Filters
+
+Filters are prefixed with `:`, for example `:markdown` and
+pass the following block of text to an arbitrary function for processing. View the _features_
+at the top of this document for available filters.
+
+ body
+ :markdown
+ Woah! jade _and_ markdown, very **cool**
+ we can even link to [stuff](http://google.com)
+
+Renders:
+
+
Woah! jade and markdown, very cool we can even link to stuff
+
+## Code
+
+Jade currently supports three classifications of executable code. The first
+is prefixed by `-`, and is not buffered:
+
+ - var foo = 'bar';
+
+This can be used for conditionals, or iteration:
+
+ - for (var key in obj)
+ p= obj[key]
+
+Due to Jade's buffering techniques the following is valid as well:
+
+ - if (foo)
+ ul
+ li yay
+ li foo
+ li worked
+ - else
+ p oh no! didnt work
+
+Hell, even verbose iteration:
+
+ - if (items.length)
+ ul
+ - items.forEach(function(item){
+ li= item
+ - })
+
+Anything you want!
+
+Next up we have _escaped_ buffered code, which is used to
+buffer a return value, which is prefixed by `=`:
+
+ - var foo = 'bar'
+ = foo
+ h1= foo
+
+Which outputs `bar
bar
`. Code buffered by `=` is escaped
+by default for security, however to output unescaped return values
+you may use `!=`:
+
+ p!= aVarContainingMoreHTML
+
+ Jade also has designer-friendly variants, making the literal JavaScript
+ more expressive and declarative. For example the following assignments
+ are equivalent, and the expression is still regular javascript:
+
+ - var foo = 'foo ' + 'bar'
+ foo = 'foo ' + 'bar'
+
+ Likewise Jade has first-class `if`, `else if`, `else`, `until`, `while`, `unless` among others, however you must remember that the expressions are still regular javascript:
+
+ if foo == 'bar'
+ ul
+ li yay
+ li foo
+ li worked
+ else
+ p oh no! didnt work
+
+## Iteration
+
+ Along with vanilla JavaScript Jade also supports a subset of
+ constructs that allow you to create more designer-friendly templates,
+ one of these constructs is `each`, taking the form:
+
+ each VAL[, KEY] in OBJ
+
+An example iterating over an array:
+
+ - var items = ["one", "two", "three"]
+ each item in items
+ li= item
+
+outputs:
+
+
one
+
two
+
three
+
+iterating an array with index:
+
+ items = ["one", "two", "three"]
+ each item, i in items
+ li #{item}: #{i}
+
+outputs:
+
+
one: 0
+
two: 1
+
three: 2
+
+iterating an object's keys and values:
+
+ obj = { foo: 'bar' }
+ each val, key in obj
+ li #{key}: #{val}
+
+would output `
foo: bar
`
+
+Internally Jade converts these statements to regular
+JavaScript loops such as `users.forEach(function(user){`,
+so lexical scope and nesting applies as it would with regular
+JavaScript:
+
+ each user in users
+ each role in user.roles
+ li= role
+
+ You may also use `for` if you prefer:
+
+ for user in users
+ for role in user.roles
+ li= role
+
+## Conditionals
+
+ Jade conditionals are equivalent to those using the code (`-`) prefix,
+ however allow you to ditch parenthesis to become more designer friendly,
+ however keep in mind the expression given is _regular_ JavaScript:
+
+ for user in users
+ if user.role == 'admin'
+ p #{user.name} is an admin
+ else
+ p= user.name
+
+ is equivalent to the following using vanilla JavaScript literals:
+
+ for user in users
+ - if (user.role == 'admin')
+ p #{user.name} is an admin
+ - else
+ p= user.name
+
+ Jade also provides have `unless` which is equivalent to `if (!(expr))`:
+
+ for user in users
+ unless user.isAnonymous
+ p
+ | Click to view
+ a(href='/users/' + user.id)= user.name
+
+## Template inheritance
+
+ Jade supports template inheritance via the `block` and `extends` keywords. A block is simply a "block" of Jade that may be replaced within a child template, this process is recursive.
+
+ Jade blocks can provide default content if desired, however optional as shown below by `block scripts`, `block content`, and `block foot`.
+
+```
+html
+ head
+ h1 My Site - #{title}
+ block scripts
+ script(src='/jquery.js')
+ body
+ block content
+ block foot
+ #footer
+ p some footer content
+```
+
+ Now to extend the layout, simply create a new file and use the `extends` directive as shown below, giving the path (with or without the .jade extension). You may now define one or more blocks that will override the parent block content, note that here the `foot` block is _not_ redefined and will output "some footer content".
+
+```
+extends extend-layout
+
+block scripts
+ script(src='/jquery.js')
+ script(src='/pets.js')
+
+block content
+ h1= title
+ each pet in pets
+ include pet
+```
+
+ It's also possible to override a block to provide additional blocks, as shown in the following example where `content` now exposes a `sidebar` and `primary` block for overriding, or the child template could override `content` all together.
+
+```
+extends regular-layout
+
+block content
+ .sidebar
+ block sidebar
+ p nothing
+ .primary
+ block primary
+ p nothing
+```
+
+## Includes
+
+ Includes allow you to statically include chunks of Jade,
+ or other content like css, or html which lives in separate files. The classical example is including a header and footer. Suppose we have the following directory structure:
+
+ ./layout.jade
+ ./includes/
+ ./head.jade
+ ./tail.jade
+
+and the following _layout.jade_:
+
+ html
+ include includes/head
+ body
+ h1 My Site
+ p Welcome to my super amazing site.
+ include includes/foot
+
+both includes _includes/head_ and _includes/foot_ are
+read relative to the `filename` option given to _layout.jade_,
+which should be an absolute path to this file, however Express does this for you. Include then parses these files, and injects the AST produced to render what you would expect:
+
+```html
+
+
+ My Site
+
+
+
+
My Site
+
Welcome to my super lame site.
+
+
+
+```
+
+ As mentioned `include` can be used to include other content
+ such as html or css. By providing an extension Jade will not
+ assume that the file is Jade source and will include it as
+ a literal:
+
+```
+html
+ body
+ include content.html
+```
+
+ Include directives may also accept a block, in which case the
+ the given block will be appended to the _last_ block defined
+ in the file. For example if `head.jade` contains:
+
+```
+head
+ script(src='/jquery.js')
+```
+
+ We may append values by providing a block to `include head`
+ as shown below, adding the two scripts.
+
+```
+html
+ include head
+ script(src='/foo.js')
+ script(src='/bar.js')
+ body
+ h1 test
+```
+
+
+## Mixins
+
+ Mixins are converted to regular JavaScript functions in
+ the compiled template that Jade constructs. Mixins may
+ take arguments, though not required:
+
+ mixin list
+ ul
+ li foo
+ li bar
+ li baz
+
+ Utilizing a mixin without args looks similar, just without a block:
+
+ h2 Groceries
+ mixin list
+
+ Mixins may take one or more arguments as well, the arguments
+ are regular javascripts expressions, so for example the following:
+
+ mixin pets(pets)
+ ul.pets
+ - each pet in pets
+ li= pet
+
+ mixin profile(user)
+ .user
+ h2= user.name
+ mixin pets(user.pets)
+
+ Would yield something similar to the following html:
+
+```html
+
+
tj
+
+
tobi
+
loki
+
jane
+
manny
+
+
+```
+
+## Generated Output
+
+ Suppose we have the following Jade:
+
+```
+- var title = 'yay'
+h1.title #{title}
+p Just an example
+```
+
+ When the `compileDebug` option is not explicitly `false`, Jade
+ will compile the function instrumented with `__.lineno = n;`, which
+ in the event of an exception is passed to `rethrow()` which constructs
+ a useful message relative to the initial Jade input.
+
+```js
+function anonymous(locals) {
+ var __ = { lineno: 1, input: "- var title = 'yay'\nh1.title #{title}\np Just an example", filename: "testing/test.js" };
+ var rethrow = jade.rethrow;
+ try {
+ var attrs = jade.attrs, escape = jade.escape;
+ var buf = [];
+ with (locals || {}) {
+ var interp;
+ __.lineno = 1;
+ var title = 'yay'
+ __.lineno = 2;
+ buf.push('
');
+ }
+ return buf.join("");
+ } catch (err) {
+ rethrow(err, __.input, __.filename, __.lineno);
+ }
+}
+```
+
+When the `compileDebug` option _is_ explicitly `false`, this instrumentation
+is stripped, which is very helpful for light-weight client-side templates. Combining Jade's options with the `./runtime.js` file in this repo allows you
+to toString() compiled templates and avoid running the entire Jade library on
+the client, increasing performance, and decreasing the amount of JavaScript
+required.
+
+```js
+function anonymous(locals) {
+ var attrs = jade.attrs, escape = jade.escape;
+ var buf = [];
+ with (locals || {}) {
+ var interp;
+ var title = 'yay'
+ buf.push('
Activate CoffeeScript in the browser by having it compile and evaluate
+all script tags with a content-type of text/coffeescript.
+This happens on page load.
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/cake.html b/node_modules/jade/support/coffee-script/documentation/docs/cake.html
new file mode 100644
index 0000000..7189e51
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/cake.html
@@ -0,0 +1,43 @@
+ cake.coffee
cake is a simplified version of Make
+(Rake, Jake)
+for CoffeeScript. You define tasks with names and descriptions in a Cakefile,
+and can call them from the command line, or invoke them from other tasks.
+
+
Running cake with no arguments will print out a list of all the tasks in the
+current directory's Cakefile.
Define an option that the Cakefile accepts. The parsed options hash,
+containing all of the command-line options passed, will be made available
+as the first argument to the action.
Run cake. Executes all of the tasks you pass, in order. Note that Node's
+asynchrony may cause tasks to execute in a different order than you'd expect.
+If no tasks are passed, print the help screen.
exports.run = ->
+ path.exists'Cakefile',(exists)->
+ thrownewError("Cakefile not found in #{process.cwd()}")unlessexists
+ args = process.argv[2...process.argv.length]
+ CoffeeScript.runfs.readFileSync('Cakefile').toString(),fileName:'Cakefile'
+ oparse = newoptparse.OptionParserswitches
+ returnprintTasks()unlessargs.length
+ options = oparse.parse(args)
+ invokeargforarginoptions.arguments
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/coffee-script.html b/node_modules/jade/support/coffee-script/documentation/docs/coffee-script.html
new file mode 100644
index 0000000..36b3849
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/coffee-script.html
@@ -0,0 +1,50 @@
+ coffee-script.coffee
CoffeeScript can be used both on the server, as a command-line compiler based
+on Node.js/V8, or to run CoffeeScripts directly in the browser. This module
+contains the main entry functions for tokenzing, parsing, and compiling source
+CoffeeScript into JavaScript.
+
+
If included on a webpage, it will automatically sniff out, compile, and
+execute all scripts present in text/coffeescript tags.
Tokenize and parse a string of CoffeeScript code, and return the AST. You can
+then compile it by calling .compile() on the root, or traverse it by using
+.traverse() with a callback.
The real Lexer produces a generic stream of tokens. This object provides a
+thin wrapper around it, compatible with the Jison API. We can then pass it
+directly as a "Jison lexer".
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/command.html b/node_modules/jade/support/coffee-script/documentation/docs/command.html
new file mode 100644
index 0000000..d870c91
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/command.html
@@ -0,0 +1,148 @@
+ command.coffee
The coffee utility. Handles command-line compilation of CoffeeScript
+into various forms: saved into .js files or printed to stdout, piped to
+JSLint or recompiled every time the source is
+saved, printed as a token stream or as the syntax tree, or launch an
+interactive REPL.
The list of all the valid option flags that coffee knows how to handle.
SWITCHES = [
+ ['-c','--compile','compile to JavaScript and save as .js files']
+ ['-i','--interactive','run an interactive CoffeeScript REPL']
+ ['-o','--output [DIR]','set the directory for compiled JavaScript']
+ ['-w','--watch','watch scripts for changes, and recompile']
+ ['-p','--print','print the compiled JavaScript to stdout']
+ ['-l','--lint','pipe the compiled JavaScript through JSLint']
+ ['-s','--stdio','listen for and compile scripts over stdio']
+ ['-e','--eval','compile a string from the command line']
+ ['-r','--require [FILE*]','require a library before executing your script']
+ ['--no-wrap','compile without the top-level function wrapper']
+ ['-t','--tokens','print the tokens that the lexer produces']
+ ['-n','--nodes','print the parse tree that Jison produces']
+ ['-v','--version','display CoffeeScript version']
+ ['-h','--help','display this help message']
+]
Run coffee by parsing passed options and determining what action to take.
+Many flags cause us to divert before compiling anything. Flags passed after
+-- will be passed verbatim to your script as arguments in process.argv
Asynchronously read in each CoffeeScript in a list of source files and
+compile them. If a directory is passed, recursively compile all
+'.coffee' extension source files in it and all subdirectories.
Compile a single source script, containing the given code, according to the
+requested options. If evaluating the script directly sets __filename,
+__dirname and module.filename to be correct relative to the script's path.
Watch a source CoffeeScript file using fs.watchFile, recompiling it every
+time the file is updated. May be used in combination with other options,
+such as --lint or --print.
Write out a JavaScript source file with the compiled code. By default, files
+are written out in cwd as .js files with the same name, but the output
+directory can be customized with --output.
The CoffeeScript parser is generated by Jison
+from this grammar file. Jison is a bottom-up parser generator, similar in
+style to Bison, implemented in JavaScript.
+It can recognize LALR(1), LR(0), SLR(1), and LR(1)
+type grammars. To create the Jison parser, we list the pattern to match
+on the left-hand side, and the action to take (usually the creation of syntax
+tree nodes) on the right. As the parser runs, it
+shifts tokens from our token stream, from left to right, and
+attempts to match
+the token sequence against the rules below. When a match can be made, it
+reduces into the nonterminal
+(the enclosing name at the top), and we proceed from there.
+
+
If you run the cake build:parser command, Jison constructs a parse table
+from our rules and saves it into lib/parser.js.
Since we're going to be wrapped in a function by Jison in any case, if our
+action immediately returns a value, we can optimize by removing the function
+wrapper and just returning the value directly.
Our handy DSL for Jison grammar generation, thanks to
+Tim Caswell. For every rule in the grammar,
+we pass the pattern-defining string, the action to run, and extra options,
+optionally. If no action is specified, we simply pass the value of the
+previous nonterminal.
In all of the rules that follow, you'll see the name of the nonterminal as
+the key to a list of alternative matches. With each match's action, the
+dollar-sign variables are provided by Jison as references to the value of
+their numeric position, so in this rule:
+
+
"Expression UNLESS Expression"
+
+
+
$1 would be the value of the first Expression, $2 would be the token
+for the UNLESS terminal, and $3 would be the value of the second
+Expression.
All the different types of expressions in our language. The basic unit of
+CoffeeScript is the Expression -- everything that can be an expression
+is one. Expressions serve as the building blocks of many other rules, making
+them somewhat circular.
The Code node is the function literal. It's defined by an indented block
+of Expressions preceded by a function arrow, with an optional parameter
+list.
The ArgList is both the list of objects passed into a function call,
+as well as the contents of an array literal
+(i.e. comma-separated expressions). Newlines work as well.
Just simple, comma-separated, required arguments (no fancy syntax). We need
+this to be separate from the ArgList for use in Switch blocks, where
+having the newlines wouldn't make sense.
Parenthetical expressions. Note that the Parenthetical is a Value,
+not an Expression, so if you need to use an expression in a place
+where only values are accepted, wrapping it in parentheses will always do
+the trick.
Parenthetical:[
+ o"( Line )",->newParentheticalNode$2
+ o"( )",->newParentheticalNodenewLiteralNode''
+ ]
Array, object, and range comprehensions, at the most generic level.
+Comprehensions can either be normal, with a block of expressions to execute,
+or postfix, with a single expression.
An array or range comprehension has variables for the current element and
+(optional) reference to the current index. Or, key, value, in the case
+of object comprehensions.
The source of a comprehension is an array or object with an optional guard
+clause. If it's an array comprehension, you can also choose to step through
+in fixed-size increments.
Arithmetic and logical operators, working on one or more operands.
+Here they are grouped by order of precedence. The actual precedence rules
+are defined at the bottom of the page. It would be shorter if we could
+combine most of these rules into a single generic Operand OpSymbol Operand
+-type rule, but in order to make the precedence binding possible, separate
+rules are necessary.
Finally, now what we have our grammar and our operators, we can create
+our Jison.Parser. We do this by processing all of our rules, recording all
+terminals (every symbol which does not appear as the name of a rule above)
+as "tokens".
Initialize the Parser with our list of terminal tokens, our grammar
+rules, and the name of the root. Reverse the operators because Jison orders
+precedence from low to high, and we have it high to low
+(as in Yacc).
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/helpers.html b/node_modules/jade/support/coffee-script/documentation/docs/helpers.html
new file mode 100644
index 0000000..d3bc7ad
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/helpers.html
@@ -0,0 +1,37 @@
+ helpers.coffee
This file contains the common helper functions that we'd like to share among
+the Lexer, Rewriter, and the Nodes. Merge objects, flatten
+arrays, count characters, that sort of thing.
Merge objects, returning a fresh copy with attributes from both sides.
+Used every time BaseNode#compile is called, to allow properties in the
+options hash to propagate down the tree without polluting other branches.
Delete a key from an object, returning the value. Useful when a node is
+looking for a particular method in an options hash.
helpers.del = del = (obj,key)->
+ val = obj[key]
+ deleteobj[key]
+ val
+
+
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/index.html b/node_modules/jade/support/coffee-script/documentation/docs/index.html
new file mode 100644
index 0000000..4dcd19c
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/index.html
@@ -0,0 +1,3 @@
+ index.coffee
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/lexer.html b/node_modules/jade/support/coffee-script/documentation/docs/lexer.html
new file mode 100644
index 0000000..fc3d1f5
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/lexer.html
@@ -0,0 +1,431 @@
+ lexer.coffee
The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt
+matches against the beginning of the source code. When a match is found,
+a token is produced, we consume the match, and start again. Tokens are in the
+form:
+
+
[tag, value, lineNumber]
+
+
+
Which is a format that can be fed directly into Jison.
The Lexer class reads a stream of CoffeeScript and divvys it up into tagged
+tokens. Some potential ambiguity in the grammar has been avoided by
+pushing some extra smarts into the Lexer.
tokenize is the Lexer's main method. Scan by attempting to match tokens
+one at a time, using a regular expression anchored at the start of the
+remaining code, or a custom recursive token-matching method
+(for interpolations). When the next token has been recorded, we move forward
+within the code past the token, and begin again.
+
+
Each tokenizing method is responsible for incrementing @i by the number of
+characters it has consumed. @i can be thought of as our finger on the page
+of source.
+
+
Before returning the token stream, run it through the Rewriter
+unless explicitly asked not to.
tokenize:(code,options)->
+ code = code.replace/(\r|\s+$)/g,''
+ o = optionsor{}
+ @code = code# The remainder of the source code.
+ @i = 0# Current character position we're parsing.
+ @line = o.lineor0# The current line.
+ @indent = 0# The current indentation level.
+ @indebt = 0# The over-indentation at the current level.
+ @outdebt = 0# The under-outdentation at the current level.
+ @indents = []# The stack of all current indentation levels.
+ @tokens = []# Stream of parsed tokens in the form ['TYPE', value, line]
+ while@i<@code.length
+ @chunk = @code[@i..]
+ @extractNextToken()
+ @closeIndentation()
+ return@tokensifo.rewriteisoff
+ (newRewriter).rewrite@tokens
At every position, run through this list of attempted matches,
+short-circuiting if any of them succeed. Their order determines precedence:
+@literalToken is the fallback catch-all.
Matches identifying literals: variables, keywords, method names, etc.
+Check to ensure that JavaScript reserved words aren't being used as
+identifiers. Because CoffeeScript reserves a handful of keywords that are
+allowed in JavaScript, we're careful not to tag them as keywords when
+referenced as property names here, so you can still do jQuery.is() even
+though is means === otherwise.
identifierToken:->
+ returnfalseunlessid = @matchIDENTIFIER,1
+ @i+=id.length
+ forcedIdentifier = @tagAccessor()or@matchASSIGNED,1
+ tag = 'IDENTIFIER'
+ tag = id.toUpperCase()ifinclude(JS_KEYWORDS,id)or(notforcedIdentifierandinclude(COFFEE_KEYWORDS,id))
+ tag = 'LEADING_WHEN'iftagis'WHEN'andincludeLINE_BREAK,@tag()
+ tag = 'ALL'ifidis'all'and@tag()is'FOR'
+ tag = 'UNARY'ifincludeUNARY,tag
+ ifinclude(JS_FORBIDDEN,id)
+ ifforcedIdentifier
+ tag = 'STRING'
+ id = "\"#{id}\""
+ ifforcedIdentifieris'accessor'
+ close_index = true
+ @tokens.pop()if@tag()isnt'@'
+ @token'INDEX_START','['
+ elseifinclude(RESERVED,id)
+ @identifierErrorid
+ unlessforcedIdentifier
+ tag = id = CONVERSIONS[id]ifincludeCOFFEE_ALIASES,id
+ tag = 'LOGIC'ifincludeLOGIC,id
+ tag = 'UNARY'ifidis'!'
+ @tokentag,id
+ @token']',']'ifclose_index
+ true
Matches strings, including multi-line strings. Ensures that quotation marks
+are balanced within the string's contents, and within nested interpolations.
Matches regular expression literals. Lexing regular expressions is difficult
+to distinguish from division, so we borrow some basic heuristics from
+JavaScript and Ruby, borrow slash balancing from @balancedToken, and
+borrow interpolation from @interpolateString.
Matches newlines, indents, and outdents, and determines which is which.
+If we can detect that the current line is continued onto the the next line,
+then the newline is suppressed:
+
+
elements
+ .each( ... )
+ .map( ... )
+
+
+
Keeps track of the level of indentation, because a single outdent token
+can close multiple indents, so we need to know how far in we happen to be.
We treat all other single characters as a token. Eg.: ( ) , . !
+Multi-character operators are also literal tokens, so that Jison can assign
+the proper order of operations. There are some symbols that we tag specially
+here. ; and newlines are both treated as a TERMINATOR, we distinguish
+parentheses that indicate a method call from regular parentheses, and so on.
As we consume a new IDENTIFIER, look at the previous token to determine
+if it's a special kind of accessor. Return true if any type of accessor
+is the previous token.
A source of ambiguity in our grammar used to be parameter lists in function
+definitions versus argument lists in function calls. Walk backwards, tagging
+parameters specially in order to make things easier for the parser.
Matches a balanced group such as a single or double-quoted string. Pass in
+a series of delimiters, all of which must be nested correctly within the
+contents of the string. This method allows us to have strings within
+interpolations within strings, ad infinitum.
Expand variables and expressions inside double-quoted strings using
+ECMA Harmony's interpolation syntax
+for substitution of bare variables as well as arbitrary expressions.
+
+
"Hello #{name.capitalize()}."
+
+
+
If it encounters an interpolation, this method will recursively create a
+new Lexer, tokenize the interpolated contents, and merge them into the
+token stream.
CoffeeScript-only keywords, which we're more relaxed about allowing. They can't
+be used standalone, but you can reference them as an attached property.
The list of keywords that are reserved by JavaScript, but not used, or are
+used by CoffeeScript internally. We throw an error when these are encountered,
+to avoid having a JavaScript error at runtime.
Tokens which could legitimately be invoked or indexed. A opening
+parentheses or bracket following these tokens will be recorded as the start
+of a function invocation or indexing operation.
Tokens that, when immediately preceding a WHEN, indicate that the WHEN
+occurs at the start of a line. We disambiguate these from trailing whens to
+avoid an ambiguity in the grammar.
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/nodes.html b/node_modules/jade/support/coffee-script/documentation/docs/nodes.html
new file mode 100644
index 0000000..181e035
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/nodes.html
@@ -0,0 +1,1245 @@
+ nodes.coffee
nodes.coffee contains all of the node classes for the syntax tree. Most
+nodes are created as the result of actions in the grammar,
+but some are created by other nodes as a method of code generation. To convert
+the syntax tree into a string of JavaScript code, call compile() on the root.
The BaseNode is the abstract base class for all nodes in the syntax tree.
+Each subclass implements the compileNode method, which performs the
+code generation for that node. To compile a node to JavaScript,
+call compile on it, which wraps compileNode in some generic extra smarts,
+to know when the generated code needs to be wrapped up in a closure.
+An options hash is passed and cloned throughout, containing information about
+the environment from higher in the tree (such as if a returned value is
+being requested by the surrounding function), information about the current
+scope, and indentation level.
Common logic for determining whether to wrap this node in a closure before
+compiling it, or to compile directly. We need to wrap if this node is a
+statement, and it's not a pureStatement, and we're not at
+the top level of a block (which would be unnecessary), and we haven't
+already been asked to return the result (because statements know how to
+return results).
+
+
If a Node is topSensitive, that means that it needs to compile differently
+depending on whether it's being used as part of a larger expression, or is a
+top-level statement within the function body.
If the code generation wishes to use the result of a complex expression
+in multiple places, ensure that the expression is only ever evaluated once,
+by assigning it to a temporary variable.
Construct a node that returns the current node's result.
+Note that this is overridden for smarter behavior for
+many statement nodes (eg IfNode, ForNode)...
Does this node, or any of its children, contain a node of a certain kind?
+Recursively traverses down the children of the nodes, yielding to a block
+and returning true when the block finds a match. contains does not cross
+scope boundaries.
The expressions body is the list of expressions that forms the body of an
+indented block of code -- the implementation of a function, a clause in an
+if, switch, or try, and so on...
If we happen to be the top-level Expressions, wrap everything in
+a safety closure, unless requested not to.
+It would be better not to generate them in the first place, but for now,
+clean up obvious double-parentheses.
Compiles a single expression within the expressions body. If we need to
+return the result, and it's an expression, simply return it. If it's a
+statement, ask the statement to do so.
If the value node has indexes containing function calls, and the value node
+needs to be used twice, in compound assignment ... then we need to cache
+the value of the indexes.
We compile a value to JavaScript by compiling and joining each property.
+Things get much more insteresting if the chain of properties has soak
+operators ?. interspersed. Then we have to take care not to accidentally
+evaluate a anything twice when building the soak chain.
If you call a function with a splat, it's converted into a JavaScript
+.apply() call to allow an array of arguments to be passed.
+If it's a constructor, then things get real tricky. We have to inject an
+inner constructor in order to be able to pass the varargs.
A range literal. Ranges can be used to extract portions (slices) of arrays,
+to specify a range for comprehensions, or as a value, to be expanded into the
+corresponding array of integers at runtime.
An array slice literal. Unlike JavaScript's Array#slice, the second parameter
+specifies the index of the end of the slice, just as the first parameter
+is the index of the beginning.
Instead of generating the JavaScript string directly, we build up the
+equivalent syntax tree and compile that, in pieces. You can see the
+constructor, property assignments, and inheritance getting built out below.
Compile an assignment, delegating to compilePatternMatch or
+compileSplice if appropriate. Keep track of the name of the base object
+we've been assigned to, for correct internal references. If the variable
+has not been seen yet within the current scope, declare it.
Brief implementation of recursive pattern matching, when assigning array or
+object literals to a value. Peeks at their properties to assign inner names.
+See the ECMAScript Harmony Wiki
+for details.
idx = i
+ if@variable.isObject()
+ ifobjinstanceofAssignNode
A function definition. This is the only node that creates a new Scope.
+When for the purposes of walking the contents of a function body, the CodeNode
+has no children -- they're within the inner scope.
Compilation creates a new scope unless explicitly asked to share with the
+outer scope. Handles splat parameters in the parameter list by peeking at
+the JavaScript arguments objects. If the function is bound with the =>
+arrow, generates a wrapper that saves the current value of this through
+a closure.
A parameter in a function definition. Beyond a typical Javascript parameter,
+these parameters can also attach themselves to the context of the function,
+as well as be a splat, gathering up a group of parameters into an array.
A while loop, the only sort of low-level loop exposed by CoffeeScript. From
+it, all other loops can be manufactured. Useful in cases where you need more
+flexibility or more speed than a comprehension can provide.
The main difference from a JavaScript while is that the CoffeeScript
+while can be used as a part of a larger expression -- while loops may
+return an array containing the computed result of each iteration.
When compiling a conditional assignment, take care to ensure that the
+operands are only evaluated once, even though we have to reference them
+more than once.
Checks a variable for existence -- not null and not undefined. This is
+similar to .nil? in Ruby, and avoids having to consult a JavaScript truth
+table.
The meat of the ExistenceNode is in this static compileTest method
+because other nodes like to check the existence of their variables as well.
+Be careful not to double-evaluate anything.
An extra set of parentheses, specified explicitly in the source. At one time
+we tried to clean up the results by detecting and removing redundant
+parentheses, but no longer -- you can put in as many as you please.
+
+
Parentheses are a good way to force any statement to become an expression.
CoffeeScript's replacement for the for loop is our array and object
+comprehensions, that compile into for loops here. They also act as an
+expression, able to return the result of each filtered iteration.
+
+
Unlike Python array comprehensions, they can be multi-line, and you can pass
+the current index of the loop as a second parameter. Unlike Ruby blocks,
+you can map and filter in a single pass.
Welcome to the hairiest method in all of CoffeeScript. Handles the inner
+loop, filtering, stepping, and result saving for array, object, and range
+comprehensions. Some of the generated code can be shared in common, and
+some cannot.
If/else statements. Acts as an expression by pushing down requested returns
+to the last line of each clause.
+
+
Single-expression IfNodes are compiled into ternary operators if possible,
+because ternaries are already proper expressions, and don't need conversion.
Faux-nodes are never created by the grammar, but are used during code
+generation to generate other combinations of nodes. The PushNode creates
+the tree for array.push(value), which is helpful for recording the result
+arrays from comprehensions.
Wrap the expressions body, unless it contains a pure statement,
+in which case, no dice. If the body mentions this or arguments,
+then make sure that the closure wrapper preserves the original values.
Helper for ensuring that utility functions are assigned at the top level.
undefined
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/optparse.html b/node_modules/jade/support/coffee-script/documentation/docs/optparse.html
new file mode 100644
index 0000000..8b59e3c
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/optparse.html
@@ -0,0 +1,75 @@
+ optparse.coffee
Parse the list of arguments, populating an options object with all of the
+specified options, and returning it. options.arguments will be an array
+containing the remaning non-option arguments. This is a simpler API than
+many option parsers that allow you to attach callback actions for every
+flag. Instead, you're responsible for interpreting the options object.
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/repl.html b/node_modules/jade/support/coffee-script/documentation/docs/repl.html
new file mode 100644
index 0000000..3b64130
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/repl.html
@@ -0,0 +1,23 @@
+ repl.coffee
A very simple Read-Eval-Print-Loop. Compiles one line at a time to JavaScript
+and evaluates it. Good for simple tests, or poking around the Node.js API.
+Using it looks like this:
+
+
coffee> puts "#{num} bottles of beer" for num in [99..1]
+
The main REPL function. run is called every time a line of code is entered.
+Attempt to evaluate the command. If there's an exception, print it out instead
+of exiting.
run = (buffer)->
+ try
+ val = CoffeeScript.evalbuffer.toString(),noWrap:true,globals:true,fileName:'repl'
+ putsinspectvalifvalisntundefined
+ catcherr
+ putserr.stackorerr.toString()
+ repl.prompt()
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/rewriter.html b/node_modules/jade/support/coffee-script/documentation/docs/rewriter.html
new file mode 100644
index 0000000..40a9394
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/rewriter.html
@@ -0,0 +1,265 @@
+ rewriter.coffee
The CoffeeScript language has a good deal of optional syntax, implicit syntax,
+and shorthand syntax. This can greatly complicate a grammar and bloat
+the resulting parse table. Instead of making the parser handle it all, we take
+a series of passes over the token stream, using this Rewriter to convert
+shorthand into the unambiguous long form, add implicit indentation and
+parentheses, balance incorrect nestings, and generally clean things up.
Rewrite the token stream in multiple passes, one logical filter at
+a time. This could certainly be changed into a single pass through the
+stream, with a big ol' efficient switch, but it's much nicer to work with
+like this. The order of these passes matters -- indentation must be
+corrected before implicit parentheses can be wrapped around blocks of code.
Rewrite the token stream, looking one token ahead and behind.
+Allow the return value of the block to tell us how many tokens to move
+forwards (or backwards) in the stream, to make sure we don't miss anything
+as tokens are inserted and removed, and the stream changes length under
+our feet.
The lexer has tagged the opening parenthesis of a method call. Match it with
+its paired close. We have the mis-nested outdent case included here for
+calls that close on the same line, just before their outdent.
Methods may be optionally called without parentheses, for simple cases.
+Insert the implicit parentheses here, so that the parser doesn't have to
+deal with them.
Because our grammar is LALR(1), it can't handle some single-line
+expressions that lack ending delimiters. The Rewriter adds the implicit
+blocks, so it doesn't need to. ')' can close a single-line block,
+but we need to make sure it's balanced.
In order to accomplish this, move outdents that follow closing parens
+inwards, safely. The steps to accomplish this are:
+
+
+
Check that all paired tokens are balanced and in order.
+
Rewrite the stream with a stack: if you see an EXPRESSION_START, add it
+to the stack. If you see an EXPRESSION_END, pop the stack and replace
+it with the inverse of what we've just popped.
+
Keep track of "debt" for tokens that we manufacture, to make sure we end
+up balanced in the end.
+
Be careful not to alter array or parentheses delimiters with overzealous
+rewriting.
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/scope.html b/node_modules/jade/support/coffee-script/documentation/docs/scope.html
new file mode 100644
index 0000000..661d5b3
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/scope.html
@@ -0,0 +1,57 @@
+ scope.coffee
The Scope class regulates lexical scoping within CoffeeScript. As you
+generate code, you create a tree of scopes in the same shape as the nested
+function bodies. Each scope knows about the variables declared within it,
+and has a reference to its parent enclosing scope. In this way, we know which
+variables are new and need to be declared with var, and which are shared
+with the outside.
Initialize a scope with its parent, for lookups up the chain,
+as well as a reference to the Expressions node is belongs to, which is
+where it should declare its variables, and a reference to the function that
+it wraps.
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/docs/underscore.html b/node_modules/jade/support/coffee-script/documentation/docs/underscore.html
new file mode 100644
index 0000000..d812711
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/docs/underscore.html
@@ -0,0 +1,296 @@
+ underscore.coffee
Underscore.coffee
+(c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
+Underscore is freely distributable under the terms of the
+MIT license.
+Portions of Underscore are inspired by or borrowed from
+Prototype.js, Oliver Steele's
+Functional, and John Resig's
+Micro-Templating.
+For all details and documentation:
+http://documentcloud.github.com/underscore/
_.detect = (obj,iterator,context)->
+ result = null
+ _.eachobj,(value,index,list)->
+ ifiterator.callcontext,value,index,list
+ result = value
+ _.breakLoop()
+ result
Get the first element of an array. Passing n will return the first N
+values in the array. Aliased as head. The guard check allows it to work
+with map.
Returns everything but the first entry of the array. Aliased as tail.
+Especially useful on the arguments object. Passing an index will return
+the rest of the values in the array from that index onward. The guard
+check allows it to work with map.
If the browser doesn't supply us with indexOf (I'm looking at you, MSIE),
+we need this function. Return the position of the first occurence of an
+item in an array, or -1 if the item is not included in the array.
Returns the first function passed as an argument to the second,
+allowing you to adjust arguments, run code before and after, and
+conditionally execute the original function.
Invokes interceptor with the obj, and then returns obj.
+The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain.
JavaScript templating a-la ERB, pilfered from John Resig's
+Secrets of the JavaScript Ninja, page 83.
+Single-quote fix from Rick Strahl.
+With alterations for arbitrary delimiters, and to preserve whitespace.
If Underscore is called as a function, it returns a wrapped object that
+can be used OO-style. This wrapper holds altered versions of all the
+underscore functions. Wrapped objects may be chained.
+ CoffeeScript is a little language that compiles into JavaScript. Think
+ of it as JavaScript's less ostentatious kid brother — the same genes,
+ roughly the same height, but a different sense of style. Apart from a handful of
+ bonus goodies, statements in CoffeeScript correspond one-to-one with their
+ equivalent in JavaScript, it's just another way of saying it.
+
+
+
+ Disclaimer:
+ CoffeeScript is just for fun. Until it reaches 1.0, there are no guarantees
+ that the syntax won't change between versions. That said,
+ it compiles into clean JavaScript (the good parts) that can use existing
+ JavaScript libraries seamlessly, and passes through
+ JSLint without warnings. The compiled
+ output is pretty-printed and quite readable.
+
CoffeeScript on the left, compiled JavaScript output on the right.
+
+ <%= code_for('overview', 'cubes') %>
+
+
+ For a longer CoffeeScript example, check out
+ Underscore.coffee, a port
+ of the Underscore.js
+ library of helper functions. Underscore.coffee can pass the entire Underscore.js
+ test suite. The CoffeeScript version is faster than the original for a number
+ of methods (in general, due to the speed of CoffeeScript's array comprehensions), and
+ after being minified and gzipped, is only 241 bytes larger than the original
+ JavaScript version.
+ Additional examples are included in the source repository, inside the
+ examples folder.
+
+
+
+
+ Installation and Usage
+
+
+
+ The CoffeeScript compiler is written in pure CoffeeScript, using a
+ small DSL
+ on top of the Jison parser generator, and is available
+ as a Node.js utility. The core compiler however,
+ does not depend on Node, and can be run in other server-side-JavaScript environments,
+ or in the browser (see "Try CoffeeScript", above).
+
+
+
+ To install, first make sure you have a working copy of the latest tagged version of
+ Node.js, currently 0.1.102 or higher.
+ Then clone the CoffeeScript
+ source repository
+ from GitHub, or download the latest
+ release: 0.9.4.
+ To install the CoffeeScript compiler system-wide
+ under /usr/local, open the directory and run:
+
+
+
+sudo bin/cake install
+
+
+ Alternatively, if you already have the
+ Node Package Manager installed,
+ you can use that to grab the latest CoffeeScript:
+
+
+
+sudo npm install coffee-script
+
+
+ Both of these provide the coffee command, which will execute CoffeeScripts
+ under Node.js by default, but is also used to compile CoffeeScript
+ .coffee files into JavaScript, or to run an an interactive REPL.
+ When compiling to JavaScript, coffee writes the output
+ as .js files in the same directory by default, but output
+ can be customized with the following options:
+
+
+
+
+
-c, --compile
+
+ Compile a .coffee script into a .js JavaScript file
+ of the same name.
+
+
+
+
-i, --interactive
+
+ Launch an interactive CoffeeScript session to try short snippets.
+ More pleasant if wrapped with
+ rlwrap.
+
+
+
+
-o, --output [DIR]
+
+ Write out all compiled JavaScript files into the specified directory.
+ Use in conjunction with --compile or --watch.
+
+
+
+
-w, --watch
+
+ Watch the modification times of the coffee-scripts, recompiling as
+ soon as a change occurs.
+
+
+
+
-p, --print
+
+ Instead of writing out the JavaScript as a file, print it
+ directly to stdout.
+
+
+
+
-l, --lint
+
+ If the jsl
+ (JavaScript Lint)
+ command is installed, use it
+ to check the compilation of a CoffeeScript file. (Handy in
+ conjunction with --watch)
+
+
+
+
-s, --stdio
+
+ Pipe in CoffeeScript to STDIN and get back JavaScript over STDOUT.
+ Good for use with processes written in other languages. An example:
+ cat src/cake.coffee | coffee -sc
+
+
+
+
-e, --eval
+
+ Compile and print a little snippet of CoffeeScript directly from the
+ command line. For example: coffee -e "puts num for num in [10..1]"
+
+
+
+
-r, --require
+
+ Load a library before compiling or executing your script. Can be used
+ to hook in to the compiler (to add Growl notifications, for example).
+
+
+
+
-b, --bare
+
+ Compile the JavaScript without the top-level function safety wrapper.
+ (Used for CoffeeScript as a Node.js module.)
+
+
+
+
-t, --tokens
+
+ Instead of parsing the CoffeeScript, just lex it, and print out the
+ token stream: [IDENTIFIER square] [ASSIGN =] [PARAM_START (] ...
+
+
+
+
-n, --nodes
+
+ Instead of compiling the CoffeeScript, just lex and parse it, and print
+ out the parse tree:
+
+Expressions
+ Assign
+ Value "square"
+ Code "x"
+ Op *
+ Value "x"
+ Value "x"
+
+ This reference is structured so that it can be read from top to bottom,
+ if you like. Later sections use ideas and syntax previously introduced.
+ Familiarity with JavaScript is assumed.
+ In all of the following examples, the source CoffeeScript is provided on
+ the left, and the direct compilation into JavaScript is on the right.
+
+
+
+
+
+ Many of the examples can be run (where it makes sense) by pressing the "run"
+ button towards the bottom right. You can also paste examples into
+ "Try CoffeeScript" in the toolbar, and play with them from there.
+
+
+
+ Significant Whitespace
+ CoffeeScript uses Python-style significant whitespace: You don't need to
+ use semicolons ; to terminate expressions, ending
+ the line will do just as well. Semicolons can still be used to fit
+ multiple expressions onto a single line. Instead of using curly braces
+ { } to delimit blocks of code (like functions,
+ if-statements,
+ switch, and try/catch),
+ use indentation.
+
+
+
+ You don't need to use parentheses to invoke a function if you're passing
+ arguments: print "coffee". Implicit parentheses wrap forwards
+ to the end of the line, or block expression.
+
+
+
+ You can use newlines to break up your expression into smaller pieces,
+ as long as CoffeeScript can determine that the line hasn't finished yet,
+ because it ends with an operator or a dot ... seen most commonly
+ in jQuery-chaining style JavaScript.
+
+
+
+
+ Functions and Invocation
+ Functions are defined by a list of parameters, an arrow, and the
+ function body. The empty function looks like this: ->
+
+ <%= code_for('functions', 'cube(5)') %>
+
+
+
+ Objects and Arrays
+ Object and Array literals look very similar to their JavaScript cousins.
+ When you spread out each property on a separate line, the commas are
+ optional. Implicit objects may be created with indentation instead of
+ brackets, winding up looking quite similar to YAML.
+
+ In JavaScript, you can't use reserved words, like class, as properties
+ of an object, without quoting them as strings. CoffeeScript notices and quotes
+ them for you, so you don't have to worry about it (say, when using jQuery).
+
+ <%= code_for('objects_reserved') %>
+
+
+
+ Lexical Scoping and Variable Safety
+ The CoffeeScript compiler takes care to make sure that all of your variables
+ are properly declared within lexical scope — you never need to write
+ var yourself.
+
+ <%= code_for('scope', 'inner') %>
+
+ Notice how all of the variable declarations have been pushed up to
+ the top of the closest scope, the first time they appear.
+ outer is not redeclared within the inner function, because it's
+ already in scope; inner within the function, on the other hand,
+ should not be able to change the value of the external variable of the same name, and
+ therefore has a declaration of its own.
+
+
+ This behavior is effectively identical to Ruby's scope for local variables.
+ Because you don't have direct access to the var keyword,
+ it's impossible to shadow an outer variable on purpose, you may only refer
+ to it. So be careful that you're not reusing the name of an external
+ variable accidentally, if you're writing a deeply nested function.
+
+
+ Although suppressed within this documentation for clarity, all
+ CoffeeScript output is wrapped in an anonymous function:
+ (function(){ ... })(); This safety wrapper, combined with the
+ automatic generation of the var keyword, make it exceedingly difficult
+ to pollute the global namespace by accident.
+
+
+ If you'd like to create top-level variables for other scripts to use,
+ attach them as properties on window, or on the exports
+ object in CommonJS. The existential operator (covered below), gives you a
+ reliable way to figure out where to add them, if you're targeting both
+ CommonJS and the browser: root = exports ? this
+
+
+
+
+ If, Else, Unless, and Conditional Assignment
+ If/else statements can be written without the use of parentheses and
+ curly brackets. As with functions and other block expressions,
+ multi-line conditionals are delimited by indentation. There's also a handy
+ postfix form, with the if or unless at the end.
+
+
+ CoffeeScript can compile if statements into JavaScript expressions,
+ using the ternary operator when possible, and closure wrapping otherwise. There
+ is no explicit ternary statement in CoffeeScript — you simply use
+ a regular if statement inline.
+
+ <%= code_for('conditionals') %>
+
+
+
+ Aliases
+ Because the == operator frequently causes undesirable coercion,
+ is intransitive, and has a different meaning than in other languages,
+ CoffeeScript compiles == into ===, and != into
+ !==.
+ In addition, is compiles into ===,
+ and isnt into !==.
+
+
+ You can use not as an alias for !.
+
+
+ For logic, and compiles to &&, and or
+ into ||.
+
+
+ Instead of a newline or semicolon, then can be used to separate
+ conditions from expressions, in while,
+ if/else, and switch/when statements.
+
+
+ As in YAML, on and yes
+ are the same as boolean true, while off and no are boolean false.
+
+
+ For single-line statements, unless can be used as the inverse of if.
+
+
+ As a shortcut for this.property, you can use @property.
+
+
+ You can use in to test for array presence, and of to
+ test for JavaScript object-key presence.
+
+ <%= code_for('aliases') %>
+
+
+
+ Splats...
+ The JavaScript arguments object is a useful way to work with
+ functions that accept variable numbers of arguments. CoffeeScript provides
+ splats ..., both for function definition as well as invocation,
+ making variable numbers of arguments a little bit more palatable.
+
+ <%= code_for('splats', true) %>
+
+
+
+ While, Until, and Loop
+ The only low-level loop that CoffeeScript provides is the while loop. The
+ main difference from JavaScript is that the while loop can be used
+ as an expression, returning an array containing the result of each iteration
+ through the loop.
+
+ <%= code_for('while', 'lyrics.join("\n")') %>
+
+ For readability, the until keyword is equivalent to while not,
+ and the loop keyword is equivalent to while true.
+ Other JavaScript loops, such as for loops and do-while loops
+ can be mimicked by variations on loop, but the hope is that you
+ won't need to do that with CoffeeScript, either because you're using
+ each (forEach) style iterators, or...
+
+
+
+
+ Comprehensions (Arrays, Objects, and Ranges)
+ For your looping needs, CoffeeScript provides array comprehensions
+ similar to Python's. They replace (and compile into) for loops, with
+ optional guard clauses and the value of the current array index.
+ Unlike for loops, array comprehensions are expressions, and can be returned
+ and assigned. They should be able to handle most places where you otherwise
+ would use a loop, each/forEach, map, or select/filter.
+
+ <%= code_for('array_comprehensions') %>
+
+ If you know the start and end of your loop, or would like to step through
+ in fixed-size increments, you can use a range to specify the start and
+ end of your comprehension.
+
+ Comprehensions can also be used to iterate over the keys and values in
+ an object. Use of to signal comprehension over the properties of
+ an object instead of the values in an array.
+
+ By default, object comprehensions are safe, and use a hasOwnProperty
+ check to make sure that you're dealing with properties on the current
+ object. If you'd like the regular JavaScript for (key in obj) ...
+ loop, for speed or for another reason, you can use
+ for all key, value of object in CoffeeScript.
+
+
+
+
+ Array Slicing and Splicing with Ranges
+ CoffeeScript borrows Ruby's
+ range syntax
+ for extracting slices of arrays. With two dots (3..5), the range
+ is inclusive: the first argument is the index of the first element in
+ the slice, and the second is the index of the last one. Three dots signify
+ a range that excludes the end.
+
+ <%= code_for('slices', 'copy') %>
+
+ The same syntax can be used with assignment to replace a segment of an
+ array with new values (to splice it).
+
+ <%= code_for('splices', 'numbers') %>
+
+
+
+ Everything is an Expression (at least, as much as possible)
+ You might have noticed how even though we don't add return statements
+ to CoffeeScript functions, they nonetheless return their final value.
+ The CoffeeScript compiler tries to make sure that all statements in the
+ language can be used as expressions. Watch how the return gets
+ pushed down into each possible branch of execution, in the function
+ below.
+
+ <%= code_for('expressions', 'eldest') %>
+
+ Even though functions will always return their final value, it's both possible
+ and encouraged to return early from a function body writing out the explicit
+ return (return value), when you know that you're done.
+
+
+ Because variable declarations occur at the top of scope, assignment can
+ be used within expressions, even for variables that haven't been seen before:
+
+ Things that would otherwise be statements in JavaScript, when used
+ as part of an expression in CoffeeScript, are converted into expressions
+ by wrapping them in a closure. This lets you do useful things, like assign
+ the result of a comprehension to a variable:
+
+ As well as silly things, like passing a try/catch statement directly
+ into a function call:
+
+ <%= code_for('expressions_try', true) %>
+
+ There are a handful of statements in JavaScript that can't be meaningfully
+ converted into expressions, namely break, continue,
+ and return. If you make use of them within a block of code,
+ CoffeeScript won't try to perform the conversion.
+
+
+
+
+ The Existential Operator
+ It's a little difficult to check for the existence of a variable in
+ JavaScript. if (variable) ... comes close, but fails for zero,
+ the empty string, and false. CoffeeScript's existential operator ? returns true unless
+ a variable is null or undefined, which makes it analogous
+ to Ruby's nil?
+
+
+ It can also be used for safer conditional assignment than ||=
+ provides, for cases where you may be handling numbers or strings.
+
+ <%= code_for('existence', 'speed') %>
+
+ The accessor variant of the existential operator ?. can be used to soak
+ up null references in a chain of properties. Use it instead
+ of the dot accessor . in cases where the base value may be null
+ or undefined. If all of the properties exist then you'll get the expected
+ result, if the chain is broken, undefined is returned instead of
+ the TypeError that would be raised otherwise.
+
+
+ Classes, Inheritance, and Super
+ JavaScript's prototypal inheritance has always been a bit of a
+ brain-bender, with a whole family tree of libraries that provide a cleaner
+ syntax for classical inheritance on top of JavaScript's prototypes:
+ Base2,
+ Prototype.js,
+ JS.Class, etc.
+ The libraries provide syntactic sugar, but the built-in inheritance would
+ be completely usable if it weren't for a couple of small exceptions:
+ it's awkward to call super (the prototype object's
+ implementation of the current function), and it's awkward to correctly
+ set the prototype chain.
+
+
+ Instead of repetitively attaching functions to a prototype, CoffeeScript
+ provides a basic class structure that allows you to name your class,
+ set the superclass, assign prototypal properties, and define the constructor,
+ in a single assignable expression.
+
+ <%= code_for('classes', true) %>
+
+ If structuring your prototypes classically isn't your cup of tea, CoffeeScript
+ provides a couple of lower-level conveniences. The extends operator
+ helps with proper prototype setup, :: gives you
+ quick access to an object's prototype, and super()
+ is converted into a call against the immediate ancestor's method of the same name.
+
+ Finally, you may assign Class-level (static) properties within a class
+ definition by using @property: value
+
+
+
+
+ Pattern Matching (Destructuring Assignment)
+ To make extracting values from complex arrays and objects more convenient,
+ CoffeeScript implements ECMAScript Harmony's proposed
+ destructuring assignment
+ syntax. When you assign an array or object literal to a value, CoffeeScript
+ breaks up and matches both sides against each other, assigning the values
+ on the right to the variables on the left. In the simplest case, it can be
+ used for parallel assignment:
+
+
+ Function binding
+ In JavaScript, the this keyword is dynamically scoped to mean the
+ object that the current function is attached to. If you pass a function as
+ as callback, or attach it to a different object, the original value of this
+ will be lost. If you're not familiar with this behavior,
+ this Digital Web article
+ gives a good overview of the quirks.
+
+
+ The fat arrow => can be used to both define a function, and to bind
+ it to the current value of this, right on the spot. This is helpful
+ when using callback-based libraries like Prototype or jQuery, for creating
+ iterator functions to pass to each, or event-handler functions
+ to use with bind. Functions created with the fat arrow are able to access
+ properties of the this where they're defined.
+
+ <%= code_for('fat_arrow') %>
+
+ If we had used -> in the callback above, @customer would
+ have referred to the undefined "customer" property of the DOM element,
+ and trying to call purchase() on it would have raised an exception.
+
+
+
+
+ Embedded JavaScript
+ Hopefully, you'll never need to use it, but if you ever need to intersperse
+ snippets of JavaScript within your CoffeeScript, you can
+ use backticks to pass it straight through.
+
+ <%= code_for('embedded', 'hi()') %>
+
+
+
+ Switch/When/Else
+ Switch statements in JavaScript are a bit awkward. You need to
+ remember to break at the end of every case statement to
+ avoid accidentally falling through to the default case.
+ CoffeeScript prevents accidental fall-through, and can convert the switch
+ into a returnable, assignable expression. The format is: switch condition,
+ when clauses, else the default case.
+
+
+ As in Ruby, switch statements in CoffeeScript can take multiple
+ values for each when clause. If any of the values match, the clause
+ runs.
+
+ <%= code_for('switch') %>
+
+
+
+ Try/Catch/Finally
+ Try/catch statements are just about the same as JavaScript (although
+ they work as expressions).
+
+ <%= code_for('try') %>
+
+
+
+ Chained Comparisons
+ CoffeeScript borrows
+ chained comparisons
+ from Python — making it easy to test if a value falls within a
+ certain range.
+
+ <%= code_for('comparisons', 'healthy') %>
+
+
+
+ String and RegExp Interpolation
+ Ruby-style string interpolation is included in CoffeeScript. Double-quoted
+ strings allow for interpolated values, while single-quoted strings are literal.
+
+ <%= code_for('interpolation', 'quote') %>
+
+ And arbitrary expressions can be interpolated by using brackets #{ ... }
+ Interpolation works the same way within regular expressions.
+
+
+ Multiline Strings, Heredocs, and Block Comments
+ Multiline strings are allowed in CoffeeScript.
+
+ <%= code_for('strings', 'mobyDick') %>
+
+ Heredocs can be used to hold formatted or indentation-sensitive text
+ (or, if you just don't feel like escaping quotes and apostrophes). The
+ indentation level that begins the heredoc is maintained throughout, so
+ you can keep it all aligned with the body of your code.
+
+ <%= code_for('heredocs') %>
+
+ Double-quoted heredocs, like double-quoted strings, allow interpolation.
+
+
+ Sometimes you'd like to pass a block comment through to the generated
+ JavaScript. For example, when you need to embed a licensing header at
+ the top of a file. Block comments, which mirror the synax for heredocs,
+ are preserved in the generated code.
+
+ <%= code_for('block_comment') %>
+
+
+
+ Cake, and Cakefiles
+
+
+
+ CoffeeScript includes a simple build system similar to
+ Make and
+ Rake. Naturally,
+ it's called Cake, and is used for the build and test tasks for the CoffeeScript
+ language itself. Tasks are defined in a file named Cakefile, and
+ can be invoked by running cake taskname from within the directory.
+ To print a list of all the tasks and options, just run cake.
+
+
+
+ Task definitions are written in CoffeeScript, so you can put arbitrary code
+ in your Cakefile. Define a task with a name, a long description, and the
+ function to invoke when the task is run. If your task takes a command-line
+ option, you can define the option with short and long flags, and it will
+ be made available in the options object. Here's a task that uses
+ the Node.js API to rebuild CoffeeScript's parser:
+
+ <%= code_for('cake_tasks') %>
+
+ If you need to invoke one task before another — for example, running
+ build before test, you can use the invoke function:
+ invoke 'build'
+
+
+
+
+ "text/coffeescript" Script Tags
+
+
+
+ While it's not recommended for serious use, CoffeeScripts may be included
+ directly within the browser using <script type="text/coffeescript">
+ tags. The source includes a compressed and minified version of the compiler
+ (Download current version here, 43k when gzipped)
+ as extras/coffee-script.js. Include this file on a page with
+ inline CoffeeScript tags, and it will compile and evaluate them in order.
+
+
+
+ In fact, the little bit of glue script that runs "Try CoffeeScript" above,
+ as well as jQuery for the menu, is implemented in just this way.
+ View source and look at the bottom of the page to see the example.
+ Including the script also gives you access to CoffeeScript.compile()
+ so you can pop open Firebug and try compiling some strings.
+
+
+
+ The usual caveats about CoffeeScript apply — your inline scripts will
+ run within a closure wrapper, so if you want to expose global variables or
+ functions, attach them to the window object.
+
+
+
+
+ Resources
+
+
+
+
+ Source Code
+ Use bin/coffee to test your changes,
+ bin/cake test to run the test suite,
+ bin/cake build to rebuild the CoffeeScript compiler, and
+ bin/cake build:parser to regenerate the Jison parser if you're
+ working on the grammar.
+ git checkout lib && bin/cake build:full is a good command to run when you're working
+ on the core language. It'll refresh the lib directory
+ (in case you broke something), build your altered compiler, use that to
+ rebuild itself (a good sanity test) and then run all of the tests. If
+ they pass, there's a good chance you've made a successful change.
+
+
+ CoffeeScript Issues
+ Bugs reports, feature requests, and general discussion all belong here.
+
+
+ If you'd like to chat, stop by #coffeescript on Freenode in the
+ IRC client of your choice, or on
+ webchat.freenode.net.
+
+
+ yeungda's JCoffeeScript
+ — A Java Library that uses Rhino to compile CoffeeScript, allowing
+ compilation within Java projects or on systems that Node.js doesn't support.
+
+
+ defunkt's CoffeeScript Major Mode
+ — a Emacs major mode that provides syntax highlighting, indentation
+ support, and some bonus commands.
+
+
+ jashkenas's CoffeeScript TextMate Bundle
+ — which provides syntax highlighting, snippet expansion, and the
+ ability to run bits of CoffeeScript from within TextMate itself.
+
+
+ kchmck's Vim CoffeeScript
+ — which adds Vim syntax highlighting and indentation support.
+
+
+ wavded's gedit-coffeescript
+ — a CoffeeScript syntax highlighter for the gedit text editor.
+
+
+ yeungda's coffeescript-idea
+ — a plugin for IntelliJ IDEA and RubyMine providing syntax highlighting.
+
+
+ mattly's rack-coffee
+ — a small Rack middleware for serving CoffeeScript files as
+ compiled JavaScript on the fly.
+
+
+ jnicklas's BistroCar
+ — a plugin that serves and bundles CoffeeScript from within your
+ Rails application.
+
+
+ dsc's CoffeeCup
+ — a Python WSGI middleware that compiles CoffeeScript to JavaScript
+ on-demand during development.
+
+
+ sutto's Barista
+ — a BistroCar alternative that integrates well with
+ Jammit and Rails 3.
+
+
+ inem and gerad's coffee-haml-filter
+ — a custom filter for rendering CoffeeScript inline within
+ HAML templates.
+
+
+ chrislloyd's Roast
+ — a CoffeeScript compiler plug-in that allows you to include external
+ source files.
+
+
+ andrzejsliwa's CoffeeApp
+ — a CoffeeScript wrapper for CouchApps, web applications served
+ directly from CouchDB.
+
+
+ mauricemach's CoffeeKup
+ — Markup as CoffeeScript. After _why's
+ Markaby.
+
+
+ jashkenas's Docco
+ — a quick-and-dirty literate-programming-style documentation generator
+ for CoffeeScript. Used to produce the annotated source.
+
+
+
+
+
+ Web Chat (IRC)
+
+
+
+ Quick help and advice can usually be found in the CoffeeScript IRC room.
+ Join #coffeescript on irc.freenode.net, or click the
+ button below to open a webchat session on this page.
+
+
+
+
+
+
+
+
+ Change Log
+
+
+
+ 0.9.4
+ CoffeeScript now uses appropriately-named temporary variables, and recycles
+ their references after use. Added require.extensions support for
+ Node.js 0.3. Loading CoffeeScript in the browser now adds just a
+ single CoffeeScript object to global scope.
+ Fixes for implicit object and block comment edge cases.
+
+
+
+ 0.9.3
+ CoffeeScript switch statements now compile into JS switch
+ statements — they previously compiled into if/else chains
+ for JavaScript 1.3 compatibility.
+ Soaking a function invocation is now supported. Users of the RubyMine
+ editor should now be able to use --watch mode.
+
+
+
+ 0.9.2
+ Specifying the start and end of a range literal is now optional, eg. array[3..].
+ You can now say a not instanceof b.
+ Fixed important bugs with nested significant and non-significant indentation (Issue #637).
+ Added a --require flag that allows you to hook into the coffee command.
+ Added a custom jsl.conf file for our preferred JavaScriptLint setup.
+ Sped up Jison grammar compilation time by flattening rules for operations.
+ Block comments can now be used with JavaScript-minifier-friendly syntax.
+ Added JavaScript's compound assignment bitwise operators. Bugfixes to
+ implicit object literals with leading number and string keys, as the subject
+ of implicit calls, and as part of compound assignment.
+
+
+
+ 0.9.1
+ Bugfix release for 0.9.1. Greatly improves the handling of mixed
+ implicit objects, implicit function calls, and implicit indentation.
+ String and regex interpolation is now strictly #{ ... } (Ruby style).
+ The compiler now takes a --require flag, which specifies scripts
+ to run before compilation.
+
+
+
+ 0.9.0
+ The CoffeeScript 0.9 series is considered to be a release candidate
+ for 1.0; let's give her a shakedown cruise. 0.9.0 introduces a massive
+ backwards-incompatible change: Assignment now uses =, and object
+ literals use :, as in JavaScript. This allows us to have implicit
+ object literals, and YAML-style object definitions. Half assignments are
+ removed, in favor of +=, or=, and friends.
+ Interpolation now uses a hash mark # instead of the dollar sign
+ $ — because dollar signs may be part of a valid JS identifier.
+ Downwards range comprehensions are now safe again, and are optimized to
+ straight for loops when created with integer endpoints.
+ A fast, unguarded form of object comprehension was added:
+ for all key, value of object. Mentioning the super keyword
+ with no arguments now forwards all arguments passed to the function,
+ as in Ruby. If you extend class B from parent class A, if
+ A has an extended method defined, it will be called, passing in B —
+ this enables static inheritance, among other things. Cleaner output for
+ functions bound with the fat arrow. @variables can now be used
+ in parameter lists, with the parameter being automatically set as a property
+ on the object — useful in constructors and setter functions.
+ Constructor functions can now take splats.
+
+
+
+ 0.7.2
+ Quick bugfix (right after 0.7.1) for a problem that prevented coffee
+ command-line options from being parsed in some circumstances.
+
+
+
+ 0.7.1
+ Block-style comments are now passed through and printed as JavaScript block
+ comments -- making them useful for licenses and copyright headers. Better
+ support for running coffee scripts standalone via hashbangs.
+ Improved syntax errors for tokens that are not in the grammar.
+
+
+
+ 0.7.0
+ Official CoffeeScript variable style is now camelCase, as in JavaScript.
+ Reserved words are now allowed as object keys, and will be quoted for you.
+ Range comprehensions now generate cleaner code, but you have to specify by -1
+ if you'd like to iterate downward. Reporting of syntax errors is greatly
+ improved from the previous release. Running coffee with no arguments
+ now launches the REPL, with Readline support. The <- bind operator
+ has been removed from CoffeeScript. The loop keyword was added,
+ which is equivalent to a while true loop. Comprehensions that contain
+ closures will now close over their variables, like the semantics of a forEach.
+ You can now use bound function in class definitions (bound to the instance).
+ For consistency, a in b is now an array presence check, and a of b
+ is an object-key check. Comments are no longer passed through to the generated
+ JavaScript.
+
+
+
+ 0.6.2
+ The coffee command will now preserve directory structure when
+ compiling a directory full of scripts. Fixed two omissions that were preventing
+ the CoffeeScript compiler from running live within Internet Explorer.
+ There's now a syntax for block comments, similar in spirit to CoffeeScript's heredocs.
+ ECMA Harmony DRY-style pattern matching is now supported, where the name
+ of the property is the same as the name of the value: {name, length}: func.
+ Pattern matching is now allowed within comprehension variables. unless
+ is now allowed in block form. until loops were added, as the inverse
+ of while loops. switch statements are now allowed without
+ switch object clauses. Compatible
+ with Node.js v0.1.95.
+
+
+
+ 0.6.1
+ Upgraded CoffeeScript for compatibility with the new Node.js v0.1.90
+ series.
+
+
+
+ 0.6.0
+ Trailing commas are now allowed, a-la Python. Static
+ properties may be assigned directly within class definitions,
+ using @property notation.
+
+
+
+ 0.5.6
+ Interpolation can now be used within regular expressions and heredocs, as well as
+ strings. Added the <- bind operator.
+ Allowing assignment to half-expressions instead of special ||=-style
+ operators. The arguments object is no longer automatically converted into
+ an array. After requiring coffee-script, Node.js can now directly
+ load .coffee files, thanks to registerExtension. Multiple
+ splats can now be used in function calls, arrays, and pattern matching.
+
+
+
+ 0.5.5
+ String interpolation, contributed by
+ Stan Angeloff.
+ Since --run has been the default since 0.5.3, updating
+ --stdio and --eval to run by default, pass --compile
+ as well if you'd like to print the result.
+
+
+
+ 0.5.4
+ Bugfix that corrects the Node.js global constants __filename and
+ __dirname. Tweaks for more flexible parsing of nested function
+ literals and improperly-indented comments. Updates for the latest Node.js API.
+
+
+
+ 0.5.3
+ CoffeeScript now has a syntax for defining classes. Many of the core
+ components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them.
+ Cakefiles can use optparse.coffee to define options for tasks.
+ --run is now the default flag for the coffee command,
+ use --compile to save JavaScripts. Bugfix for an ambiguity between
+ RegExp literals and chained divisions.
+
+
+
+ 0.5.2
+ Added a compressed version of the compiler for inclusion in web pages as
+ extras/coffee-script.js. It'll automatically run any script tags
+ with type text/coffeescript for you. Added a --stdio option
+ to the coffee command, for piped-in compiles.
+
+
+
+
+ 0.5.1
+ Improvements to null soaking with the existential operator, including
+ soaks on indexed properties. Added conditions to while loops,
+ so you can use them as filters with when, in the same manner as
+ comprehensions.
+
+
+
+ 0.5.0
+ CoffeeScript 0.5.0 is a major release, While there are no language changes,
+ the Ruby compiler has been removed in favor of a self-hosting
+ compiler written in pure CoffeeScript.
+
+
+
+ 0.3.2
+ @property is now a shorthand for this.property.
+ Switched the default JavaScript engine from Narwhal to Node.js. Pass
+ the --narwhal flag if you'd like to continue using it.
+
+
+
+ 0.3.0
+ CoffeeScript 0.3 includes major syntax changes:
+
+ The function symbol was changed to
+ ->, and the bound function symbol is now =>.
+
+ Parameter lists in function definitions must now be wrapped in parentheses.
+
+ Added property soaking, with the ?. operator.
+
+ Made parentheses optional, when invoking functions with arguments.
+
+ Removed the obsolete block literal syntax.
+
+
+
+ 0.2.6
+ Added Python-style chained comparisons, the conditional existence
+ operator ?=, and some examples from Beautiful Code.
+ Bugfixes relating to statement-to-expression conversion, arguments-to-array
+ conversion, and the TextMate syntax highlighter.
+
+
+
+ 0.2.5
+ The conditions in switch statements can now take multiple values at once —
+ If any of them are true, the case will run. Added the long arrow ==>,
+ which defines and immediately binds a function to this. While loops can
+ now be used as expressions, in the same way that comprehensions can. Splats
+ can be used within pattern matches to soak up the rest of an array.
+
+
+
+ 0.2.4
+ Added ECMAScript Harmony style destructuring assignment, for dealing with
+ extracting values from nested arrays and objects. Added indentation-sensitive
+ heredocs for nicely formatted strings or chunks of code.
+
+
+
+ 0.2.3
+ Axed the unsatisfactory ino keyword, replacing it with of for
+ object comprehensions. They now look like: for prop, value of object.
+
+
+
+ 0.2.2
+ When performing a comprehension over an object, use ino, instead
+ of in, which helps us generate smaller, more efficient code at
+ compile time.
+
+ Added :: as a shorthand for saying .prototype.
+
+ The "splat" symbol has been changed from a prefix asterisk *, to
+ a postfix ellipsis ...
+
+ Added JavaScript's in operator,
+ empty return statements, and empty while loops.
+
+ Constructor functions that start with capital letters now include a
+ safety check to make sure that the new instance of the object is returned.
+
+ The extends keyword now functions identically to goog.inherits
+ in Google's Closure Library.
+
+
+
+ 0.2.1
+ Arguments objects are now converted into real arrays when referenced.
+
+
+
+ 0.2.0
+ Major release. Significant whitespace. Better statement-to-expression
+ conversion. Splats. Splice literals. Object comprehensions. Blocks.
+ The existential operator. Many thanks to all the folks who posted issues,
+ with special thanks to
+ Liam O'Connor-Davis for whitespace
+ and expression help.
+
+
+
+ 0.1.6
+ Bugfix for running coffee --interactive and --run
+ from outside of the CoffeeScript directory. Bugfix for nested
+ function/if-statements.
+
+
+
+ 0.1.5
+ Array slice literals and array comprehensions can now both take Ruby-style
+ ranges to specify the start and end. JavaScript variable declaration is
+ now pushed up to the top of the scope, making all assignment statements into
+ expressions. You can use \ to escape newlines.
+ The coffee-script command is now called coffee.
+
+
+
+ 0.1.4
+ The official CoffeeScript extension is now .coffee instead of
+ .cs, which properly belongs to
+ C#.
+ Due to popular demand, you can now also use = to assign. Unlike
+ JavaScript, = can also be used within object literals, interchangeably
+ with :. Made a grammatical fix for chained function calls
+ like func(1)(2)(3)(4). Inheritance and super no longer use
+ __proto__, so they should be IE-compatible now.
+
+
+
+ 0.1.3
+ The coffee command now includes --interactive,
+ which launches an interactive CoffeeScript session, and --run,
+ which directly compiles and executes a script. Both options depend on a
+ working installation of Narwhal.
+ The aint keyword has been replaced by isnt, which goes
+ together a little smoother with is.
+ Quoted strings are now allowed as identifiers within object literals: eg.
+ {"5+5": 10}.
+ All assignment operators now use a colon: +:, -:,
+ *:, etc.
+
+
+
+ 0.1.2
+ Fixed a bug with calling super() through more than one level of
+ inheritance, with the re-addition of the extends keyword.
+ Added experimental Narwhal
+ support (as a Tusk package), contributed by
+ Tom Robinson, including
+ bin/cs as a CoffeeScript REPL and interpreter.
+ New --no-wrap option to suppress the safety function
+ wrapper.
+
+
+
+ 0.1.1
+ Added instanceof and typeof as operators.
+
+
+
+ 0.1.0
+ Initial CoffeeScript release.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/jade/support/coffee-script/documentation/js/aliases.js b/node_modules/jade/support/coffee-script/documentation/js/aliases.js
new file mode 100644
index 0000000..a3675d6
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/aliases.js
@@ -0,0 +1,17 @@
+var volume, winner;
+if (ignition === true) {
+ launch();
+}
+if (band !== SpinalTap) {
+ volume = 10;
+}
+if (answer !== false) {
+ letTheWildRumpusBegin();
+}
+if (car.speed < limit) {
+ accelerate();
+}
+if ((47 === pick || 92 === pick || 13 === pick)) {
+ winner = true;
+}
+print(inspect("My name is " + this.name));
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/array_comprehensions.js b/node_modules/jade/support/coffee-script/documentation/js/array_comprehensions.js
new file mode 100644
index 0000000..2260db7
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/array_comprehensions.js
@@ -0,0 +1,20 @@
+var _i, _len, _len2, _ref, _result, food, lunch, pos, roid, roid2;
+lunch = (function() {
+ _result = []; _ref = ['toast', 'cheese', 'wine'];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ food = _ref[_i];
+ _result.push(eat(food));
+ }
+ return _result;
+})();
+for (pos = 0, _len = asteroids.length; pos < _len; pos++) {
+ roid = asteroids[pos];
+ for (_i = 0, _len2 = asteroids.length; _i < _len2; _i++) {
+ roid2 = asteroids[_i];
+ if (roid !== roid2) {
+ if (roid.overlaps(roid2)) {
+ roid.explode();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/block_comment.js b/node_modules/jade/support/coffee-script/documentation/js/block_comment.js
new file mode 100644
index 0000000..ae602e6
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/block_comment.js
@@ -0,0 +1,4 @@
+/*
+CoffeeScript Compiler v0.9.4
+Released under the MIT License
+*/
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/cake_tasks.js b/node_modules/jade/support/coffee-script/documentation/js/cake_tasks.js
new file mode 100644
index 0000000..b1c0914
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/cake_tasks.js
@@ -0,0 +1,10 @@
+var fs;
+fs = require('fs');
+option('-o', '--output [DIR]', 'directory for compiled code');
+task('build:parser', 'rebuild the Jison parser', function(options) {
+ var code, dir;
+ require('jison');
+ code = require('./lib/grammar').parser.generate();
+ dir = options.output || 'lib';
+ return fs.writeFile("" + dir + "/parser.js", code);
+});
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/classes.js b/node_modules/jade/support/coffee-script/documentation/js/classes.js
new file mode 100644
index 0000000..279885f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/classes.js
@@ -0,0 +1,42 @@
+var Animal, Horse, Snake, sam, tom;
+var __extends = function(child, parent) {
+ var ctor = function() {};
+ ctor.prototype = parent.prototype;
+ child.prototype = new ctor();
+ child.prototype.constructor = child;
+ if (typeof parent.extended === "function") parent.extended(child);
+ child.__super__ = parent.prototype;
+};
+Animal = (function() {
+ return function Animal(_arg) {
+ this.name = _arg;
+ return this;
+ };
+})();
+Animal.prototype.move = function(meters) {
+ return alert(this.name + " moved " + meters + "m.");
+};
+Snake = (function() {
+ return function Snake() {
+ return Animal.apply(this, arguments);
+ };
+})();
+__extends(Snake, Animal);
+Snake.prototype.move = function() {
+ alert("Slithering...");
+ return Snake.__super__.move.call(this, 5);
+};
+Horse = (function() {
+ return function Horse() {
+ return Animal.apply(this, arguments);
+ };
+})();
+__extends(Horse, Animal);
+Horse.prototype.move = function() {
+ alert("Galloping...");
+ return Horse.__super__.move.call(this, 45);
+};
+sam = new Snake("Sammy the Python");
+tom = new Horse("Tommy the Palomino");
+sam.move();
+tom.move();
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/comparisons.js b/node_modules/jade/support/coffee-script/documentation/js/comparisons.js
new file mode 100644
index 0000000..e1ce0cc
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/comparisons.js
@@ -0,0 +1,3 @@
+var cholesterol, healthy;
+cholesterol = 127;
+healthy = (200 > cholesterol) && (cholesterol > 60);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/conditionals.js b/node_modules/jade/support/coffee-script/documentation/js/conditionals.js
new file mode 100644
index 0000000..bee05fb
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/conditionals.js
@@ -0,0 +1,12 @@
+var date, mood, options;
+if (singing) {
+ mood = greatlyImproved;
+}
+if (happy && knowsIt) {
+ clapsHands();
+ chaChaCha();
+} else {
+ showIt();
+}
+date = friday ? sue : jill;
+options || (options = defaults);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/embedded.js b/node_modules/jade/support/coffee-script/documentation/js/embedded.js
new file mode 100644
index 0000000..3db2b0f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/embedded.js
@@ -0,0 +1,4 @@
+var hi;
+hi = function() {
+ return [document.title, "Hello JavaScript"].join(": ");
+};
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/existence.js b/node_modules/jade/support/coffee-script/documentation/js/existence.js
new file mode 100644
index 0000000..6fc021b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/existence.js
@@ -0,0 +1,5 @@
+var solipsism, speed;
+if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) {
+ solipsism = true;
+}
+(typeof speed !== "undefined" && speed !== null) ? speed : (speed = 140);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/expressions.js b/node_modules/jade/support/coffee-script/documentation/js/expressions.js
new file mode 100644
index 0000000..6ea42bc
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/expressions.js
@@ -0,0 +1,5 @@
+var eldest, grade;
+grade = function(student) {
+ return student.excellentWork ? "A+" : (student.okayStuff ? (student.triedHard ? "B" : "B-") : "C");
+};
+eldest = 24 > 21 ? "Liz" : "Ike";
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/expressions_assignment.js b/node_modules/jade/support/coffee-script/documentation/js/expressions_assignment.js
new file mode 100644
index 0000000..e75323d
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/expressions_assignment.js
@@ -0,0 +1,2 @@
+var one, six, three, two;
+six = (one = 1) + (two = 2) + (three = 3);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/expressions_comprehension.js b/node_modules/jade/support/coffee-script/documentation/js/expressions_comprehension.js
new file mode 100644
index 0000000..771e67f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/expressions_comprehension.js
@@ -0,0 +1,10 @@
+var _result, globals, name;
+var __hasProp = Object.prototype.hasOwnProperty;
+globals = (function() {
+ _result = [];
+ for (name in window) {
+ if (!__hasProp.call(window, name)) continue;
+ _result.push(name);
+ }
+ return _result;
+})().slice(0, 10);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/expressions_try.js b/node_modules/jade/support/coffee-script/documentation/js/expressions_try.js
new file mode 100644
index 0000000..19a9506
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/expressions_try.js
@@ -0,0 +1,7 @@
+alert((function() {
+ try {
+ return nonexistent / undefined;
+ } catch (error) {
+ return "And the error is ... " + error;
+ }
+})());
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/fat_arrow.js b/node_modules/jade/support/coffee-script/documentation/js/fat_arrow.js
new file mode 100644
index 0000000..9f8f50d
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/fat_arrow.js
@@ -0,0 +1,11 @@
+var Account;
+var __bind = function(func, context) {
+ return function() { return func.apply(context, arguments); };
+};
+Account = function(customer, cart) {
+ this.customer = customer;
+ this.cart = cart;
+ return $('.shopping_cart').bind('click', __bind(function(event) {
+ return this.customer.purchase(this.cart);
+ }, this));
+};
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/functions.js b/node_modules/jade/support/coffee-script/documentation/js/functions.js
new file mode 100644
index 0000000..ec38bc7
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/functions.js
@@ -0,0 +1,7 @@
+var cube, square;
+square = function(x) {
+ return x * x;
+};
+cube = function(x) {
+ return square(x) * x;
+};
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/heredocs.js b/node_modules/jade/support/coffee-script/documentation/js/heredocs.js
new file mode 100644
index 0000000..0cbcb2a
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/heredocs.js
@@ -0,0 +1,2 @@
+var html;
+html = '\n cup of coffeescript\n';
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/interpolation.js b/node_modules/jade/support/coffee-script/documentation/js/interpolation.js
new file mode 100644
index 0000000..6b4e124
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/interpolation.js
@@ -0,0 +1,3 @@
+var author, quote;
+author = "Wittgenstein";
+quote = ("A picture is a fact. -- " + author);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/interpolation_expression.js b/node_modules/jade/support/coffee-script/documentation/js/interpolation_expression.js
new file mode 100644
index 0000000..166e08d
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/interpolation_expression.js
@@ -0,0 +1,4 @@
+var dates, sentence, sep;
+sentence = ("" + (22 / 7) + " is a decent approximation of π");
+sep = "[.\\/\\- ]";
+dates = /\d+#{sep}\d+#{sep}\d+/g;
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/multiple_return_values.js b/node_modules/jade/support/coffee-script/documentation/js/multiple_return_values.js
new file mode 100644
index 0000000..e4bf1e6
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/multiple_return_values.js
@@ -0,0 +1,5 @@
+var _ref, city, forecast, temp, weatherReport;
+weatherReport = function(location) {
+ return [location, 72, "Mostly Sunny"];
+};
+_ref = weatherReport("Berkeley, CA"), city = _ref[0], temp = _ref[1], forecast = _ref[2];
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/object_comprehensions.js b/node_modules/jade/support/coffee-script/documentation/js/object_comprehensions.js
new file mode 100644
index 0000000..8d719ed
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/object_comprehensions.js
@@ -0,0 +1,16 @@
+var _result, age, ages, child, yearsOld;
+var __hasProp = Object.prototype.hasOwnProperty;
+yearsOld = {
+ max: 10,
+ ida: 9,
+ tim: 11
+};
+ages = (function() {
+ _result = [];
+ for (child in yearsOld) {
+ if (!__hasProp.call(yearsOld, child)) continue;
+ age = yearsOld[child];
+ _result.push(child + " is " + age);
+ }
+ return _result;
+})();
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/object_extraction.js b/node_modules/jade/support/coffee-script/documentation/js/object_extraction.js
new file mode 100644
index 0000000..90eff3d
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/object_extraction.js
@@ -0,0 +1,10 @@
+var _ref, _ref2, city, futurists, name, street;
+futurists = {
+ sculptor: "Umberto Boccioni",
+ painter: "Vladimir Burliuk",
+ poet: {
+ name: "F.T. Marinetti",
+ address: ["Via Roma 42R", "Bellagio, Italy 22021"]
+ }
+};
+_ref = futurists.poet, name = _ref.name, _ref2 = _ref.address, street = _ref2[0], city = _ref2[1];
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/objects_and_arrays.js b/node_modules/jade/support/coffee-script/documentation/js/objects_and_arrays.js
new file mode 100644
index 0000000..57b544d
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/objects_and_arrays.js
@@ -0,0 +1,17 @@
+var kids, matrix, singers, song;
+song = ["do", "re", "mi", "fa", "so"];
+singers = {
+ Jagger: "Rock",
+ Elvis: "Roll"
+};
+matrix = [1, 0, 1, 0, 0, 1, 1, 1, 0];
+kids = {
+ brother: {
+ name: "Max",
+ age: 11
+ },
+ sister: {
+ name: "Ida",
+ age: 9
+ }
+};
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/objects_reserved.js b/node_modules/jade/support/coffee-script/documentation/js/objects_reserved.js
new file mode 100644
index 0000000..db54cf6
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/objects_reserved.js
@@ -0,0 +1,3 @@
+$('.account').css({
+ "class": 'active'
+});
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/overview.js b/node_modules/jade/support/coffee-script/documentation/js/overview.js
new file mode 100644
index 0000000..5bdbffa
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/overview.js
@@ -0,0 +1,34 @@
+var _i, _len, _result, cubes, list, math, num, number, opposite, race, square;
+var __slice = Array.prototype.slice;
+number = 42;
+opposite = true;
+if (opposite) {
+ number = -42;
+}
+square = function(x) {
+ return x * x;
+};
+list = [1, 2, 3, 4, 5];
+math = {
+ root: Math.sqrt,
+ square: square,
+ cube: function(x) {
+ return x * square(x);
+ }
+};
+race = function(winner) {
+ var runners;
+ runners = __slice.call(arguments, 1);
+ return print(winner, runners);
+};
+if (typeof elvis !== "undefined" && elvis !== null) {
+ alert("I knew it!");
+}
+cubes = (function() {
+ _result = [];
+ for (_i = 0, _len = list.length; _i < _len; _i++) {
+ num = list[_i];
+ _result.push(math.cube(num));
+ }
+ return _result;
+})();
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/parallel_assignment.js b/node_modules/jade/support/coffee-script/documentation/js/parallel_assignment.js
new file mode 100644
index 0000000..a24e7f6
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/parallel_assignment.js
@@ -0,0 +1,4 @@
+var _ref, theBait, theSwitch;
+theBait = 1000;
+theSwitch = 0;
+_ref = [theSwitch, theBait], theBait = _ref[0], theSwitch = _ref[1];
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/patterns_and_splats.js b/node_modules/jade/support/coffee-script/documentation/js/patterns_and_splats.js
new file mode 100644
index 0000000..46b2260
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/patterns_and_splats.js
@@ -0,0 +1,4 @@
+var _ref, close, contents, open, tag;
+var __slice = Array.prototype.slice;
+tag = "";
+_ref = tag.split(""), open = _ref[0], contents = __slice.call(_ref, 1, _ref.length - 1), close = _ref[_ref.length - 1];
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/prototypes.js b/node_modules/jade/support/coffee-script/documentation/js/prototypes.js
new file mode 100644
index 0000000..418bc10
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/prototypes.js
@@ -0,0 +1,3 @@
+String.prototype.dasherize = function() {
+ return this.replace(/_/g, "-");
+};
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/range_comprehensions.js b/node_modules/jade/support/coffee-script/documentation/js/range_comprehensions.js
new file mode 100644
index 0000000..220d689
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/range_comprehensions.js
@@ -0,0 +1,19 @@
+var _result, countdown, deliverEggs, num;
+countdown = (function() {
+ _result = [];
+ for (num = 10; num >= 1; num--) {
+ _result.push(num);
+ }
+ return _result;
+})();
+deliverEggs = function() {
+ var _ref, _result2, dozen, i;
+ _result2 = []; _ref = eggs.length;
+ for (i = 0; (0 <= _ref ? i < _ref : i > _ref); i += 12) {
+ _result2.push((function() {
+ dozen = eggs.slice(i, i + 12);
+ return deliver(new eggCarton(dozen));
+ })());
+ }
+ return _result2;
+};
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/scope.js b/node_modules/jade/support/coffee-script/documentation/js/scope.js
new file mode 100644
index 0000000..478badf
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/scope.js
@@ -0,0 +1,8 @@
+var changeNumbers, inner, outer;
+outer = 1;
+changeNumbers = function() {
+ var inner;
+ inner = -1;
+ return (outer = 10);
+};
+inner = changeNumbers();
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/slices.js b/node_modules/jade/support/coffee-script/documentation/js/slices.js
new file mode 100644
index 0000000..064c502
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/slices.js
@@ -0,0 +1,4 @@
+var copy, numbers, threeToSix;
+numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+threeToSix = numbers.slice(3, 6 + 1);
+copy = numbers.slice(0, numbers.length);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/soaks.js b/node_modules/jade/support/coffee-script/documentation/js/soaks.js
new file mode 100644
index 0000000..5cf887e
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/soaks.js
@@ -0,0 +1,2 @@
+var _ref, _ref2;
+(((_ref = lottery.drawWinner()) != null) ? (((_ref2 = _ref.address) != null) ? _ref2.zipcode : undefined) : undefined);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/splats.js b/node_modules/jade/support/coffee-script/documentation/js/splats.js
new file mode 100644
index 0000000..3f16b83
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/splats.js
@@ -0,0 +1,15 @@
+var awardMedals, contenders, gold, rest, silver;
+var __slice = Array.prototype.slice;
+gold = (silver = (rest = "unknown"));
+awardMedals = function(first, second) {
+ var others;
+ others = __slice.call(arguments, 2);
+ gold = first;
+ silver = second;
+ return (rest = others);
+};
+contenders = ["Michael Phelps", "Liu Xiang", "Yao Ming", "Allyson Felix", "Shawn Johnson", "Roman Sebrle", "Guo Jingjing", "Tyson Gay", "Asafa Powell", "Usain Bolt"];
+awardMedals.apply(awardMedals, contenders);
+alert("Gold: " + gold);
+alert("Silver: " + silver);
+alert("The Field: " + rest);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/splices.js b/node_modules/jade/support/coffee-script/documentation/js/splices.js
new file mode 100644
index 0000000..944f1e3
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/splices.js
@@ -0,0 +1,3 @@
+var _ref, numbers;
+numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+([].splice.apply(numbers, [3, 6 - 3 + 1].concat(_ref = [-3, -4, -5, -6])), _ref);
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/strings.js b/node_modules/jade/support/coffee-script/documentation/js/strings.js
new file mode 100644
index 0000000..cfdf5d5
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/strings.js
@@ -0,0 +1,2 @@
+var mobyDick;
+mobyDick = "Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world...";
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/switch.js b/node_modules/jade/support/coffee-script/documentation/js/switch.js
new file mode 100644
index 0000000..2449cb9
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/switch.js
@@ -0,0 +1,23 @@
+switch (day) {
+ case "Mon":
+ go(work);
+ break;
+ case "Tue":
+ go(relax);
+ break;
+ case "Thu":
+ go(iceFishing);
+ break;
+ case "Fri":
+ case "Sat":
+ if (day === bingoDay) {
+ go(bingo);
+ go(dancing);
+ }
+ break;
+ case "Sun":
+ go(church);
+ break;
+ default:
+ go(work);
+}
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/try.js b/node_modules/jade/support/coffee-script/documentation/js/try.js
new file mode 100644
index 0000000..97b089f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/try.js
@@ -0,0 +1,8 @@
+try {
+ allHellBreaksLoose();
+ catsAndDogsLivingTogether();
+} catch (error) {
+ print(error);
+} finally {
+ cleanUp();
+}
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/documentation/js/while.js b/node_modules/jade/support/coffee-script/documentation/js/while.js
new file mode 100644
index 0000000..910b839
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/documentation/js/while.js
@@ -0,0 +1,17 @@
+var _result, lyrics, num;
+if (this.studyingEconomics) {
+ while (supply > demand) {
+ buy();
+ }
+ while (!(supply > demand)) {
+ sell();
+ }
+}
+num = 6;
+lyrics = (function() {
+ _result = [];
+ while (num -= 1) {
+ _result.push(num + " little monkeys, jumping on the bed. One fell out and bumped his head.");
+ }
+ return _result;
+})();
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/examples/beautiful_code/binary_search.coffee b/node_modules/jade/support/coffee-script/examples/beautiful_code/binary_search.coffee
new file mode 100644
index 0000000..6ad42c8
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/beautiful_code/binary_search.coffee
@@ -0,0 +1,16 @@
+# Beautiful Code, Chapter 6.
+# The implementation of binary search that is tested.
+
+# Return the index of an element in a sorted list. (or -1, if not present)
+index = (list, target) ->
+ [low, high] = [0, list.length]
+ while low < high
+ mid = (low + high) >> 1
+ val = list[mid]
+ return mid if val is target
+ if val < target then low = mid + 1 else high = mid
+ return -1
+
+puts 2 is index [10, 20, 30, 40, 50], 30
+puts 4 is index [-97, 35, 67, 88, 1200], 1200
+puts 0 is index [0, 45, 70], 0
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/examples/beautiful_code/quicksort_runtime.coffee b/node_modules/jade/support/coffee-script/examples/beautiful_code/quicksort_runtime.coffee
new file mode 100644
index 0000000..27794f4
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/beautiful_code/quicksort_runtime.coffee
@@ -0,0 +1,13 @@
+# Beautiful Code, Chapter 3.
+# Produces the expected runtime of Quicksort, for every integer from 1 to N.
+
+runtime = (N) ->
+ [sum, t] = [0, 0]
+ for n in [1..N]
+ sum += 2 * t
+ t = n - 1 + sum / n
+ t
+
+puts runtime(3) is 2.6666666666666665
+puts runtime(5) is 7.4
+puts runtime(8) is 16.92142857142857
diff --git a/node_modules/jade/support/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee b/node_modules/jade/support/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee
new file mode 100644
index 0000000..99ed0a1
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee
@@ -0,0 +1,34 @@
+# Beautiful Code, Chapter 1.
+# Implements a regular expression matcher that supports character matches,
+# '.', '^', '$', and '*'.
+
+# Search for the regexp anywhere in the text.
+match = (regexp, text) ->
+ return match_here(regexp.slice(1), text) if regexp[0] is '^'
+ while text
+ return true if match_here(regexp, text)
+ text = text.slice(1)
+ false
+
+# Search for the regexp at the beginning of the text.
+match_here = (regexp, text) ->
+ [cur, next] = [regexp[0], regexp[1]]
+ if regexp.length is 0 then return true
+ if next is '*' then return match_star(cur, regexp.slice(2), text)
+ if cur is '$' and not next then return text.length is 0
+ if text and (cur is '.' or cur is text[0]) then return match_here(regexp.slice(1), text.slice(1))
+ false
+
+# Search for a kleene star match at the beginning of the text.
+match_star = (c, regexp, text) ->
+ loop
+ return true if match_here(regexp, text)
+ return false unless text and (text[0] is c or c is '.')
+ text = text.slice(1)
+
+puts match("ex", "some text")
+puts match("s..t", "spit")
+puts match("^..t", "buttercup")
+puts match("i..$", "cherries")
+puts match("o*m", "vrooooommm!")
+puts match("^hel*o$", "hellllllo")
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/examples/blocks.coffee b/node_modules/jade/support/coffee-script/examples/blocks.coffee
new file mode 100644
index 0000000..f9e67ff
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/blocks.coffee
@@ -0,0 +1,54 @@
+# After wycats' http://yehudakatz.com/2010/02/07/the-building-blocks-of-ruby/
+
+# Sinatra.
+get '/hello', ->
+ 'Hello World'
+
+
+# Append.
+append = (location, data) ->
+ path = new Pathname location
+ throw new Error("Location does not exist") unless path.exists()
+
+ File.open path, 'a', (file) ->
+ file.puts YAML.dump data
+
+ data
+
+
+# Rubinius' File.open implementation.
+File.open = (path, mode, block) ->
+ io = new File path, mode
+
+ return io unless block
+
+ try
+ block io
+ finally
+ io.close() unless io.closed()
+
+
+# Write.
+write = (location, data) ->
+ path = new Pathname location
+ raise "Location does not exist" unless path.exists()
+
+ File.open path, 'w', (file) ->
+ return false if Digest.MD5.hexdigest(file.read()) is data.hash()
+ file.puts YAML.dump data
+ true
+
+
+# Rails' respond_to.
+index = ->
+ people = Person.find 'all'
+
+ respond_to (format) ->
+ format.html()
+ format.xml -> render xml: people.xml()
+
+
+# Synchronization.
+synchronize = (block) ->
+ lock()
+ try block() finally unlock()
diff --git a/node_modules/jade/support/coffee-script/examples/code.coffee b/node_modules/jade/support/coffee-script/examples/code.coffee
new file mode 100644
index 0000000..255feba
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/code.coffee
@@ -0,0 +1,171 @@
+# Functions:
+square = (x) -> x * x
+
+sum = (x, y) -> x + y
+
+odd = (x) -> x % 2 isnt 0
+
+even = (x) -> x % 2 is 0
+
+run_loop = ->
+ fire_events((e) -> e.stopPropagation())
+ listen()
+ wait()
+
+# Objects:
+dense_object_literal = {one: 1, two: 2, three: 3}
+
+spaced_out_multiline_object =
+ pi: 3.14159
+ list: [1, 2, 3, 4]
+ regex: /match[ing](every|thing|\/)/gi
+ three: new Idea
+
+ inner_obj:
+ freedom: -> _.freedom()
+
+# Arrays:
+stooges = [{moe: 45}, {curly: 43}, {larry: 46}]
+
+exponents = [((x) -> x), ((x) -> x * x), ((x) -> x * x * x)]
+
+empty = []
+
+multiline = [
+ 'line one'
+ 'line two'
+]
+
+# Conditionals and ternaries.
+if submarine.shields_up
+ full_speed_ahead()
+ fire_torpedos()
+else if submarine.sinking
+ abandon_ship()
+else
+ run_away()
+
+eldest = if 25 > 21 then liz else marge
+
+decoration = medal_of_honor if war_hero
+
+go_to_sleep() unless coffee
+
+# Returning early:
+race = ->
+ run()
+ walk()
+ crawl()
+ if tired then return sleep()
+ race()
+
+# Conditional assignment:
+good or= evil
+wine and= cheese
+
+# Nested property access and calls.
+((moon.turn(360))).shapes[3].move({x: 45, y: 30}).position['top'].offset('x')
+
+a = b = c = 5
+
+# Embedded JavaScript.
+callback(
+ `function(e) { e.stop(); }`
+)
+
+# Try/Catch/Finally/Throw.
+try
+ all_hell_breaks_loose()
+ dogs_and_cats_living_together()
+ throw "up"
+catch error
+ print(error)
+finally
+ clean_up()
+
+try all_hell_breaks_loose() catch error then print(error) finally clean_up()
+
+# While loops, break and continue.
+while demand > supply
+ sell()
+ restock()
+
+while supply > demand then buy()
+
+loop
+ break if broken
+ continue if continuing
+
+# Unary operators.
+!!true
+
+# Lexical scoping.
+v_1 = 5
+change_a_and_set_b = ->
+ v_1 = 10
+ v_2 = 15
+v_2 = 20
+
+# Array comprehensions.
+supper = food.capitalize() for food in ['toast', 'cheese', 'wine']
+
+drink bottle for bottle, i in ['soda', 'wine', 'lemonade'] when even i
+
+# Switch statements ("else" serves as a default).
+activity = switch day
+ when "Tuesday" then eat_breakfast()
+ when "Sunday" then go_to_church()
+ when "Saturday" then go_to_the_park()
+ when "Wednesday"
+ if day is bingo_day
+ go_to_bingo()
+ else
+ eat_breakfast()
+ go_to_work()
+ eat_dinner()
+ else go_to_work()
+
+# Semicolons can optionally be used instead of newlines.
+wednesday = -> eat_breakfast(); go_to_work(); eat_dinner()
+
+# Array slice literals.
+zero_to_nine = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+three_to_six = zero_to_nine[3..6]
+
+# Multiline strings with inner quotes.
+story = "Lorem ipsum dolor \"sit\" amet, consectetuer adipiscing elit,
+sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna
+aliquam erat volutpat. Ut wisi enim ad."
+
+# Inheritance and calling super.
+class Animal
+ constructor: (@name) ->
+
+ move: (meters) ->
+ alert this.name + " moved " + meters + "m."
+
+class Snake extends Animal
+ move: ->
+ alert 'Slithering...'
+ super 5
+
+class Horse extends Animal
+ move: ->
+ alert 'Galloping...'
+ super 45
+
+sam = new Snake "Sammy the Snake"
+tom = new Horse "Tommy the Horse"
+
+sam.move()
+tom.move()
+
+# Numbers.
+a_googol = 1e100
+hex = 0xff0000
+negative = -1.0
+infinity = Infinity
+nan = NaN
+
+# Deleting.
+delete secret.identity
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/examples/computer_science/README b/node_modules/jade/support/coffee-script/examples/computer_science/README
new file mode 100644
index 0000000..1046f9f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/computer_science/README
@@ -0,0 +1,4 @@
+Ported from Nicholas Zakas' collection of computer science fundamentals, written
+in JavaScript. Originals available here:
+
+http://github.com/nzakas/computer-science-in-javascript
diff --git a/node_modules/jade/support/coffee-script/examples/computer_science/binary_search.coffee b/node_modules/jade/support/coffee-script/examples/computer_science/binary_search.coffee
new file mode 100644
index 0000000..69fc678
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/computer_science/binary_search.coffee
@@ -0,0 +1,25 @@
+# Uses a binary search algorithm to locate a value in the specified array.
+binary_search = (items, value) ->
+
+ start = 0
+ stop = items.length - 1
+ pivot = Math.floor (start + stop) / 2
+
+ while items[pivot] isnt value and start < stop
+
+ # Adjust the search area.
+ stop = pivot - 1 if value < items[pivot]
+ start = pivot + 1 if value > items[pivot]
+
+ # Recalculate the pivot.
+ pivot = Math.floor (stop + start) / 2
+
+ # Make sure we've found the correct value.
+ if items[pivot] is value then pivot else -1
+
+
+# Test the function.
+puts 2 is binary_search [10, 20, 30, 40, 50], 30
+puts 4 is binary_search [-97, 35, 67, 88, 1200], 1200
+puts 0 is binary_search [0, 45, 70], 0
+puts(-1 is binary_search [0, 45, 70], 10)
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/examples/computer_science/bubble_sort.coffee b/node_modules/jade/support/coffee-script/examples/computer_science/bubble_sort.coffee
new file mode 100644
index 0000000..4757c8e
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/computer_science/bubble_sort.coffee
@@ -0,0 +1,11 @@
+# A bubble sort implementation, sorting the given array in-place.
+bubble_sort = (list) ->
+ for i in [0...list.length]
+ for j in [0...list.length - i]
+ [list[j], list[j+1]] = [list[j+1], list[j]] if list[j] > list[j+1]
+ list
+
+
+# Test the function.
+puts bubble_sort([3, 2, 1]).join(' ') is '1 2 3'
+puts bubble_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9'
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/examples/computer_science/linked_list.coffee b/node_modules/jade/support/coffee-script/examples/computer_science/linked_list.coffee
new file mode 100644
index 0000000..95bb2ef
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/computer_science/linked_list.coffee
@@ -0,0 +1,108 @@
+# "Classic" linked list implementation that doesn't keep track of its size.
+class LinkedList
+
+ constructor: ->
+ this._head = null # Pointer to the first item in the list.
+
+
+ # Appends some data to the end of the list. This method traverses the existing
+ # list and places the value at the end in a new node.
+ add: (data) ->
+
+ # Create a new node object to wrap the data.
+ node = data: data, next: null
+
+ current = this._head or= node
+
+ if this._head isnt node
+ (current = current.next) while current.next
+ current.next = node
+
+ this
+
+
+ # Retrieves the data at the given position in the list.
+ item: (index) ->
+
+ # Check for out-of-bounds values.
+ return null if index < 0
+
+ current = this._head or null
+ i = -1
+
+ # Advance through the list.
+ (current = current.next) while current and index > (i += 1)
+
+ # Return null if we've reached the end.
+ current and current.data
+
+
+ # Remove the item from the given location in the list.
+ remove: (index) ->
+
+ # Check for out-of-bounds values.
+ return null if index < 0
+
+ current = this._head or null
+ i = -1
+
+ # Special case: removing the first item.
+ if index is 0
+ this._head = current.next
+ else
+
+ # Find the right location.
+ ([previous, current] = [current, current.next]) while index > (i += 1)
+
+ # Skip over the item to remove.
+ previous.next = current.next
+
+ # Return the value.
+ current and current.data
+
+
+ # Calculate the number of items in the list.
+ size: ->
+ current = this._head
+ count = 0
+
+ while current
+ count += 1
+ current = current.next
+
+ count
+
+
+ # Convert the list into an array.
+ toArray: ->
+ result = []
+ current = this._head
+
+ while current
+ result.push current.data
+ current = current.next
+
+ result
+
+
+ # The string representation of the linked list.
+ toString: -> this.toArray().toString()
+
+
+# Tests.
+list = new LinkedList
+
+list.add("Hi")
+puts list.size() is 1
+puts list.item(0) is "Hi"
+puts list.item(1) is null
+
+list = new LinkedList
+list.add("zero").add("one").add("two")
+puts list.size() is 3
+puts list.item(2) is "two"
+puts list.remove(1) is "one"
+puts list.item(0) is "zero"
+puts list.item(1) is "two"
+puts list.size() is 2
+puts list.item(-10) is null
diff --git a/node_modules/jade/support/coffee-script/examples/computer_science/luhn_algorithm.coffee b/node_modules/jade/support/coffee-script/examples/computer_science/luhn_algorithm.coffee
new file mode 100644
index 0000000..db1c544
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/computer_science/luhn_algorithm.coffee
@@ -0,0 +1,36 @@
+# Use the Luhn algorithm to validate a numeric identifier, such as credit card
+# numbers, national insurance numbers, etc.
+# See: http://en.wikipedia.org/wiki/Luhn_algorithm
+
+is_valid_identifier = (identifier) ->
+
+ sum = 0
+ alt = false
+
+ for i in [(identifier.length - 1)..0]
+
+ # Get the next digit.
+ num = parseInt identifier.charAt(i), 10
+
+ # If it's not a valid number, abort.
+ return false if isNaN(num)
+
+ # If it's an alternate number...
+ if alt
+ num *= 2
+ num = (num % 10) + 1 if num > 9
+
+ # Flip the alternate bit.
+ alt = !alt
+
+ # Add to the rest of the sum.
+ sum += num
+
+ # Determine if it's valid.
+ sum % 10 is 0
+
+
+# Tests.
+puts is_valid_identifier("49927398716") is true
+puts is_valid_identifier("4408041234567893") is true
+puts is_valid_identifier("4408041234567890") is false
diff --git a/node_modules/jade/support/coffee-script/examples/computer_science/merge_sort.coffee b/node_modules/jade/support/coffee-script/examples/computer_science/merge_sort.coffee
new file mode 100644
index 0000000..4fb6907
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/computer_science/merge_sort.coffee
@@ -0,0 +1,19 @@
+# Sorts an array in ascending natural order using merge sort.
+merge_sort = (list) ->
+
+ return list if list.length is 1
+
+ result = []
+ pivot = Math.floor list.length / 2
+ left = merge_sort list.slice 0, pivot
+ right = merge_sort list.slice pivot
+
+ while left.length and right.length
+ result.push(if left[0] < right[0] then left.shift() else right.shift())
+
+ result.concat(left).concat(right)
+
+
+# Test the function.
+puts merge_sort([3, 2, 1]).join(' ') is '1 2 3'
+puts merge_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9'
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/examples/computer_science/selection_sort.coffee b/node_modules/jade/support/coffee-script/examples/computer_science/selection_sort.coffee
new file mode 100644
index 0000000..1e87d56
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/computer_science/selection_sort.coffee
@@ -0,0 +1,23 @@
+# An in-place selection sort.
+selection_sort = (list) ->
+ len = list.length
+
+ # For each item in the list.
+ for i in [0...len]
+
+ # Set the minimum to this position.
+ min = i
+
+ # Check the rest of the array to see if anything is smaller.
+ (min = j if list[j] < list[min]) for j in [(i+1)...len]
+
+ # Swap if a smaller item has been found.
+ [list[i], list[min]] = [list[min], list[i]] if i isnt min
+
+ # The list is now sorted.
+ list
+
+
+# Test the function.
+puts selection_sort([3, 2, 1]).join(' ') is '1 2 3'
+puts selection_sort([9, 2, 7, 0, 1]).join(' ') is '0 1 2 7 9'
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/examples/poignant.coffee b/node_modules/jade/support/coffee-script/examples/poignant.coffee
new file mode 100644
index 0000000..dc07ef8
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/poignant.coffee
@@ -0,0 +1,181 @@
+# Examples from the Poignant Guide.
+
+# ['toast', 'cheese', 'wine'].each { |food| print food.capitalize }
+
+['toast', 'wine', 'cheese'].each (food) -> print food.capitalize()
+
+
+
+# class LotteryTicket
+# def picks; @picks; end
+# def picks=(var); @picks = var; end
+# def purchased; @purchased; end
+# def purchased=(var); @purchased = var; end
+# end
+
+LotteryTicket =
+ get_picks: -> @picks
+ set_picks: (@picks) ->
+ get_purchased: -> @purchase
+ set_purchased: (@purchased) ->
+
+
+
+# class << LotteryDraw
+# def play
+# result = LotteryTicket.new_random
+# winners = {}
+# @@tickets.each do |buyer, ticket_list|
+# ticket_list.each do |ticket|
+# score = ticket.score( result )
+# next if score.zero?
+# winners[buyer] ||= []
+# winners[buyer] << [ ticket, score ]
+# end
+# end
+# @@tickets.clear
+# winners
+# end
+# end
+
+LotteryDraw =
+ play: ->
+ result = LotteryTicket.new_random()
+ winners = {}
+ this.tickets.each (buyer, ticket_list) ->
+ ticket_list.each (ticket) ->
+ score = ticket.score result
+ return if score is 0
+ winners[buyer] or= []
+ winners[buyer].push [ticket, score]
+ this.tickets = {}
+ winners
+
+
+
+# module WishScanner
+# def scan_for_a_wish
+# wish = self.read.detect do |thought|
+# thought.index( 'wish: ' ) == 0
+# end
+# wish.gsub( 'wish: ', '' )
+# end
+# end
+
+WishScanner =
+ scan_for_a_wish: ->
+ wish = this.read().detect (thought) -> thought.index('wish: ') is 0
+ wish.replace 'wish: ', ''
+
+
+
+# class Creature
+#
+# # This method applies a hit taken during a fight.
+# def hit( damage )
+# p_up = rand( charisma )
+# if p_up % 9 == 7
+# @life += p_up / 4
+# puts "[#{ self.class } magick powers up #{ p_up }!]"
+# end
+# @life -= damage
+# puts "[#{ self.class } has died.]" if @life <= 0
+# end
+#
+# # This method takes one turn in a fight.
+# def fight( enemy, weapon )
+# if life <= 0
+# puts "[#{ self.class } is too dead to fight!]"
+# return
+# end
+#
+# # Attack the opponent
+# your_hit = rand( strength + weapon )
+# puts "[You hit with #{ your_hit } points of damage!]"
+# enemy.hit( your_hit )
+#
+# # Retaliation
+# p enemy
+# if enemy.life > 0
+# enemy_hit = rand( enemy.strength + enemy.weapon )
+# puts "[Your enemy hit with #{ enemy_hit } points of damage!]"
+# self.hit( enemy_hit )
+# end
+# end
+#
+# end
+
+Creature =
+
+ # This method applies a hit taken during a fight.
+ hit: (damage) ->
+ p_up = Math.rand this.charisma
+ if p_up % 9 is 7
+ this.life += p_up / 4
+ puts "[" + this.name + " magick powers up " + p_up + "!]"
+ this.life -= damage
+ if this.life <= 0 then puts "[" + this.name + " has died.]"
+
+ # This method takes one turn in a fight.
+ fight: (enemy, weapon) ->
+ if this.life <= 0 then return puts "[" + this.name + "is too dead to fight!]"
+
+ # Attack the opponent.
+ your_hit = Math.rand this.strength + weapon
+ puts "[You hit with " + your_hit + "points of damage!]"
+ enemy.hit your_hit
+
+ # Retaliation.
+ puts enemy
+ if enemy.life > 0
+ enemy_hit = Math.rand enemy.strength + enemy.weapon
+ puts "[Your enemy hit with " + enemy_hit + "points of damage!]"
+ this.hit enemy_hit
+
+
+
+# # Get evil idea and swap in code words
+# print "Enter your new idea: "
+# idea = gets
+# code_words.each do |real, code|
+# idea.gsub!( real, code )
+# end
+#
+# # Save the jibberish to a new file
+# print "File encoded. Please enter a name for this idea: "
+# idea_name = gets.strip
+# File::open( "idea-" + idea_name + ".txt", "w" ) do |f|
+# f << idea
+# end
+
+# Get evil idea and swap in code words
+print "Enter your new idea: "
+idea = gets()
+code_words.each (real, code) -> idea.replace(real, code)
+
+# Save the jibberish to a new file
+print "File encoded. Please enter a name for this idea: "
+idea_name = gets().strip()
+File.open "idea-" + idea_name + '.txt', 'w', (file) -> file.write idea
+
+
+
+# def wipe_mutterings_from( sentence )
+# unless sentence.respond_to? :include?
+# raise ArgumentError,
+# "cannot wipe mutterings from a #{ sentence.class }"
+# end
+# while sentence.include? '('
+# open = sentence.index( '(' )
+# close = sentence.index( ')', open )
+# sentence[open..close] = '' if close
+# end
+# end
+
+wipe_mutterings_from = (sentence) ->
+ throw new Error "cannot wipe mutterings" unless sentence.indexOf
+ while sentence.indexOf('(') >= 0
+ open = sentence.indexOf('(') - 1
+ close = sentence.indexOf(')') + 1
+ sentence = sentence[0..open] + sentence[close..sentence.length]
+ sentence
diff --git a/node_modules/jade/support/coffee-script/examples/potion.coffee b/node_modules/jade/support/coffee-script/examples/potion.coffee
new file mode 100644
index 0000000..66c126a
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/potion.coffee
@@ -0,0 +1,206 @@
+# Examples from _why's Potion, the Readme and "Potion: A Short Pamphlet".
+
+# 5 times: "Odelay!" print.
+
+print "Odelay!" for [1..5]
+
+
+# add = (x, y): x + y.
+# add(2, 4) string print
+
+add = (x, y) -> x + y
+print add 2, 4
+
+
+# loop: 'quaff' print.
+
+loop print 'quaff'
+
+
+# ('cheese', 'bread', 'mayo') at (1) print
+
+print ['cheese', 'bread', 'mayo'][1]
+
+
+# (language='Potion', pointless=true) at (key='language') print
+
+print {language: 'Potion', pointless: true}['language']
+
+
+# minus = (x, y): x - y.
+# minus (y=10, x=6)
+
+minus = (x, y) -> x - y
+minus 6, 10
+
+
+# foods = ('cheese', 'bread', 'mayo')
+# foods (2)
+
+foods = ['cheese', 'bread', 'mayo']
+foods[2]
+
+
+# (dog='canine', cat='feline', fox='vulpine') each (key, val):
+# (key, ' is a ', val) join print.
+
+for key, val of {dog: 'canine', cat: 'feline', fox: 'vulpine'}
+ print key + ' is a ' + val
+
+
+# Person = class: /name, /age, /sex.
+# Person print = ():
+# ('My name is ', /name, '.') join print.
+
+class Person
+ print: ->
+ print 'My name is ' + @name + '.'
+
+
+# p = Person ()
+# p /name string print
+
+p = new Person
+print p.name
+
+
+# Policeman = Person class (rank): /rank = rank.
+# Policeman print = ():
+# ('My name is ', /name, ' and I'm a ', /rank, '.') join print.
+#
+# Policeman ('Constable') print
+
+class Policeman extends Person
+ constructor: (@rank) ->
+
+ print: ->
+ print 'My name is ' + @name + " and I'm a " + @rank + '.'
+
+print new Policeman 'Constable'
+
+
+# app = [window (width=200, height=400)
+# [para 'Welcome.', button 'OK']]
+# app first name
+
+app =
+ window:
+ width: 200
+ height: 200
+ para: 'Welcome.'
+ button: 'OK'
+
+app.window
+
+
+# x = 1
+# y = 2
+#
+# x = 1, y = 2
+
+x = 1
+y = 2
+
+x = 1; y = 2
+
+
+# table = (language='Potion'
+# pointless=true)
+
+table =
+ language: 'Potion'
+ pointless: yes
+
+
+# # this foul business...
+# String length = (): 10.
+
+# this foul business...
+String::length = -> 10
+
+
+# block = :
+# 'potion' print.
+
+block = ->
+ print 'potion'
+
+
+# if (age > 100): 'ancient'.
+
+if age > 100 then 'ancient'
+
+
+# author =
+# if (title == 'Jonathan Strange & Mr. Norrell'):
+# 'Susanna Clarke'.
+# elsif (title == 'The Star Diaries'):
+# 'Stanislaw Lem'.
+# elsif (title == 'The Slynx'):
+# 'Tatyana Tolstaya'.
+# else:
+# '... probably Philip K. Dick'.
+
+switch author
+ when 'Jonathan Strange & Mr. Norrell'
+ 'Susanna Clarke'
+ when 'The Star Diaries'
+ 'Stanislaw Lem'
+ when 'The Slynx'
+ 'Tatyana Tolstaya'
+ else
+ '... probably Philip K. Dick'
+
+
+# count = 8
+# while (count > 0):
+# 'quaff' print
+# count--.
+
+count = 8
+while count > 0
+ print 'quaff'
+ count--
+
+
+# 1 to 5 (a):
+# a string print.
+
+print a for a in [1..5]
+
+
+# if (3 ?gender):
+# "Huh? Numbers are sexed? That's amazing." print.
+
+if (3).gender?
+ print "Huh? Numbers are sexed? That's amazing."
+
+
+# HomePage get = (url):
+# session = url query ? at ('session').
+
+HomePage::get = (url) ->
+ session = url.query.session if url.query?
+
+
+# BTree = class: /left, /right.
+# b = BTree ()
+# b /left = BTree ()
+# b /right = BTree ()
+
+BTree = ->
+b = new BTree
+b.left = new BTree
+b.right = new BTree
+
+
+# BTree = class: /left, /right.
+# b = BTree ()
+#
+# if (b ? /left):
+# 'left path found!' print.
+
+BTree = ->
+b = new BTree
+
+print 'left path found!' if b.left?
diff --git a/node_modules/jade/support/coffee-script/examples/underscore.coffee b/node_modules/jade/support/coffee-script/examples/underscore.coffee
new file mode 100644
index 0000000..d6ef6b9
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/underscore.coffee
@@ -0,0 +1,684 @@
+
+ # **Underscore.coffee
+ # (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.**
+ # Underscore is freely distributable under the terms of the
+ # [MIT license](http://en.wikipedia.org/wiki/MIT_License).
+ # Portions of Underscore are inspired by or borrowed from
+ # [Prototype.js](http://prototypejs.org/api), Oliver Steele's
+ # [Functional](http://osteele.com), and John Resig's
+ # [Micro-Templating](http://ejohn.org).
+ # For all details and documentation:
+ # http://documentcloud.github.com/underscore/
+
+
+ # Baseline setup
+ # --------------
+
+ # Establish the root object, `window` in the browser, or `global` on the server.
+ root = this
+
+
+ # Save the previous value of the `_` variable.
+ previousUnderscore = root._
+
+
+ # Establish the object that gets thrown to break out of a loop iteration.
+ # `StopIteration` is SOP on Mozilla.
+ breaker = if typeof(StopIteration) is 'undefined' then '__break__' else StopIteration
+
+
+ # Helper function to escape **RegExp** contents, because JS doesn't have one.
+ escapeRegExp = (string) -> string.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1')
+
+
+ # Save bytes in the minified (but not gzipped) version:
+ ArrayProto = Array.prototype
+ ObjProto = Object.prototype
+
+
+ # Create quick reference variables for speed access to core prototypes.
+ slice = ArrayProto.slice
+ unshift = ArrayProto.unshift
+ toString = ObjProto.toString
+ hasOwnProperty = ObjProto.hasOwnProperty
+ propertyIsEnumerable = ObjProto.propertyIsEnumerable
+
+
+ # All **ECMA5** native implementations we hope to use are declared here.
+ nativeForEach = ArrayProto.forEach
+ nativeMap = ArrayProto.map
+ nativeReduce = ArrayProto.reduce
+ nativeReduceRight = ArrayProto.reduceRight
+ nativeFilter = ArrayProto.filter
+ nativeEvery = ArrayProto.every
+ nativeSome = ArrayProto.some
+ nativeIndexOf = ArrayProto.indexOf
+ nativeLastIndexOf = ArrayProto.lastIndexOf
+ nativeIsArray = Array.isArray
+ nativeKeys = Object.keys
+
+
+ # Create a safe reference to the Underscore object for use below.
+ _ = (obj) -> new wrapper(obj)
+
+
+ # Export the Underscore object for **CommonJS**.
+ if typeof(exports) != 'undefined' then exports._ = _
+
+
+ # Export Underscore to global scope.
+ root._ = _
+
+
+ # Current version.
+ _.VERSION = '1.1.0'
+
+
+ # Collection Functions
+ # --------------------
+
+ # The cornerstone, an **each** implementation.
+ # Handles objects implementing **forEach**, arrays, and raw objects.
+ _.each = (obj, iterator, context) ->
+ try
+ if nativeForEach and obj.forEach is nativeForEach
+ obj.forEach iterator, context
+ else if _.isNumber obj.length
+ iterator.call(context, obj[i], i, obj) for i in [0...obj.length]
+ else
+ iterator.call(context, val, key, obj) for key, val of obj
+ catch e
+ throw e if e isnt breaker
+ obj
+
+
+ # Return the results of applying the iterator to each element. Use JavaScript
+ # 1.6's version of **map**, if possible.
+ _.map = (obj, iterator, context) ->
+ return obj.map(iterator, context) if nativeMap and obj.map is nativeMap
+ results = []
+ _.each obj, (value, index, list) ->
+ results.push iterator.call context, value, index, list
+ results
+
+
+ # **Reduce** builds up a single result from a list of values. Also known as
+ # **inject**, or **foldl**. Uses JavaScript 1.8's version of **reduce**, if possible.
+ _.reduce = (obj, iterator, memo, context) ->
+ if nativeReduce and obj.reduce is nativeReduce
+ iterator = _.bind iterator, context if context
+ return obj.reduce iterator, memo
+ _.each obj, (value, index, list) ->
+ memo = iterator.call context, memo, value, index, list
+ memo
+
+
+ # The right-associative version of **reduce**, also known as **foldr**. Uses
+ # JavaScript 1.8's version of **reduceRight**, if available.
+ _.reduceRight = (obj, iterator, memo, context) ->
+ if nativeReduceRight and obj.reduceRight is nativeReduceRight
+ iterator = _.bind iterator, context if context
+ return obj.reduceRight iterator, memo
+ reversed = _.clone(_.toArray(obj)).reverse()
+ _.reduce reversed, iterator, memo, context
+
+
+ # Return the first value which passes a truth test.
+ _.detect = (obj, iterator, context) ->
+ result = null
+ _.each obj, (value, index, list) ->
+ if iterator.call context, value, index, list
+ result = value
+ _.breakLoop()
+ result
+
+
+ # Return all the elements that pass a truth test. Use JavaScript 1.6's
+ # **filter**, if it exists.
+ _.filter = (obj, iterator, context) ->
+ return obj.filter iterator, context if nativeFilter and obj.filter is nativeFilter
+ results = []
+ _.each obj, (value, index, list) ->
+ results.push value if iterator.call context, value, index, list
+ results
+
+
+ # Return all the elements for which a truth test fails.
+ _.reject = (obj, iterator, context) ->
+ results = []
+ _.each obj, (value, index, list) ->
+ results.push value if not iterator.call context, value, index, list
+ results
+
+
+ # Determine whether all of the elements match a truth test. Delegate to
+ # JavaScript 1.6's **every**, if it is present.
+ _.every = (obj, iterator, context) ->
+ iterator ||= _.identity
+ return obj.every iterator, context if nativeEvery and obj.every is nativeEvery
+ result = true
+ _.each obj, (value, index, list) ->
+ _.breakLoop() unless (result = result and iterator.call(context, value, index, list))
+ result
+
+
+ # Determine if at least one element in the object matches a truth test. Use
+ # JavaScript 1.6's **some**, if it exists.
+ _.some = (obj, iterator, context) ->
+ iterator ||= _.identity
+ return obj.some iterator, context if nativeSome and obj.some is nativeSome
+ result = false
+ _.each obj, (value, index, list) ->
+ _.breakLoop() if (result = iterator.call(context, value, index, list))
+ result
+
+
+ # Determine if a given value is included in the array or object,
+ # based on `===`.
+ _.include = (obj, target) ->
+ return _.indexOf(obj, target) isnt -1 if nativeIndexOf and obj.indexOf is nativeIndexOf
+ for key, val of obj
+ return true if val is target
+ false
+
+
+ # Invoke a method with arguments on every item in a collection.
+ _.invoke = (obj, method) ->
+ args = _.rest arguments, 2
+ (if method then val[method] else val).apply(val, args) for val in obj
+
+
+ # Convenience version of a common use case of **map**: fetching a property.
+ _.pluck = (obj, key) ->
+ _.map(obj, (val) -> val[key])
+
+
+ # Return the maximum item or (item-based computation).
+ _.max = (obj, iterator, context) ->
+ return Math.max.apply(Math, obj) if not iterator and _.isArray(obj)
+ result = computed: -Infinity
+ _.each obj, (value, index, list) ->
+ computed = if iterator then iterator.call(context, value, index, list) else value
+ computed >= result.computed and (result = {value: value, computed: computed})
+ result.value
+
+
+ # Return the minimum element (or element-based computation).
+ _.min = (obj, iterator, context) ->
+ return Math.min.apply(Math, obj) if not iterator and _.isArray(obj)
+ result = computed: Infinity
+ _.each obj, (value, index, list) ->
+ computed = if iterator then iterator.call(context, value, index, list) else value
+ computed < result.computed and (result = {value: value, computed: computed})
+ result.value
+
+
+ # Sort the object's values by a criterion produced by an iterator.
+ _.sortBy = (obj, iterator, context) ->
+ _.pluck(((_.map obj, (value, index, list) ->
+ {value: value, criteria: iterator.call(context, value, index, list)}
+ ).sort((left, right) ->
+ a = left.criteria; b = right.criteria
+ if a < b then -1 else if a > b then 1 else 0
+ )), 'value')
+
+
+ # Use a comparator function to figure out at what index an object should
+ # be inserted so as to maintain order. Uses binary search.
+ _.sortedIndex = (array, obj, iterator) ->
+ iterator ||= _.identity
+ low = 0
+ high = array.length
+ while low < high
+ mid = (low + high) >> 1
+ if iterator(array[mid]) < iterator(obj) then low = mid + 1 else high = mid
+ low
+
+
+ # Convert anything iterable into a real, live array.
+ _.toArray = (iterable) ->
+ return [] if (!iterable)
+ return iterable.toArray() if (iterable.toArray)
+ return iterable if (_.isArray(iterable))
+ return slice.call(iterable) if (_.isArguments(iterable))
+ _.values(iterable)
+
+
+ # Return the number of elements in an object.
+ _.size = (obj) -> _.toArray(obj).length
+
+
+ # Array Functions
+ # ---------------
+
+ # Get the first element of an array. Passing `n` will return the first N
+ # values in the array. Aliased as **head**. The `guard` check allows it to work
+ # with **map**.
+ _.first = (array, n, guard) ->
+ if n and not guard then slice.call(array, 0, n) else array[0]
+
+
+ # Returns everything but the first entry of the array. Aliased as **tail**.
+ # Especially useful on the arguments object. Passing an `index` will return
+ # the rest of the values in the array from that index onward. The `guard`
+ # check allows it to work with **map**.
+ _.rest = (array, index, guard) ->
+ slice.call(array, if _.isUndefined(index) or guard then 1 else index)
+
+
+ # Get the last element of an array.
+ _.last = (array) -> array[array.length - 1]
+
+
+ # Trim out all falsy values from an array.
+ _.compact = (array) -> item for item in array when item
+
+
+ # Return a completely flattened version of an array.
+ _.flatten = (array) ->
+ _.reduce array, (memo, value) ->
+ return memo.concat(_.flatten(value)) if _.isArray value
+ memo.push value
+ memo
+ , []
+
+
+ # Return a version of the array that does not contain the specified value(s).
+ _.without = (array) ->
+ values = _.rest arguments
+ val for val in _.toArray(array) when not _.include values, val
+
+
+ # Produce a duplicate-free version of the array. If the array has already
+ # been sorted, you have the option of using a faster algorithm.
+ _.uniq = (array, isSorted) ->
+ memo = []
+ for el, i in _.toArray array
+ memo.push el if i is 0 || (if isSorted is true then _.last(memo) isnt el else not _.include(memo, el))
+ memo
+
+
+ # Produce an array that contains every item shared between all the
+ # passed-in arrays.
+ _.intersect = (array) ->
+ rest = _.rest arguments
+ _.select _.uniq(array), (item) ->
+ _.all rest, (other) ->
+ _.indexOf(other, item) >= 0
+
+
+ # Zip together multiple lists into a single array -- elements that share
+ # an index go together.
+ _.zip = ->
+ length = _.max _.pluck arguments, 'length'
+ results = new Array length
+ for i in [0...length]
+ results[i] = _.pluck arguments, String i
+ results
+
+
+ # If the browser doesn't supply us with **indexOf** (I'm looking at you, MSIE),
+ # we need this function. Return the position of the first occurence of an
+ # item in an array, or -1 if the item is not included in the array.
+ _.indexOf = (array, item) ->
+ return array.indexOf item if nativeIndexOf and array.indexOf is nativeIndexOf
+ i = 0; l = array.length
+ while l - i
+ if array[i] is item then return i else i++
+ -1
+
+
+ # Provide JavaScript 1.6's **lastIndexOf**, delegating to the native function,
+ # if possible.
+ _.lastIndexOf = (array, item) ->
+ return array.lastIndexOf(item) if nativeLastIndexOf and array.lastIndexOf is nativeLastIndexOf
+ i = array.length
+ while i
+ if array[i] is item then return i else i--
+ -1
+
+
+ # Generate an integer Array containing an arithmetic progression. A port of
+ # [the native Python **range** function](http://docs.python.org/library/functions.html#range).
+ _.range = (start, stop, step) ->
+ a = arguments
+ solo = a.length <= 1
+ i = start = if solo then 0 else a[0]
+ stop = if solo then a[0] else a[1]
+ step = a[2] or 1
+ len = Math.ceil((stop - start) / step)
+ return [] if len <= 0
+ range = new Array len
+ idx = 0
+ loop
+ return range if (if step > 0 then i - stop else stop - i) >= 0
+ range[idx] = i
+ idx++
+ i+= step
+
+
+ # Function Functions
+ # ------------------
+
+ # Create a function bound to a given object (assigning `this`, and arguments,
+ # optionally). Binding with arguments is also known as **curry**.
+ _.bind = (func, obj) ->
+ args = _.rest arguments, 2
+ -> func.apply obj or root, args.concat arguments
+
+
+ # Bind all of an object's methods to that object. Useful for ensuring that
+ # all callbacks defined on an object belong to it.
+ _.bindAll = (obj) ->
+ funcs = if arguments.length > 1 then _.rest(arguments) else _.functions(obj)
+ _.each funcs, (f) -> obj[f] = _.bind obj[f], obj
+ obj
+
+
+ # Delays a function for the given number of milliseconds, and then calls
+ # it with the arguments supplied.
+ _.delay = (func, wait) ->
+ args = _.rest arguments, 2
+ setTimeout((-> func.apply(func, args)), wait)
+
+
+ # Memoize an expensive function by storing its results.
+ _.memoize = (func, hasher) ->
+ memo = {}
+ hasher or= _.identity
+ ->
+ key = hasher.apply this, arguments
+ return memo[key] if key of memo
+ memo[key] = func.apply this, arguments
+
+
+ # Defers a function, scheduling it to run after the current call stack has
+ # cleared.
+ _.defer = (func) ->
+ _.delay.apply _, [func, 1].concat _.rest arguments
+
+
+ # Returns the first function passed as an argument to the second,
+ # allowing you to adjust arguments, run code before and after, and
+ # conditionally execute the original function.
+ _.wrap = (func, wrapper) ->
+ -> wrapper.apply wrapper, [func].concat arguments
+
+
+ # Returns a function that is the composition of a list of functions, each
+ # consuming the return value of the function that follows.
+ _.compose = ->
+ funcs = arguments
+ ->
+ args = arguments
+ for i in [(funcs.length - 1)..0]
+ args = [funcs[i].apply(this, args)]
+ args[0]
+
+
+ # Object Functions
+ # ----------------
+
+ # Retrieve the names of an object's properties.
+ _.keys = nativeKeys or (obj) ->
+ return _.range 0, obj.length if _.isArray(obj)
+ key for key, val of obj
+
+
+ # Retrieve the values of an object's properties.
+ _.values = (obj) ->
+ _.map obj, _.identity
+
+
+ # Return a sorted list of the function names available in Underscore.
+ _.functions = (obj) ->
+ _.filter(_.keys(obj), (key) -> _.isFunction(obj[key])).sort()
+
+
+ # Extend a given object with all of the properties in a source object.
+ _.extend = (obj) ->
+ for source in _.rest(arguments)
+ (obj[key] = val) for key, val of source
+ obj
+
+
+ # Create a (shallow-cloned) duplicate of an object.
+ _.clone = (obj) ->
+ return obj.slice 0 if _.isArray obj
+ _.extend {}, obj
+
+
+ # Invokes interceptor with the obj, and then returns obj.
+ # The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain.
+ _.tap = (obj, interceptor) ->
+ interceptor obj
+ obj
+
+
+ # Perform a deep comparison to check if two objects are equal.
+ _.isEqual = (a, b) ->
+ # Check object identity.
+ return true if a is b
+ # Different types?
+ atype = typeof(a); btype = typeof(b)
+ return false if atype isnt btype
+ # Basic equality test (watch out for coercions).
+ return true if `a == b`
+ # One is falsy and the other truthy.
+ return false if (!a and b) or (a and !b)
+ # One of them implements an `isEqual()`?
+ return a.isEqual(b) if a.isEqual
+ # Check dates' integer values.
+ return a.getTime() is b.getTime() if _.isDate(a) and _.isDate(b)
+ # Both are NaN?
+ return false if _.isNaN(a) and _.isNaN(b)
+ # Compare regular expressions.
+ if _.isRegExp(a) and _.isRegExp(b)
+ return a.source is b.source and
+ a.global is b.global and
+ a.ignoreCase is b.ignoreCase and
+ a.multiline is b.multiline
+ # If a is not an object by this point, we can't handle it.
+ return false if atype isnt 'object'
+ # Check for different array lengths before comparing contents.
+ return false if a.length and (a.length isnt b.length)
+ # Nothing else worked, deep compare the contents.
+ aKeys = _.keys(a); bKeys = _.keys(b)
+ # Different object sizes?
+ return false if aKeys.length isnt bKeys.length
+ # Recursive comparison of contents.
+ (return false) for all key, val of a when !(key of b) or !_.isEqual(val, b[key])
+ true
+
+
+ # Is a given array or object empty?
+ _.isEmpty = (obj) ->
+ return obj.length is 0 if _.isArray(obj) or _.isString(obj)
+ (return false) for key of obj when hasOwnProperty.call(obj, key)
+ true
+
+
+ # Is a given value a DOM element?
+ _.isElement = (obj) -> obj and obj.nodeType is 1
+
+
+ # Is a given value an array?
+ _.isArray = nativeIsArray or (obj) -> !!(obj and obj.concat and obj.unshift and not obj.callee)
+
+
+ # Is a given variable an arguments object?
+ _.isArguments = (obj) -> obj and obj.callee
+
+
+ # Is the given value a function?
+ _.isFunction = (obj) -> !!(obj and obj.constructor and obj.call and obj.apply)
+
+
+ # Is the given value a string?
+ _.isString = (obj) -> !!(obj is '' or (obj and obj.charCodeAt and obj.substr))
+
+
+ # Is a given value a number?
+ _.isNumber = (obj) -> (obj is +obj) or toString.call(obj) is '[object Number]'
+
+
+ # Is a given value a boolean?
+ _.isBoolean = (obj) -> obj is true or obj is false
+
+
+ # Is a given value a Date?
+ _.isDate = (obj) -> !!(obj and obj.getTimezoneOffset and obj.setUTCFullYear)
+
+
+ # Is the given value a regular expression?
+ _.isRegExp = (obj) -> !!(obj and obj.exec and (obj.ignoreCase or obj.ignoreCase is false))
+
+
+ # Is the given value NaN -- this one is interesting. `NaN != NaN`, and
+ # `isNaN(undefined) == true`, so we make sure it's a number first.
+ _.isNaN = (obj) -> _.isNumber(obj) and window.isNaN(obj)
+
+
+ # Is a given value equal to null?
+ _.isNull = (obj) -> obj is null
+
+
+ # Is a given variable undefined?
+ _.isUndefined = (obj) -> typeof obj is 'undefined'
+
+
+ # Utility Functions
+ # -----------------
+
+ # Run Underscore.js in noConflict mode, returning the `_` variable to its
+ # previous owner. Returns a reference to the Underscore object.
+ _.noConflict = ->
+ root._ = previousUnderscore
+ this
+
+
+ # Keep the identity function around for default iterators.
+ _.identity = (value) -> value
+
+
+ # Run a function `n` times.
+ _.times = (n, iterator, context) ->
+ iterator.call(context, i) for i in [0...n]
+
+
+ # Break out of the middle of an iteration.
+ _.breakLoop = -> throw breaker
+
+
+ # Add your own custom functions to the Underscore object, ensuring that
+ # they're correctly added to the OOP wrapper as well.
+ _.mixin = (obj) ->
+ for name in _.functions(obj)
+ addToWrapper name, _[name] = obj[name]
+
+
+ # Generate a unique integer id (unique within the entire client session).
+ # Useful for temporary DOM ids.
+ idCounter = 0
+ _.uniqueId = (prefix) ->
+ (prefix or '') + idCounter++
+
+
+ # By default, Underscore uses **ERB**-style template delimiters, change the
+ # following template settings to use alternative delimiters.
+ _.templateSettings = {
+ start: '<%'
+ end: '%>'
+ interpolate: /<%=(.+?)%>/g
+ }
+
+
+ # JavaScript templating a-la **ERB**, pilfered from John Resig's
+ # *Secrets of the JavaScript Ninja*, page 83.
+ # Single-quote fix from Rick Strahl.
+ # With alterations for arbitrary delimiters, and to preserve whitespace.
+ _.template = (str, data) ->
+ c = _.templateSettings
+ endMatch = new RegExp("'(?=[^"+c.end.substr(0, 1)+"]*"+escapeRegExp(c.end)+")","g")
+ fn = new Function 'obj',
+ 'var p=[],print=function(){p.push.apply(p,arguments);};' +
+ 'with(obj||{}){p.push(\'' +
+ str.replace(/\r/g, '\\r')
+ .replace(/\n/g, '\\n')
+ .replace(/\t/g, '\\t')
+ .replace(endMatch,"✄")
+ .split("'").join("\\'")
+ .split("✄").join("'")
+ .replace(c.interpolate, "',$1,'")
+ .split(c.start).join("');")
+ .split(c.end).join("p.push('") +
+ "');}return p.join('');"
+ if data then fn(data) else fn
+
+
+ # Aliases
+ # -------
+
+ _.forEach = _.each
+ _.foldl = _.inject = _.reduce
+ _.foldr = _.reduceRight
+ _.select = _.filter
+ _.all = _.every
+ _.any = _.some
+ _.contains = _.include
+ _.head = _.first
+ _.tail = _.rest
+ _.methods = _.functions
+
+
+ # Setup the OOP Wrapper
+ # ---------------------
+
+ # If Underscore is called as a function, it returns a wrapped object that
+ # can be used OO-style. This wrapper holds altered versions of all the
+ # underscore functions. Wrapped objects may be chained.
+ wrapper = (obj) ->
+ this._wrapped = obj
+ this
+
+
+ # Helper function to continue chaining intermediate results.
+ result = (obj, chain) ->
+ if chain then _(obj).chain() else obj
+
+
+ # A method to easily add functions to the OOP wrapper.
+ addToWrapper = (name, func) ->
+ wrapper.prototype[name] = ->
+ args = _.toArray arguments
+ unshift.call args, this._wrapped
+ result func.apply(_, args), this._chain
+
+
+ # Add all of the Underscore functions to the wrapper object.
+ _.mixin _
+
+
+ # Add all mutator Array functions to the wrapper.
+ _.each ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], (name) ->
+ method = Array.prototype[name]
+ wrapper.prototype[name] = ->
+ method.apply(this._wrapped, arguments)
+ result(this._wrapped, this._chain)
+
+
+ # Add all accessor Array functions to the wrapper.
+ _.each ['concat', 'join', 'slice'], (name) ->
+ method = Array.prototype[name]
+ wrapper.prototype[name] = ->
+ result(method.apply(this._wrapped, arguments), this._chain)
+
+
+ # Start chaining a wrapped Underscore object.
+ wrapper::chain = ->
+ this._chain = true
+ this
+
+
+ # Extracts the result from a wrapped and chained object.
+ wrapper::value = -> this._wrapped
diff --git a/node_modules/jade/support/coffee-script/examples/web_server.coffee b/node_modules/jade/support/coffee-script/examples/web_server.coffee
new file mode 100644
index 0000000..c2ee089
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/examples/web_server.coffee
@@ -0,0 +1,13 @@
+# Contributed by Jason Huggins
+
+sys = require 'sys'
+http = require 'http'
+
+server = http.createServer (req, res) ->
+ res.writeHeader 200, 'Content-Type': 'text/plain'
+ res.write 'Hello, World!'
+ res.end()
+
+server.listen 3000
+
+sys.puts "Server running at http://localhost:3000/"
diff --git a/node_modules/jade/support/coffee-script/extras/EXTRAS b/node_modules/jade/support/coffee-script/extras/EXTRAS
new file mode 100644
index 0000000..79ec413
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/extras/EXTRAS
@@ -0,0 +1,7 @@
+EXTRAS:
+
+"extras/coffee-script.js" is a concatenated and compressed version of the
+CoffeeScript compiler. To use it in the browser, include the script after any
+inline script tags of type "text/coffeescript" on the page. It will compile
+and evaluate all of the scripts in order.
+
diff --git a/node_modules/jade/support/coffee-script/extras/coffee-script.js b/node_modules/jade/support/coffee-script/extras/coffee-script.js
new file mode 100644
index 0000000..71b8181
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/extras/coffee-script.js
@@ -0,0 +1,8 @@
+/**
+ * CoffeeScript Compiler v0.9.4
+ * http://coffeescript.org
+ *
+ * Copyright 2010, Jeremy Ashkenas
+ * Released under the MIT License
+ */
+this.CoffeeScript=function(){function require(path){return require[path]}require["./helpers"]=new function(){var exports=this;(function(){var extend,flatten,indexOf;indexOf=(exports.indexOf=Array.indexOf||(Array.prototype.indexOf?function(array,item,from){return array.indexOf(item,from)}:function(array,item,from){var _len,index,other;for(index=0,_len=array.length;index<_len;index++){other=array[index];if(other===item&&(!from||(from<=index))){return index}}return -1}));exports.include=function(list,value){return indexOf(list,value)>=0};exports.starts=function(string,literal,start){return literal===string.substr(start,literal.length)};exports.ends=function(string,literal,back){var len;len=literal.length;return literal===string.substr(string.length-len-(back||0),len)};exports.compact=function(array){var _i,_len,_result,item;_result=[];for(_i=0,_len=array.length;_i<_len;_i++){item=array[_i];if(item){_result.push(item)}}return _result};exports.count=function(string,letter){var num,pos;num=(pos=0);while(pos=1+string.indexOf(letter,pos)){num++}return num};exports.merge=function(options,overrides){return extend(extend({},options),overrides)};extend=(exports.extend=function(object,properties){var key,val;for(key in properties){val=properties[key];object[key]=val}return object});exports.flatten=(flatten=function(array){var _i,_len,element,flattened;flattened=[];for(_i=0,_len=array.length;_i<_len;_i++){element=array[_i];if(element instanceof Array){flattened=flattened.concat(flatten(element))}else{flattened.push(element)}}return flattened});exports.del=function(obj,key){var val;val=obj[key];delete obj[key];return val};exports.last=function(array,back){return array[array.length-(back||0)-1]}}).call(this)};require["./rewriter"]=new function(){var exports=this;(function(){var BALANCED_PAIRS,EXPRESSION_CLOSE,EXPRESSION_END,EXPRESSION_START,IMPLICIT_BLOCK,IMPLICIT_CALL,IMPLICIT_END,IMPLICIT_FUNC,INVERSES,LINEBREAKS,SINGLE_CLOSERS,SINGLE_LINERS,_i,_len,_ref,include,left,rite;include=require("./helpers").include;exports.Rewriter=(function(){function Rewriter(){}return Rewriter})();exports.Rewriter.prototype.rewrite=function(_arg){this.tokens=_arg;this.adjustComments();this.removeLeadingNewlines();this.removeMidExpressionNewlines();this.closeOpenCalls();this.closeOpenIndexes();this.addImplicitIndentation();this.tagPostfixConditionals();this.addImplicitBraces();this.addImplicitParentheses();this.ensureBalance(BALANCED_PAIRS);this.rewriteClosingParens();return this.tokens};exports.Rewriter.prototype.scanTokens=function(block){var i,token,tokens;tokens=this.tokens;i=0;while(token=tokens[i]){i+=block.call(this,token,i,tokens)}return true};exports.Rewriter.prototype.detectEnd=function(i,condition,action){var levels,token,tokens;tokens=this.tokens;levels=0;while(token=tokens[i]){if(levels===0&&condition.call(this,token,i)){return action.call(this,token,i)}if(!token||levels<0){return action.call(this,token,i-1)}if(include(EXPRESSION_START,token[0])){levels+=1}else{if(include(EXPRESSION_END,token[0])){levels-=1}}i+=1}return i-1};exports.Rewriter.prototype.adjustComments=function(){return this.scanTokens(function(token,i,tokens){var _ref,after,before,post,prev;if(token[0]!=="HERECOMMENT"){return 1}before=tokens[i-2];prev=tokens[i-1];post=tokens[i+1];after=tokens[i+2];if(((after!=null)?after[0]:undefined)==="INDENT"){tokens.splice(i+2,1);if(((before!=null)?before[0]:undefined)==="OUTDENT"&&((post!=null)?post[0]:undefined)==="TERMINATOR"){tokens.splice(i-2,1)}else{tokens.splice(i,0,after)}}else{if(prev&&!((_ref=prev[0])==="TERMINATOR"||_ref==="INDENT"||_ref==="OUTDENT")){if(((post!=null)?post[0]:undefined)==="TERMINATOR"&&((after!=null)?after[0]:undefined)==="OUTDENT"){tokens.splice.apply(tokens,[i+2,0].concat(tokens.splice(i,2)));if(tokens[i+2][0]!=="TERMINATOR"){tokens.splice(i+2,0,["TERMINATOR","\n",prev[2]])}}else{tokens.splice(i,0,["TERMINATOR","\n",prev[2]])}return 2}}return 1})};exports.Rewriter.prototype.removeLeadingNewlines=function(){var _len,_ref,i,tag;for(i=0,_len=(_ref=this.tokens).length;i<_len;i++){tag=_ref[i][0];if(tag!=="TERMINATOR"){break}}return i?this.tokens.splice(0,i):undefined};exports.Rewriter.prototype.removeMidExpressionNewlines=function(){return this.scanTokens(function(token,i,tokens){if(!(token[0]==="TERMINATOR"&&include(EXPRESSION_CLOSE,this.tag(i+1)))){return 1}tokens.splice(i,1);return 0})};exports.Rewriter.prototype.closeOpenCalls=function(){var action,condition;condition=function(token,i){var _ref;return((_ref=token[0])===")"||_ref==="CALL_END")||token[0]==="OUTDENT"&&this.tag(i-1)===")"};action=function(token,i){return(this.tokens[token[0]==="OUTDENT"?i-1:i][0]="CALL_END")};return this.scanTokens(function(token,i){if(token[0]==="CALL_START"){this.detectEnd(i+1,condition,action)}return 1})};exports.Rewriter.prototype.closeOpenIndexes=function(){var action,condition;condition=function(token,i){var _ref;return((_ref=token[0])==="]"||_ref==="INDEX_END")};action=function(token,i){return(token[0]="INDEX_END")};return this.scanTokens(function(token,i){if(token[0]==="INDEX_START"){this.detectEnd(i+1,condition,action)}return 1})};exports.Rewriter.prototype.addImplicitBraces=function(){var action,condition,stack;stack=[];condition=function(token,i){var _ref,_ref2,one,tag,three,two;if(("HERECOMMENT"===this.tag(i+1)||"HERECOMMENT"===this.tag(i-1))){return false}_ref=this.tokens.slice(i+1,i+4),one=_ref[0],two=_ref[1],three=_ref[2];tag=token[0];return(tag==="TERMINATOR"||tag==="OUTDENT")&&!(((two!=null)?two[0]:undefined)===":"||((one!=null)?one[0]:undefined)==="@"&&((three!=null)?three[0]:undefined)===":")||tag===","&&!((_ref2=((one!=null)?one[0]:undefined))==="IDENTIFIER"||_ref2==="NUMBER"||_ref2==="STRING"||_ref2==="@"||_ref2==="TERMINATOR"||_ref2==="OUTDENT")};action=function(token,i){return this.tokens.splice(i,0,["}","}",token[2]])};return this.scanTokens(function(token,i,tokens){var idx,tag,tok;if(include(EXPRESSION_START,tag=token[0])){stack.push(tag==="INDENT"&&this.tag(i-1)==="{"?"{":tag);return 1}if(include(EXPRESSION_END,tag)){stack.pop();return 1}if(!(tag===":"&&stack[stack.length-1]!=="{")){return 1}stack.push("{");idx=this.tag(i-2)==="@"?i-2:i-1;if(this.tag(idx-2)==="HERECOMMENT"){idx-=2}tok=["{","{",token[2]];tok.generated=true;tokens.splice(idx,0,tok);this.detectEnd(i+2,condition,action);return 2})};exports.Rewriter.prototype.addImplicitParentheses=function(){var action,classLine;classLine=false;action=function(token,i){var idx;idx=token[0]==="OUTDENT"?i+1:i;return this.tokens.splice(idx,0,["CALL_END",")",token[2]])};return this.scanTokens(function(token,i,tokens){var callObject,next,prev,seenSingle,tag;tag=token[0];if(tag==="CLASS"){classLine=true}prev=tokens[i-1];next=tokens[i+1];callObject=!classLine&&tag==="INDENT"&&next&&next.generated&&next[0]==="{"&&prev&&include(IMPLICIT_FUNC,prev[0]);seenSingle=false;if(include(LINEBREAKS,tag)){classLine=false}if(prev&&!prev.spaced&&tag==="?"){token.call=true}if(!(callObject||((prev!=null)?prev.spaced:undefined)&&(prev.call||include(IMPLICIT_FUNC,prev[0]))&&include(IMPLICIT_CALL,tag))){return 1}tokens.splice(i,0,["CALL_START","(",token[2]]);this.detectEnd(i+(callObject?2:1),function(token,i){var post;if(!seenSingle&&token.fromThen){return true}tag=token[0];if((tag==="IF"||tag==="ELSE"||tag==="UNLESS"||tag==="->"||tag==="=>")){seenSingle=true}if(tag==="PROPERTY_ACCESS"&&this.tag(i-1)==="OUTDENT"){return true}return !token.generated&&this.tag(i-1)!==","&&include(IMPLICIT_END,tag)&&(tag!=="INDENT"||(this.tag(i-2)!=="CLASS"&&!include(IMPLICIT_BLOCK,this.tag(i-1))&&!((post=this.tokens[i+1])&&post.generated&&post[0]==="{")))},action);if(prev[0]==="?"){prev[0]="FUNC_EXIST"}return 2})};exports.Rewriter.prototype.addImplicitIndentation=function(){return this.scanTokens(function(token,i,tokens){var _ref,_ref2,action,condition,indent,outdent,starter,tag;tag=token[0];if(tag==="ELSE"&&this.tag(i-1)!=="OUTDENT"){tokens.splice.apply(tokens,[i,0].concat(this.indentation(token)));return 2}if(tag==="CATCH"&&((_ref=this.tag(i+2))==="TERMINATOR"||_ref==="FINALLY")){tokens.splice.apply(tokens,[i+2,0].concat(this.indentation(token)));return 4}if(include(SINGLE_LINERS,tag)&&this.tag(i+1)!=="INDENT"&&!(tag==="ELSE"&&this.tag(i+1)==="IF")){starter=tag;_ref2=this.indentation(token),indent=_ref2[0],outdent=_ref2[1];if(starter==="THEN"){indent.fromThen=true}indent.generated=(outdent.generated=true);tokens.splice(i+1,0,indent);condition=function(token,i){return token[1]!==";"&&include(SINGLE_CLOSERS,token[0])&&!(token[0]==="ELSE"&&!(starter==="IF"||starter==="THEN"))};action=function(token,i){return this.tokens.splice(this.tag(i-1)===","?i-1:i,0,outdent)};this.detectEnd(i+2,condition,action);if(tag==="THEN"){tokens.splice(i,1)}return 1}return 1})};exports.Rewriter.prototype.tagPostfixConditionals=function(){var condition;condition=function(token,i){var _ref;return((_ref=token[0])==="TERMINATOR"||_ref==="INDENT")};return this.scanTokens(function(token,i){var _ref,original;if(!((_ref=token[0])==="IF"||_ref==="UNLESS")){return 1}original=token;this.detectEnd(i+1,condition,function(token,i){return token[0]!=="INDENT"?(original[0]="POST_"+original[0]):undefined});return 1})};exports.Rewriter.prototype.ensureBalance=function(pairs){var _result,key,levels,open,openLine,unclosed,value;levels={};openLine={};this.scanTokens(function(token,i){var _i,_len,_ref,_ref2,close,open,tag;tag=token[0];for(_i=0,_len=(_ref=pairs).length;_i<_len;_i++){_ref2=_ref[_i],open=_ref2[0],close=_ref2[1];levels[open]|=0;if(tag===open){if(levels[open]===0){openLine[open]=token[2]}levels[open]+=1}else{if(tag===close){levels[open]-=1}}if(levels[open]<0){throw Error("too many "+(token[1])+" on line "+(token[2]+1))}}return 1});unclosed=(function(){_result=[];for(key in levels){value=levels[key];if(value>0){_result.push(key)}}return _result})();if(unclosed.length){throw Error("unclosed "+(open=unclosed[0])+" on line "+(openLine[open]+1))}};exports.Rewriter.prototype.rewriteClosingParens=function(){var debt,key,stack;stack=[];debt={};for(key in INVERSES){(debt[key]=0)}return this.scanTokens(function(token,i,tokens){var inv,match,mtag,oppos,tag,val;if(include(EXPRESSION_START,tag=token[0])){stack.push(token);return 1}if(!include(EXPRESSION_END,tag)){return 1}if(debt[(inv=INVERSES[tag])]>0){debt[inv]-=1;tokens.splice(i,1);return 0}match=stack.pop();mtag=match[0];oppos=INVERSES[mtag];if(tag===oppos){return 1}debt[mtag]+=1;val=[oppos,mtag==="INDENT"?match[1]:oppos];if(this.tag(i+2)===mtag){tokens.splice(i+3,0,val);stack.push(match)}else{tokens.splice(i,0,val)}return 1})};exports.Rewriter.prototype.indentation=function(token){return[["INDENT",2,token[2]],["OUTDENT",2,token[2]]]};exports.Rewriter.prototype.tag=function(i){var _ref;return(((_ref=this.tokens[i])!=null)?_ref[0]:undefined)};BALANCED_PAIRS=[["(",")"],["[","]"],["{","}"],["INDENT","OUTDENT"],["CALL_START","CALL_END"],["PARAM_START","PARAM_END"],["INDEX_START","INDEX_END"]];INVERSES={};EXPRESSION_START=[];EXPRESSION_END=[];for(_i=0,_len=BALANCED_PAIRS.length;_i<_len;_i++){_ref=BALANCED_PAIRS[_i],left=_ref[0],rite=_ref[1];EXPRESSION_START.push(INVERSES[rite]=left);EXPRESSION_END.push(INVERSES[left]=rite)}EXPRESSION_CLOSE=["CATCH","WHEN","ELSE","FINALLY"].concat(EXPRESSION_END);IMPLICIT_FUNC=["IDENTIFIER","SUPER",")","CALL_END","]","INDEX_END","@","THIS"];IMPLICIT_CALL=["IDENTIFIER","NUMBER","STRING","JS","REGEX","NEW","PARAM_START","CLASS","IF","UNLESS","TRY","SWITCH","THIS","BOOL","UNARY","@","->","=>","[","(","{"];IMPLICIT_BLOCK=["->","=>","{","[",","];IMPLICIT_END=["POST_IF","POST_UNLESS","FOR","WHILE","UNTIL","LOOP","TERMINATOR","INDENT"];SINGLE_LINERS=["ELSE","->","=>","TRY","FINALLY","THEN"];SINGLE_CLOSERS=["TERMINATOR","CATCH","FINALLY","ELSE","OUTDENT","LEADING_WHEN"];LINEBREAKS=["TERMINATOR","INDENT","OUTDENT"]}).call(this)};require["./lexer"]=new function(){var exports=this;(function(){var ASSIGNED,BOOL,CALLABLE,CODE,COFFEE_ALIASES,COFFEE_KEYWORDS,COMMENT,COMPARE,COMPOUND_ASSIGN,HEREDOC,HEREDOC_INDENT,HEREGEX,HEREGEX_OMIT,IDENTIFIER,INDEXABLE,JSTOKEN,JS_FORBIDDEN,JS_KEYWORDS,LEADING_SPACES,LINE_BREAK,LOGIC,Lexer,MATH,MULTILINER,MULTI_DENT,NEXT_CHARACTER,NEXT_ELLIPSIS,NOT_REGEX,NO_NEWLINE,NUMBER,OPERATOR,REGEX,RELATION,RESERVED,Rewriter,SHIFT,SIMPLESTR,TRAILING_SPACES,UNARY,WHITESPACE,_ref,compact,count,include,last,op,starts;Rewriter=require("./rewriter").Rewriter;_ref=require("./helpers"),include=_ref.include,count=_ref.count,starts=_ref.starts,compact=_ref.compact,last=_ref.last;exports.Lexer=(function(){Lexer=(function(){function Lexer(){}return Lexer})();Lexer.prototype.tokenize=function(code,options){var o;code=code.replace(/\r/g,"").replace(TRAILING_SPACES,"");o=options||{};this.code=code;this.i=0;this.line=o.line||0;this.indent=0;this.indebt=0;this.outdebt=0;this.seenFor=false;this.indents=[];this.tokens=[];while(this.chunk=code.slice(this.i)){this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.heredocToken()||this.stringToken()||this.numberToken()||this.regexToken()||this.jsToken()||this.literalToken()}this.closeIndentation();if(o.rewrite===false){return this.tokens}return(new Rewriter).rewrite(this.tokens)};Lexer.prototype.identifierToken=function(){var colon,forcedIdentifier,id,input,match,tag;if(!(match=IDENTIFIER.exec(this.chunk))){return false}input=match[0],id=match[1],colon=match[2];this.i+=input.length;if(id==="all"&&this.tag()==="FOR"){this.token("ALL",id);return true}forcedIdentifier=colon||this.tagAccessor();tag="IDENTIFIER";if(include(JS_KEYWORDS,id)||!forcedIdentifier&&include(COFFEE_KEYWORDS,id)){tag=id.toUpperCase();if(tag==="WHEN"&&include(LINE_BREAK,this.tag())){tag="LEADING_WHEN"}else{if(tag==="FOR"){this.seenFor=true}else{if(include(UNARY,tag)){tag="UNARY"}else{if(include(RELATION,tag)){if(tag!=="INSTANCEOF"&&this.seenFor){this.seenFor=false;tag="FOR"+tag}else{tag="RELATION";if(this.value()==="!"){this.tokens.pop();id="!"+id}}}}}}}if(include(JS_FORBIDDEN,id)){if(forcedIdentifier){tag="IDENTIFIER";id=new String(id);id.reserved=true}else{if(include(RESERVED,id)){this.identifierError(id)}}}if(!forcedIdentifier){if(COFFEE_ALIASES.hasOwnProperty(id)){tag=(id=COFFEE_ALIASES[id])}if(id==="!"){tag="UNARY"}else{if(include(LOGIC,id)){tag="LOGIC"}else{if(include(BOOL,tag)){id=tag.toLowerCase();tag="BOOL"}}}}this.token(tag,id);if(colon){this.token(":",":")}return true};Lexer.prototype.numberToken=function(){var match,number;if(!(match=NUMBER.exec(this.chunk))){return false}number=match[0];if(this.tag()==="."&&number.charAt(0)==="."){return false}this.i+=number.length;this.token("NUMBER",number);return true};Lexer.prototype.stringToken=function(){var match,string;switch(this.chunk.charAt(0)){case"'":if(!(match=SIMPLESTR.exec(this.chunk))){return false}this.token("STRING",(string=match[0]).replace(MULTILINER,"\\\n"));break;case'"':if(!(string=this.balancedString(this.chunk,[['"','"'],["#{","}"]]))){return false}if(0body.indexOf("#{")){re=body.replace(HEREGEX_OMIT,"").replace(/\//g,"\\/");this.token("REGEX","/"+(re||"(?:)")+"/"+flags);return true}this.token("IDENTIFIER","RegExp");this.tokens.push(["CALL_START","("]);tokens=[];for(_i=0,_len=(_ref2=this.interpolateString(body,{regex:true})).length;_i<_len;_i++){_ref3=_ref2[_i],tag=_ref3[0],value=_ref3[1];if(tag==="TOKENS"){tokens.push.apply(tokens,value)}else{if(!(value=value.replace(HEREGEX_OMIT,""))){continue}value=value.replace(/\\/g,"\\\\");tokens.push(["STRING",this.makeString(value,'"',true)])}tokens.push(["+","+"])}tokens.pop();if((((_ref4=tokens[0])!=null)?_ref4[0]:undefined)!=="STRING"){this.tokens.push(["STRING",'""'],["+","+"])}(_this=this.tokens).push.apply(_this,tokens);if(flags){this.tokens.push([",",","],["STRING",'"'+flags+'"'])}this.token(")",")");return true};Lexer.prototype.lineToken=function(){var diff,indent,match,nextCharacter,noNewlines,prev,size;if(!(match=MULTI_DENT.exec(this.chunk))){return false}indent=match[0];this.line+=count(indent,"\n");this.i+=indent.length;prev=last(this.tokens,1);size=indent.length-1-indent.lastIndexOf("\n");nextCharacter=NEXT_CHARACTER.exec(this.chunk)[1];noNewlines=((nextCharacter==="."||nextCharacter===",")&&!NEXT_ELLIPSIS.test(this.chunk))||this.unfinished();if(size-this.indebt===this.indent){if(noNewlines){return this.suppressNewlines()}return this.newlineToken(indent)}else{if(size>this.indent){if(noNewlines){this.indebt=size-this.indent;return this.suppressNewlines()}diff=size-this.indent+this.outdebt;this.token("INDENT",diff);this.indents.push(diff);this.outdebt=(this.indebt=0)}else{this.indebt=0;this.outdentToken(this.indent-size,noNewlines)}}this.indent=size;return true};Lexer.prototype.outdentToken=function(moveOut,noNewlines,close){var dent,len;while(moveOut>0){len=this.indents.length-1;if(this.indents[len]===undefined){moveOut=0}else{if(this.indents[len]===this.outdebt){moveOut-=this.outdebt;this.outdebt=0}else{if(this.indents[len]doc.indexOf("\n")){return doc}if(!herecomment){while(match=HEREDOC_INDENT.exec(doc)){attempt=match[1];if(indent===null||(0<(_ref2=attempt.length))&&(_ref21){nested.unshift(["(","("]);nested.push([")",")"])}tokens.push(["TOKENS",nested])}i+=expr.length;pi=i+1}if((i>pi)&&(pi1){this.token("(","(")}for(i=0,_len=tokens.length;i<_len;i++){_ref3=tokens[i],tag=_ref3[0],value=_ref3[1];if(i){this.token("+","+")}if(tag==="TOKENS"){(_this=this.tokens).push.apply(_this,value)}else{this.token("STRING",this.makeString(value,'"',heredoc))}}if(interpolated){this.token(")",")")}return tokens};Lexer.prototype.token=function(tag,value){return this.tokens.push([tag,value,this.line])};Lexer.prototype.tag=function(index,tag){var tok;return(tok=last(this.tokens,index))&&((tag!=null)?(tok[0]=tag):tok[0])};Lexer.prototype.value=function(index,val){var tok;return(tok=last(this.tokens,index))&&((val!=null)?(tok[1]=val):tok[1])};Lexer.prototype.unfinished=function(){var prev,value;return(prev=last(this.tokens,1))&&prev[0]!=="."&&(value=this.value())&&!value.reserved&&NO_NEWLINE.test(value)&&!CODE.test(value)&&!ASSIGNED.test(this.chunk)};Lexer.prototype.escapeLines=function(str,heredoc){return str.replace(MULTILINER,heredoc?"\\n":"")};Lexer.prototype.makeString=function(body,quote,heredoc){if(!body){return quote+quote}body=body.replace(/\\([\s\S])/g,function(match,contents){return(contents==="\n"||contents===quote)?contents:match});body=body.replace(RegExp(""+quote,"g"),"\\$&");return quote+this.escapeLines(body,heredoc)+quote};return Lexer})();JS_KEYWORDS=["true","false","null","this","new","delete","typeof","in","instanceof","return","throw","break","continue","debugger","if","else","switch","for","while","try","catch","finally","class","extends","super"];COFFEE_KEYWORDS=["then","unless","until","loop","of","by","when"];for(op in (COFFEE_ALIASES={and:"&&",or:"||",is:"==",isnt:"!=",not:"!",yes:"TRUE",no:"FALSE",on:"TRUE",off:"FALSE"})){COFFEE_KEYWORDS.push(op)}COFFEE_ALIASES["==="]="==";RESERVED=["case","default","do","function","var","void","with","const","let","enum","export","import","native","__hasProp","__extends","__slice"];JS_FORBIDDEN=JS_KEYWORDS.concat(RESERVED);IDENTIFIER=/^([$A-Za-z_][$\w]*)([^\n\S]*:(?!:))?/;NUMBER=/^0x[\da-f]+|^(?:\d+(\.\d+)?|\.\d+)(?:e[+-]?\d+)?/i;HEREDOC=/^("""|''')([\s\S]*?)(?:\n[ \t]*)?\1/;OPERATOR=/^(?:-[-=>]?|\+[+=]?|\.\.\.?|[*&|\/%=<>^:!?]+)/;WHITESPACE=/^[ \t]+/;COMMENT=/^###([^#][\s\S]*?)(?:###[ \t]*\n|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/;CODE=/^[-=]>/;MULTI_DENT=/^(?:\n[ \t]*)+/;SIMPLESTR=/^'[^\\']*(?:\\.[^\\']*)*'/;JSTOKEN=/^`[^\\`]*(?:\\.[^\\`]*)*`/;REGEX=/^\/(?!\s)(?:[^[\/\n\\]+|\\[\s\S]|\[([^\]\n\\]+|\\[\s\S])*])+\/[imgy]{0,4}(?![A-Za-z])/;HEREGEX=/^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?![A-Za-z])/;HEREGEX_OMIT=/\s+(?:#.*)?/g;MULTILINER=/\n/g;HEREDOC_INDENT=/\n+([ \t]*)/g;ASSIGNED=/^\s*@?[$A-Za-z_][$\w]*[ \t]*?[:=][^:=>]/;NEXT_CHARACTER=/^\s*(\S?)/;NEXT_ELLIPSIS=/^\s*\.\.\.?/;LEADING_SPACES=/^\s+/;TRAILING_SPACES=/\s+$/;NO_NEWLINE=/^(?:[-+*&|\/%=<>!.\\][<>=&|]*|and|or|is(?:nt)?|n(?:ot|ew)|delete|typeof|instanceof)$/;COMPOUND_ASSIGN=["-=","+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|="];UNARY=["UMINUS","UPLUS","!","!!","~","NEW","TYPEOF","DELETE"];LOGIC=["&","|","^","&&","||"];SHIFT=["<<",">>",">>>"];COMPARE=["<=","<",">",">="];MATH=["*","/","%"];RELATION=["IN","OF","INSTANCEOF"];BOOL=["TRUE","FALSE","NULL"];NOT_REGEX=["NUMBER","REGEX","BOOL","++","--","]"];CALLABLE=["IDENTIFIER","STRING","REGEX",")","]","}","?","::","@","THIS","SUPER"];INDEXABLE=CALLABLE.concat("NUMBER","BOOL");LINE_BREAK=["INDENT","OUTDENT","TERMINATOR"]}).call(this)};require["./parser"]=new function(){var exports=this;var parser=(function(){var parser={trace:function trace(){},yy:{},symbols_:{error:2,Root:3,TERMINATOR:4,Body:5,Block:6,Line:7,Expression:8,Statement:9,Return:10,Throw:11,BREAK:12,CONTINUE:13,DEBUGGER:14,Value:15,Invocation:16,Code:17,Operation:18,Assign:19,If:20,Try:21,While:22,For:23,Switch:24,Extends:25,Class:26,Existence:27,Comment:28,INDENT:29,OUTDENT:30,Identifier:31,IDENTIFIER:32,AlphaNumeric:33,NUMBER:34,STRING:35,Literal:36,JS:37,REGEX:38,BOOL:39,Assignable:40,"=":41,AssignObj:42,ThisProperty:43,":":44,RETURN:45,HERECOMMENT:46,"?":47,PARAM_START:48,ParamList:49,PARAM_END:50,FuncGlyph:51,"->":52,"=>":53,OptComma:54,",":55,Param:56,PARAM:57,"@":58,"...":59,Splat:60,SimpleAssignable:61,Accessor:62,Array:63,Object:64,Parenthetical:65,Range:66,This:67,PROPERTY_ACCESS:68,PROTOTYPE_ACCESS:69,"::":70,SOAK_ACCESS:71,Index:72,Slice:73,INDEX_START:74,INDEX_END:75,INDEX_SOAK:76,INDEX_PROTO:77,"{":78,AssignList:79,"}":80,CLASS:81,EXTENDS:82,ClassBody:83,ClassAssign:84,OptFuncExist:85,Arguments:86,SUPER:87,FUNC_EXIST:88,CALL_START:89,CALL_END:90,ArgList:91,THIS:92,RangeDots:93,"..":94,"[":95,"]":96,Arg:97,SimpleArgs:98,TRY:99,Catch:100,FINALLY:101,CATCH:102,THROW:103,"(":104,")":105,WhileSource:106,WHILE:107,WHEN:108,UNTIL:109,Loop:110,LOOP:111,ForBody:112,FOR:113,ForStart:114,ForSource:115,ForVariables:116,ALL:117,ForValue:118,FORIN:119,FOROF:120,BY:121,SWITCH:122,Whens:123,ELSE:124,When:125,LEADING_WHEN:126,IfBlock:127,IF:128,UNLESS:129,POST_IF:130,POST_UNLESS:131,UNARY:132,"-":133,"+":134,"--":135,"++":136,"==":137,"!=":138,MATH:139,SHIFT:140,COMPARE:141,LOGIC:142,COMPOUND_ASSIGN:143,RELATION:144,"$accept":0,"$end":1},terminals_:{"2":"error","4":"TERMINATOR","12":"BREAK","13":"CONTINUE","14":"DEBUGGER","29":"INDENT","30":"OUTDENT","32":"IDENTIFIER","34":"NUMBER","35":"STRING","37":"JS","38":"REGEX","39":"BOOL","41":"=","44":":","45":"RETURN","46":"HERECOMMENT","47":"?","48":"PARAM_START","50":"PARAM_END","52":"->","53":"=>","55":",","57":"PARAM","58":"@","59":"...","68":"PROPERTY_ACCESS","69":"PROTOTYPE_ACCESS","70":"::","71":"SOAK_ACCESS","74":"INDEX_START","75":"INDEX_END","76":"INDEX_SOAK","77":"INDEX_PROTO","78":"{","80":"}","81":"CLASS","82":"EXTENDS","87":"SUPER","88":"FUNC_EXIST","89":"CALL_START","90":"CALL_END","92":"THIS","94":"..","95":"[","96":"]","99":"TRY","101":"FINALLY","102":"CATCH","103":"THROW","104":"(","105":")","107":"WHILE","108":"WHEN","109":"UNTIL","111":"LOOP","113":"FOR","117":"ALL","119":"FORIN","120":"FOROF","121":"BY","122":"SWITCH","124":"ELSE","126":"LEADING_WHEN","128":"IF","129":"UNLESS","130":"POST_IF","131":"POST_UNLESS","132":"UNARY","133":"-","134":"+","135":"--","136":"++","137":"==","138":"!=","139":"MATH","140":"SHIFT","141":"COMPARE","142":"LOGIC","143":"COMPOUND_ASSIGN","144":"RELATION"},productions_:[0,[3,0],[3,1],[3,1],[3,2],[5,1],[5,3],[5,2],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[6,3],[6,2],[6,2],[31,1],[33,1],[33,1],[36,1],[36,1],[36,1],[36,1],[19,3],[19,5],[42,1],[42,1],[42,1],[42,3],[42,3],[42,5],[42,5],[42,1],[10,2],[10,1],[28,1],[27,2],[17,5],[17,2],[51,1],[51,1],[54,0],[54,1],[49,0],[49,1],[49,3],[56,1],[56,2],[56,2],[56,3],[60,2],[61,1],[61,2],[61,2],[61,1],[40,1],[40,1],[40,1],[15,1],[15,1],[15,1],[15,1],[15,1],[62,2],[62,2],[62,1],[62,2],[62,1],[62,1],[72,3],[72,2],[72,2],[64,4],[79,0],[79,1],[79,3],[79,4],[79,6],[26,2],[26,4],[26,5],[26,7],[26,4],[26,1],[26,3],[26,6],[84,1],[84,3],[84,5],[83,0],[83,1],[83,3],[83,3],[25,3],[16,3],[16,3],[16,1],[16,2],[85,0],[85,1],[86,2],[86,4],[67,1],[67,1],[93,1],[93,1],[43,2],[66,5],[73,5],[73,4],[73,4],[63,2],[63,4],[91,1],[91,3],[91,4],[91,4],[91,6],[97,1],[97,1],[98,1],[98,3],[21,2],[21,3],[21,4],[21,5],[100,3],[11,2],[65,3],[65,2],[106,2],[106,4],[106,2],[106,4],[22,2],[22,2],[22,2],[22,1],[110,2],[110,2],[23,2],[23,2],[23,2],[112,2],[112,2],[114,2],[114,3],[118,1],[118,1],[118,1],[116,1],[116,3],[115,2],[115,2],[115,4],[115,4],[115,4],[115,6],[115,6],[24,5],[24,7],[24,4],[24,6],[123,1],[123,2],[125,3],[125,4],[127,3],[127,3],[127,5],[127,3],[20,1],[20,3],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,3]],performAction:function anonymous(yytext,yyleng,yylineno,yy){var $$=arguments[5],$0=arguments[5].length;switch(arguments[4]){case 1:return this.$=new yy.Expressions;break;case 2:return this.$=new yy.Expressions;break;case 3:return this.$=$$[$0-1+1-1];break;case 4:return this.$=$$[$0-2+1-1];break;case 5:this.$=yy.Expressions.wrap([$$[$0-1+1-1]]);break;case 6:this.$=$$[$0-3+1-1].push($$[$0-3+3-1]);break;case 7:this.$=$$[$0-2+1-1];break;case 8:this.$=$$[$0-1+1-1];break;case 9:this.$=$$[$0-1+1-1];break;case 10:this.$=$$[$0-1+1-1];break;case 11:this.$=$$[$0-1+1-1];break;case 12:this.$=new yy.Literal($$[$0-1+1-1]);break;case 13:this.$=new yy.Literal($$[$0-1+1-1]);break;case 14:this.$=new yy.Literal($$[$0-1+1-1]);break;case 15:this.$=$$[$0-1+1-1];break;case 16:this.$=$$[$0-1+1-1];break;case 17:this.$=$$[$0-1+1-1];break;case 18:this.$=$$[$0-1+1-1];break;case 19:this.$=$$[$0-1+1-1];break;case 20:this.$=$$[$0-1+1-1];break;case 21:this.$=$$[$0-1+1-1];break;case 22:this.$=$$[$0-1+1-1];break;case 23:this.$=$$[$0-1+1-1];break;case 24:this.$=$$[$0-1+1-1];break;case 25:this.$=$$[$0-1+1-1];break;case 26:this.$=$$[$0-1+1-1];break;case 27:this.$=$$[$0-1+1-1];break;case 28:this.$=$$[$0-1+1-1];break;case 29:this.$=$$[$0-3+2-1];break;case 30:this.$=new yy.Expressions;break;case 31:this.$=yy.Expressions.wrap([$$[$0-2+2-1]]);break;case 32:this.$=new yy.Literal($$[$0-1+1-1]);break;case 33:this.$=new yy.Literal($$[$0-1+1-1]);break;case 34:this.$=new yy.Literal($$[$0-1+1-1]);break;case 35:this.$=$$[$0-1+1-1];break;case 36:this.$=new yy.Literal($$[$0-1+1-1]);break;case 37:this.$=new yy.Literal($$[$0-1+1-1]);break;case 38:this.$=new yy.Literal($$[$0-1+1-1]);break;case 39:this.$=new yy.Assign($$[$0-3+1-1],$$[$0-3+3-1]);break;case 40:this.$=new yy.Assign($$[$0-5+1-1],$$[$0-5+4-1]);break;case 41:this.$=new yy.Value($$[$0-1+1-1]);break;case 42:this.$=$$[$0-1+1-1];break;case 43:this.$=$$[$0-1+1-1];break;case 44:this.$=new yy.Assign(new yy.Value($$[$0-3+1-1]),$$[$0-3+3-1],"object");break;case 45:this.$=new yy.Assign(new yy.Value($$[$0-3+1-1]),$$[$0-3+3-1],"object");break;case 46:this.$=new yy.Assign(new yy.Value($$[$0-5+1-1]),$$[$0-5+4-1],"object");break;case 47:this.$=new yy.Assign(new yy.Value($$[$0-5+1-1]),$$[$0-5+4-1],"object");break;case 48:this.$=$$[$0-1+1-1];break;case 49:this.$=new yy.Return($$[$0-2+2-1]);break;case 50:this.$=new yy.Return;break;case 51:this.$=new yy.Comment($$[$0-1+1-1]);break;case 52:this.$=new yy.Existence($$[$0-2+1-1]);break;case 53:this.$=new yy.Code($$[$0-5+2-1],$$[$0-5+5-1],$$[$0-5+4-1]);break;case 54:this.$=new yy.Code([],$$[$0-2+2-1],$$[$0-2+1-1]);break;case 55:this.$="func";break;case 56:this.$="boundfunc";break;case 57:this.$=$$[$0-1+1-1];break;case 58:this.$=$$[$0-1+1-1];break;case 59:this.$=[];break;case 60:this.$=[$$[$0-1+1-1]];break;case 61:this.$=$$[$0-3+1-1].concat($$[$0-3+3-1]);break;case 62:this.$=new yy.Literal($$[$0-1+1-1]);break;case 63:this.$=new yy.Param($$[$0-2+2-1],true);break;case 64:this.$=new yy.Param($$[$0-2+1-1],false,true);break;case 65:this.$=new yy.Param($$[$0-3+2-1],true,true);break;case 66:this.$=new yy.Splat($$[$0-2+1-1]);break;case 67:this.$=new yy.Value($$[$0-1+1-1]);break;case 68:this.$=$$[$0-2+1-1].push($$[$0-2+2-1]);break;case 69:this.$=new yy.Value($$[$0-2+1-1],[$$[$0-2+2-1]]);break;case 70:this.$=$$[$0-1+1-1];break;case 71:this.$=$$[$0-1+1-1];break;case 72:this.$=new yy.Value($$[$0-1+1-1]);break;case 73:this.$=new yy.Value($$[$0-1+1-1]);break;case 74:this.$=$$[$0-1+1-1];break;case 75:this.$=new yy.Value($$[$0-1+1-1]);break;case 76:this.$=new yy.Value($$[$0-1+1-1]);break;case 77:this.$=new yy.Value($$[$0-1+1-1]);break;case 78:this.$=$$[$0-1+1-1];break;case 79:this.$=new yy.Accessor($$[$0-2+2-1]);break;case 80:this.$=new yy.Accessor($$[$0-2+2-1],"prototype");break;case 81:this.$=new yy.Accessor(new yy.Literal("prototype"));break;case 82:this.$=new yy.Accessor($$[$0-2+2-1],"soak");break;case 83:this.$=$$[$0-1+1-1];break;case 84:this.$=new yy.Slice($$[$0-1+1-1]);break;case 85:this.$=new yy.Index($$[$0-3+2-1]);break;case 86:this.$=(function(){$$[$0-2+2-1].soakNode=true;return $$[$0-2+2-1]}());break;case 87:this.$=(function(){$$[$0-2+2-1].proto=true;return $$[$0-2+2-1]}());break;case 88:this.$=new yy.ObjectLiteral($$[$0-4+2-1]);break;case 89:this.$=[];break;case 90:this.$=[$$[$0-1+1-1]];break;case 91:this.$=$$[$0-3+1-1].concat($$[$0-3+3-1]);break;case 92:this.$=$$[$0-4+1-1].concat($$[$0-4+4-1]);break;case 93:this.$=$$[$0-6+1-1].concat($$[$0-6+4-1]);break;case 94:this.$=new yy.Class($$[$0-2+2-1]);break;case 95:this.$=new yy.Class($$[$0-4+2-1],$$[$0-4+4-1]);break;case 96:this.$=new yy.Class($$[$0-5+2-1],null,$$[$0-5+4-1]);break;case 97:this.$=new yy.Class($$[$0-7+2-1],$$[$0-7+4-1],$$[$0-7+6-1]);break;case 98:this.$=new yy.Class("__temp__",null,$$[$0-4+3-1]);break;case 99:this.$=new yy.Class("__temp__",null,new yy.Expressions);break;case 100:this.$=new yy.Class("__temp__",$$[$0-3+3-1],new yy.Expressions);break;case 101:this.$=new yy.Class("__temp__",$$[$0-6+3-1],$$[$0-6+5-1]);break;case 102:this.$=$$[$0-1+1-1];break;case 103:this.$=new yy.Assign(new yy.Value($$[$0-3+1-1]),$$[$0-3+3-1],"this");break;case 104:this.$=new yy.Assign(new yy.Value($$[$0-5+1-1]),$$[$0-5+4-1],"this");break;case 105:this.$=[];break;case 106:this.$=[$$[$0-1+1-1]];break;case 107:this.$=$$[$0-3+1-1].concat($$[$0-3+3-1]);break;case 108:this.$=$$[$0-3+2-1];break;case 109:this.$=new yy.Extends($$[$0-3+1-1],$$[$0-3+3-1]);break;case 110:this.$=new yy.Call($$[$0-3+1-1],$$[$0-3+3-1],$$[$0-3+2-1]);break;case 111:this.$=new yy.Call($$[$0-3+1-1],$$[$0-3+3-1],$$[$0-3+2-1]);break;case 112:this.$=new yy.Call("super",[new yy.Splat(new yy.Literal("arguments"))]);break;case 113:this.$=new yy.Call("super",$$[$0-2+2-1]);break;case 114:this.$=false;break;case 115:this.$=true;break;case 116:this.$=[];break;case 117:this.$=$$[$0-4+2-1];break;case 118:this.$=new yy.Value(new yy.Literal("this"));break;case 119:this.$=new yy.Value(new yy.Literal("this"));break;case 120:this.$="inclusive";break;case 121:this.$="exclusive";break;case 122:this.$=new yy.Value(new yy.Literal("this"),[new yy.Accessor($$[$0-2+2-1])],"this");break;case 123:this.$=new yy.Range($$[$0-5+2-1],$$[$0-5+4-1],$$[$0-5+3-1]);break;case 124:this.$=new yy.Range($$[$0-5+2-1],$$[$0-5+4-1],$$[$0-5+3-1]);break;case 125:this.$=new yy.Range($$[$0-4+2-1],null,$$[$0-4+3-1]);break;case 126:this.$=new yy.Range(null,$$[$0-4+3-1],$$[$0-4+2-1]);break;case 127:this.$=new yy.ArrayLiteral([]);break;case 128:this.$=new yy.ArrayLiteral($$[$0-4+2-1]);break;case 129:this.$=[$$[$0-1+1-1]];break;case 130:this.$=$$[$0-3+1-1].concat($$[$0-3+3-1]);break;case 131:this.$=$$[$0-4+1-1].concat($$[$0-4+4-1]);break;case 132:this.$=$$[$0-4+2-1];break;case 133:this.$=$$[$0-6+1-1].concat($$[$0-6+4-1]);break;case 134:this.$=$$[$0-1+1-1];break;case 135:this.$=$$[$0-1+1-1];break;case 136:this.$=$$[$0-1+1-1];break;case 137:this.$=[].concat($$[$0-3+1-1],$$[$0-3+3-1]);break;case 138:this.$=new yy.Try($$[$0-2+2-1]);break;case 139:this.$=new yy.Try($$[$0-3+2-1],$$[$0-3+3-1][0],$$[$0-3+3-1][1]);break;case 140:this.$=new yy.Try($$[$0-4+2-1],null,null,$$[$0-4+4-1]);break;case 141:this.$=new yy.Try($$[$0-5+2-1],$$[$0-5+3-1][0],$$[$0-5+3-1][1],$$[$0-5+5-1]);break;case 142:this.$=[$$[$0-3+2-1],$$[$0-3+3-1]];break;case 143:this.$=new yy.Throw($$[$0-2+2-1]);break;case 144:this.$=new yy.Parens($$[$0-3+2-1]);break;case 145:this.$=new yy.Parens(new yy.Literal(""));break;case 146:this.$=new yy.While($$[$0-2+2-1]);break;case 147:this.$=new yy.While($$[$0-4+2-1],{guard:$$[$0-4+4-1]});break;case 148:this.$=new yy.While($$[$0-2+2-1],{invert:true});break;case 149:this.$=new yy.While($$[$0-4+2-1],{invert:true,guard:$$[$0-4+4-1]});break;case 150:this.$=$$[$0-2+1-1].addBody($$[$0-2+2-1]);break;case 151:this.$=$$[$0-2+2-1].addBody(yy.Expressions.wrap([$$[$0-2+1-1]]));break;case 152:this.$=$$[$0-2+2-1].addBody(yy.Expressions.wrap([$$[$0-2+1-1]]));break;case 153:this.$=$$[$0-1+1-1];break;case 154:this.$=new yy.While(new yy.Literal("true")).addBody($$[$0-2+2-1]);break;case 155:this.$=new yy.While(new yy.Literal("true")).addBody(yy.Expressions.wrap([$$[$0-2+2-1]]));break;case 156:this.$=new yy.For($$[$0-2+1-1],$$[$0-2+2-1],$$[$0-2+2-1].vars[0],$$[$0-2+2-1].vars[1]);break;case 157:this.$=new yy.For($$[$0-2+1-1],$$[$0-2+2-1],$$[$0-2+2-1].vars[0],$$[$0-2+2-1].vars[1]);break;case 158:this.$=new yy.For($$[$0-2+2-1],$$[$0-2+1-1],$$[$0-2+1-1].vars[0],$$[$0-2+1-1].vars[1]);break;case 159:this.$={source:new yy.Value($$[$0-2+2-1]),vars:[]};break;case 160:this.$=(function(){$$[$0-2+2-1].raw=$$[$0-2+1-1].raw;$$[$0-2+2-1].vars=$$[$0-2+1-1];return $$[$0-2+2-1]}());break;case 161:this.$=$$[$0-2+2-1];break;case 162:this.$=(function(){$$[$0-3+3-1].raw=true;return $$[$0-3+3-1]}());break;case 163:this.$=$$[$0-1+1-1];break;case 164:this.$=new yy.Value($$[$0-1+1-1]);break;case 165:this.$=new yy.Value($$[$0-1+1-1]);break;case 166:this.$=[$$[$0-1+1-1]];break;case 167:this.$=[$$[$0-3+1-1],$$[$0-3+3-1]];break;case 168:this.$={source:$$[$0-2+2-1]};break;case 169:this.$={source:$$[$0-2+2-1],object:true};break;case 170:this.$={source:$$[$0-4+2-1],guard:$$[$0-4+4-1]};break;case 171:this.$={source:$$[$0-4+2-1],guard:$$[$0-4+4-1],object:true};break;case 172:this.$={source:$$[$0-4+2-1],step:$$[$0-4+4-1]};break;case 173:this.$={source:$$[$0-6+2-1],guard:$$[$0-6+4-1],step:$$[$0-6+6-1]};break;case 174:this.$={source:$$[$0-6+2-1],step:$$[$0-6+4-1],guard:$$[$0-6+6-1]};break;case 175:this.$=new yy.Switch($$[$0-5+2-1],$$[$0-5+4-1]);break;case 176:this.$=new yy.Switch($$[$0-7+2-1],$$[$0-7+4-1],$$[$0-7+6-1]);break;case 177:this.$=new yy.Switch(null,$$[$0-4+3-1]);break;case 178:this.$=new yy.Switch(null,$$[$0-6+3-1],$$[$0-6+5-1]);break;case 179:this.$=$$[$0-1+1-1];break;case 180:this.$=$$[$0-2+1-1].concat($$[$0-2+2-1]);break;case 181:this.$=[[$$[$0-3+2-1],$$[$0-3+3-1]]];break;case 182:this.$=[[$$[$0-4+2-1],$$[$0-4+3-1]]];break;case 183:this.$=new yy.If($$[$0-3+2-1],$$[$0-3+3-1]);break;case 184:this.$=new yy.If($$[$0-3+2-1],$$[$0-3+3-1],{invert:true});break;case 185:this.$=$$[$0-5+1-1].addElse(new yy.If($$[$0-5+4-1],$$[$0-5+5-1]));break;case 186:this.$=$$[$0-3+1-1].addElse($$[$0-3+3-1]);break;case 187:this.$=$$[$0-1+1-1];break;case 188:this.$=new yy.If($$[$0-3+3-1],yy.Expressions.wrap([$$[$0-3+1-1]]),{statement:true});break;case 189:this.$=new yy.If($$[$0-3+3-1],yy.Expressions.wrap([$$[$0-3+1-1]]),{statement:true});break;case 190:this.$=new yy.If($$[$0-3+3-1],yy.Expressions.wrap([$$[$0-3+1-1]]),{statement:true,invert:true});break;case 191:this.$=new yy.If($$[$0-3+3-1],yy.Expressions.wrap([$$[$0-3+1-1]]),{statement:true,invert:true});break;case 192:this.$=new yy.Op($$[$0-2+1-1],$$[$0-2+2-1]);break;case 193:this.$=new yy.Op("-",$$[$0-2+2-1]);break;case 194:this.$=new yy.Op("+",$$[$0-2+2-1]);break;case 195:this.$=new yy.Op("--",$$[$0-2+2-1]);break;case 196:this.$=new yy.Op("++",$$[$0-2+2-1]);break;case 197:this.$=new yy.Op("--",$$[$0-2+1-1],null,true);break;case 198:this.$=new yy.Op("++",$$[$0-2+1-1],null,true);break;case 199:this.$=new yy.Op("+",$$[$0-3+1-1],$$[$0-3+3-1]);break;case 200:this.$=new yy.Op("-",$$[$0-3+1-1],$$[$0-3+3-1]);break;case 201:this.$=new yy.Op("==",$$[$0-3+1-1],$$[$0-3+3-1]);break;case 202:this.$=new yy.Op("!=",$$[$0-3+1-1],$$[$0-3+3-1]);break;case 203:this.$=new yy.Op($$[$0-3+2-1],$$[$0-3+1-1],$$[$0-3+3-1]);break;case 204:this.$=new yy.Op($$[$0-3+2-1],$$[$0-3+1-1],$$[$0-3+3-1]);break;case 205:this.$=new yy.Op($$[$0-3+2-1],$$[$0-3+1-1],$$[$0-3+3-1]);break;case 206:this.$=new yy.Op($$[$0-3+2-1],$$[$0-3+1-1],$$[$0-3+3-1]);break;case 207:this.$=new yy.Op($$[$0-3+2-1],$$[$0-3+1-1],$$[$0-3+3-1]);break;case 208:this.$=new yy.Op($$[$0-5+2-1],$$[$0-5+1-1],$$[$0-5+4-1]);break;case 209:this.$=$$[$0-3+2-1].charAt(0)==="!"?($$[$0-3+2-1]==="!in"?new yy.Op("!",new yy.In($$[$0-3+1-1],$$[$0-3+3-1])):new yy.Op("!",new yy.Parens(new yy.Op($$[$0-3+2-1].slice(1),$$[$0-3+1-1],$$[$0-3+3-1])))):($$[$0-3+2-1]==="in"?new yy.In($$[$0-3+1-1],$$[$0-3+3-1]):new yy.Op($$[$0-3+2-1],$$[$0-3+1-1],$$[$0-3+3-1]));break}},table:[{"1":[2,1],"3":1,"4":[1,2],"5":3,"6":4,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[3]},{"1":[2,2],"28":77,"46":[1,49]},{"1":[2,3],"4":[1,78]},{"4":[1,79]},{"1":[2,5],"4":[2,5],"30":[2,5]},{"5":80,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[1,81],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,8],"4":[2,8],"30":[2,8],"47":[1,97],"105":[2,8],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,9],"4":[2,9],"30":[2,9],"105":[2,9],"106":100,"107":[1,66],"109":[1,67],"112":101,"113":[1,69],"114":70,"130":[1,98],"131":[1,99]},{"1":[2,15],"4":[2,15],"29":[2,15],"30":[2,15],"47":[2,15],"55":[2,15],"59":[2,15],"62":104,"68":[1,106],"69":[1,107],"70":[1,108],"71":[1,109],"72":110,"73":111,"74":[1,112],"75":[2,15],"76":[1,113],"77":[1,114],"80":[2,15],"85":102,"88":[1,105],"89":[2,114],"90":[2,15],"94":[2,15],"96":[2,15],"105":[2,15],"107":[2,15],"108":[2,15],"109":[2,15],"113":[2,15],"121":[2,15],"130":[2,15],"131":[2,15],"133":[2,15],"134":[2,15],"135":[2,15],"136":[2,15],"137":[2,15],"138":[2,15],"139":[2,15],"140":[2,15],"141":[2,15],"142":[2,15],"143":[1,103],"144":[2,15]},{"1":[2,16],"4":[2,16],"29":[2,16],"30":[2,16],"47":[2,16],"55":[2,16],"59":[2,16],"62":116,"68":[1,106],"69":[1,107],"70":[1,108],"71":[1,109],"72":110,"73":111,"74":[1,112],"75":[2,16],"76":[1,113],"77":[1,114],"80":[2,16],"85":115,"88":[1,105],"89":[2,114],"90":[2,16],"94":[2,16],"96":[2,16],"105":[2,16],"107":[2,16],"108":[2,16],"109":[2,16],"113":[2,16],"121":[2,16],"130":[2,16],"131":[2,16],"133":[2,16],"134":[2,16],"135":[2,16],"136":[2,16],"137":[2,16],"138":[2,16],"139":[2,16],"140":[2,16],"141":[2,16],"142":[2,16],"144":[2,16]},{"1":[2,17],"4":[2,17],"29":[2,17],"30":[2,17],"47":[2,17],"55":[2,17],"59":[2,17],"75":[2,17],"80":[2,17],"90":[2,17],"94":[2,17],"96":[2,17],"105":[2,17],"107":[2,17],"108":[2,17],"109":[2,17],"113":[2,17],"121":[2,17],"130":[2,17],"131":[2,17],"133":[2,17],"134":[2,17],"135":[2,17],"136":[2,17],"137":[2,17],"138":[2,17],"139":[2,17],"140":[2,17],"141":[2,17],"142":[2,17],"144":[2,17]},{"1":[2,18],"4":[2,18],"29":[2,18],"30":[2,18],"47":[2,18],"55":[2,18],"59":[2,18],"75":[2,18],"80":[2,18],"90":[2,18],"94":[2,18],"96":[2,18],"105":[2,18],"107":[2,18],"108":[2,18],"109":[2,18],"113":[2,18],"121":[2,18],"130":[2,18],"131":[2,18],"133":[2,18],"134":[2,18],"135":[2,18],"136":[2,18],"137":[2,18],"138":[2,18],"139":[2,18],"140":[2,18],"141":[2,18],"142":[2,18],"144":[2,18]},{"1":[2,19],"4":[2,19],"29":[2,19],"30":[2,19],"47":[2,19],"55":[2,19],"59":[2,19],"75":[2,19],"80":[2,19],"90":[2,19],"94":[2,19],"96":[2,19],"105":[2,19],"107":[2,19],"108":[2,19],"109":[2,19],"113":[2,19],"121":[2,19],"130":[2,19],"131":[2,19],"133":[2,19],"134":[2,19],"135":[2,19],"136":[2,19],"137":[2,19],"138":[2,19],"139":[2,19],"140":[2,19],"141":[2,19],"142":[2,19],"144":[2,19]},{"1":[2,20],"4":[2,20],"29":[2,20],"30":[2,20],"47":[2,20],"55":[2,20],"59":[2,20],"75":[2,20],"80":[2,20],"90":[2,20],"94":[2,20],"96":[2,20],"105":[2,20],"107":[2,20],"108":[2,20],"109":[2,20],"113":[2,20],"121":[2,20],"130":[2,20],"131":[2,20],"133":[2,20],"134":[2,20],"135":[2,20],"136":[2,20],"137":[2,20],"138":[2,20],"139":[2,20],"140":[2,20],"141":[2,20],"142":[2,20],"144":[2,20]},{"1":[2,21],"4":[2,21],"29":[2,21],"30":[2,21],"47":[2,21],"55":[2,21],"59":[2,21],"75":[2,21],"80":[2,21],"90":[2,21],"94":[2,21],"96":[2,21],"105":[2,21],"107":[2,21],"108":[2,21],"109":[2,21],"113":[2,21],"121":[2,21],"130":[2,21],"131":[2,21],"133":[2,21],"134":[2,21],"135":[2,21],"136":[2,21],"137":[2,21],"138":[2,21],"139":[2,21],"140":[2,21],"141":[2,21],"142":[2,21],"144":[2,21]},{"1":[2,22],"4":[2,22],"29":[2,22],"30":[2,22],"47":[2,22],"55":[2,22],"59":[2,22],"75":[2,22],"80":[2,22],"90":[2,22],"94":[2,22],"96":[2,22],"105":[2,22],"107":[2,22],"108":[2,22],"109":[2,22],"113":[2,22],"121":[2,22],"130":[2,22],"131":[2,22],"133":[2,22],"134":[2,22],"135":[2,22],"136":[2,22],"137":[2,22],"138":[2,22],"139":[2,22],"140":[2,22],"141":[2,22],"142":[2,22],"144":[2,22]},{"1":[2,23],"4":[2,23],"29":[2,23],"30":[2,23],"47":[2,23],"55":[2,23],"59":[2,23],"75":[2,23],"80":[2,23],"90":[2,23],"94":[2,23],"96":[2,23],"105":[2,23],"107":[2,23],"108":[2,23],"109":[2,23],"113":[2,23],"121":[2,23],"130":[2,23],"131":[2,23],"133":[2,23],"134":[2,23],"135":[2,23],"136":[2,23],"137":[2,23],"138":[2,23],"139":[2,23],"140":[2,23],"141":[2,23],"142":[2,23],"144":[2,23]},{"1":[2,24],"4":[2,24],"29":[2,24],"30":[2,24],"47":[2,24],"55":[2,24],"59":[2,24],"75":[2,24],"80":[2,24],"90":[2,24],"94":[2,24],"96":[2,24],"105":[2,24],"107":[2,24],"108":[2,24],"109":[2,24],"113":[2,24],"121":[2,24],"130":[2,24],"131":[2,24],"133":[2,24],"134":[2,24],"135":[2,24],"136":[2,24],"137":[2,24],"138":[2,24],"139":[2,24],"140":[2,24],"141":[2,24],"142":[2,24],"144":[2,24]},{"1":[2,25],"4":[2,25],"29":[2,25],"30":[2,25],"47":[2,25],"55":[2,25],"59":[2,25],"75":[2,25],"80":[2,25],"90":[2,25],"94":[2,25],"96":[2,25],"105":[2,25],"107":[2,25],"108":[2,25],"109":[2,25],"113":[2,25],"121":[2,25],"130":[2,25],"131":[2,25],"133":[2,25],"134":[2,25],"135":[2,25],"136":[2,25],"137":[2,25],"138":[2,25],"139":[2,25],"140":[2,25],"141":[2,25],"142":[2,25],"144":[2,25]},{"1":[2,26],"4":[2,26],"29":[2,26],"30":[2,26],"47":[2,26],"55":[2,26],"59":[2,26],"75":[2,26],"80":[2,26],"90":[2,26],"94":[2,26],"96":[2,26],"105":[2,26],"107":[2,26],"108":[2,26],"109":[2,26],"113":[2,26],"121":[2,26],"130":[2,26],"131":[2,26],"133":[2,26],"134":[2,26],"135":[2,26],"136":[2,26],"137":[2,26],"138":[2,26],"139":[2,26],"140":[2,26],"141":[2,26],"142":[2,26],"144":[2,26]},{"1":[2,27],"4":[2,27],"29":[2,27],"30":[2,27],"47":[2,27],"55":[2,27],"59":[2,27],"75":[2,27],"80":[2,27],"90":[2,27],"94":[2,27],"96":[2,27],"105":[2,27],"107":[2,27],"108":[2,27],"109":[2,27],"113":[2,27],"121":[2,27],"130":[2,27],"131":[2,27],"133":[2,27],"134":[2,27],"135":[2,27],"136":[2,27],"137":[2,27],"138":[2,27],"139":[2,27],"140":[2,27],"141":[2,27],"142":[2,27],"144":[2,27]},{"1":[2,28],"4":[2,28],"29":[2,28],"30":[2,28],"47":[2,28],"55":[2,28],"59":[2,28],"75":[2,28],"80":[2,28],"90":[2,28],"94":[2,28],"96":[2,28],"105":[2,28],"107":[2,28],"108":[2,28],"109":[2,28],"113":[2,28],"121":[2,28],"130":[2,28],"131":[2,28],"133":[2,28],"134":[2,28],"135":[2,28],"136":[2,28],"137":[2,28],"138":[2,28],"139":[2,28],"140":[2,28],"141":[2,28],"142":[2,28],"144":[2,28]},{"1":[2,10],"4":[2,10],"30":[2,10],"105":[2,10],"107":[2,10],"109":[2,10],"113":[2,10],"130":[2,10],"131":[2,10]},{"1":[2,11],"4":[2,11],"30":[2,11],"105":[2,11],"107":[2,11],"109":[2,11],"113":[2,11],"130":[2,11],"131":[2,11]},{"1":[2,12],"4":[2,12],"30":[2,12],"105":[2,12],"107":[2,12],"109":[2,12],"113":[2,12],"130":[2,12],"131":[2,12]},{"1":[2,13],"4":[2,13],"30":[2,13],"105":[2,13],"107":[2,13],"109":[2,13],"113":[2,13],"130":[2,13],"131":[2,13]},{"1":[2,14],"4":[2,14],"30":[2,14],"105":[2,14],"107":[2,14],"109":[2,14],"113":[2,14],"130":[2,14],"131":[2,14]},{"1":[2,74],"4":[2,74],"29":[2,74],"30":[2,74],"41":[1,117],"47":[2,74],"55":[2,74],"59":[2,74],"68":[2,74],"69":[2,74],"70":[2,74],"71":[2,74],"74":[2,74],"75":[2,74],"76":[2,74],"77":[2,74],"80":[2,74],"88":[2,74],"89":[2,74],"90":[2,74],"94":[2,74],"96":[2,74],"105":[2,74],"107":[2,74],"108":[2,74],"109":[2,74],"113":[2,74],"121":[2,74],"130":[2,74],"131":[2,74],"133":[2,74],"134":[2,74],"135":[2,74],"136":[2,74],"137":[2,74],"138":[2,74],"139":[2,74],"140":[2,74],"141":[2,74],"142":[2,74],"143":[2,74],"144":[2,74]},{"1":[2,75],"4":[2,75],"29":[2,75],"30":[2,75],"47":[2,75],"55":[2,75],"59":[2,75],"68":[2,75],"69":[2,75],"70":[2,75],"71":[2,75],"74":[2,75],"75":[2,75],"76":[2,75],"77":[2,75],"80":[2,75],"88":[2,75],"89":[2,75],"90":[2,75],"94":[2,75],"96":[2,75],"105":[2,75],"107":[2,75],"108":[2,75],"109":[2,75],"113":[2,75],"121":[2,75],"130":[2,75],"131":[2,75],"133":[2,75],"134":[2,75],"135":[2,75],"136":[2,75],"137":[2,75],"138":[2,75],"139":[2,75],"140":[2,75],"141":[2,75],"142":[2,75],"143":[2,75],"144":[2,75]},{"1":[2,76],"4":[2,76],"29":[2,76],"30":[2,76],"47":[2,76],"55":[2,76],"59":[2,76],"68":[2,76],"69":[2,76],"70":[2,76],"71":[2,76],"74":[2,76],"75":[2,76],"76":[2,76],"77":[2,76],"80":[2,76],"88":[2,76],"89":[2,76],"90":[2,76],"94":[2,76],"96":[2,76],"105":[2,76],"107":[2,76],"108":[2,76],"109":[2,76],"113":[2,76],"121":[2,76],"130":[2,76],"131":[2,76],"133":[2,76],"134":[2,76],"135":[2,76],"136":[2,76],"137":[2,76],"138":[2,76],"139":[2,76],"140":[2,76],"141":[2,76],"142":[2,76],"143":[2,76],"144":[2,76]},{"1":[2,77],"4":[2,77],"29":[2,77],"30":[2,77],"47":[2,77],"55":[2,77],"59":[2,77],"68":[2,77],"69":[2,77],"70":[2,77],"71":[2,77],"74":[2,77],"75":[2,77],"76":[2,77],"77":[2,77],"80":[2,77],"88":[2,77],"89":[2,77],"90":[2,77],"94":[2,77],"96":[2,77],"105":[2,77],"107":[2,77],"108":[2,77],"109":[2,77],"113":[2,77],"121":[2,77],"130":[2,77],"131":[2,77],"133":[2,77],"134":[2,77],"135":[2,77],"136":[2,77],"137":[2,77],"138":[2,77],"139":[2,77],"140":[2,77],"141":[2,77],"142":[2,77],"143":[2,77],"144":[2,77]},{"1":[2,78],"4":[2,78],"29":[2,78],"30":[2,78],"47":[2,78],"55":[2,78],"59":[2,78],"68":[2,78],"69":[2,78],"70":[2,78],"71":[2,78],"74":[2,78],"75":[2,78],"76":[2,78],"77":[2,78],"80":[2,78],"88":[2,78],"89":[2,78],"90":[2,78],"94":[2,78],"96":[2,78],"105":[2,78],"107":[2,78],"108":[2,78],"109":[2,78],"113":[2,78],"121":[2,78],"130":[2,78],"131":[2,78],"133":[2,78],"134":[2,78],"135":[2,78],"136":[2,78],"137":[2,78],"138":[2,78],"139":[2,78],"140":[2,78],"141":[2,78],"142":[2,78],"143":[2,78],"144":[2,78]},{"1":[2,112],"4":[2,112],"29":[2,112],"30":[2,112],"47":[2,112],"55":[2,112],"59":[2,112],"68":[2,112],"69":[2,112],"70":[2,112],"71":[2,112],"74":[2,112],"75":[2,112],"76":[2,112],"77":[2,112],"80":[2,112],"86":118,"88":[2,112],"89":[1,119],"90":[2,112],"94":[2,112],"96":[2,112],"105":[2,112],"107":[2,112],"108":[2,112],"109":[2,112],"113":[2,112],"121":[2,112],"130":[2,112],"131":[2,112],"133":[2,112],"134":[2,112],"135":[2,112],"136":[2,112],"137":[2,112],"138":[2,112],"139":[2,112],"140":[2,112],"141":[2,112],"142":[2,112],"144":[2,112]},{"49":120,"50":[2,59],"55":[2,59],"56":121,"57":[1,122],"58":[1,123]},{"4":[1,125],"6":124,"29":[1,6]},{"8":126,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":128,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":129,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":130,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":131,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,187],"4":[2,187],"29":[2,187],"30":[2,187],"47":[2,187],"55":[2,187],"59":[2,187],"75":[2,187],"80":[2,187],"90":[2,187],"94":[2,187],"96":[2,187],"105":[2,187],"107":[2,187],"108":[2,187],"109":[2,187],"113":[2,187],"121":[2,187],"124":[1,132],"130":[2,187],"131":[2,187],"133":[2,187],"134":[2,187],"135":[2,187],"136":[2,187],"137":[2,187],"138":[2,187],"139":[2,187],"140":[2,187],"141":[2,187],"142":[2,187],"144":[2,187]},{"4":[1,125],"6":133,"29":[1,6]},{"4":[1,125],"6":134,"29":[1,6]},{"1":[2,153],"4":[2,153],"29":[2,153],"30":[2,153],"47":[2,153],"55":[2,153],"59":[2,153],"75":[2,153],"80":[2,153],"90":[2,153],"94":[2,153],"96":[2,153],"105":[2,153],"107":[2,153],"108":[2,153],"109":[2,153],"113":[2,153],"121":[2,153],"130":[2,153],"131":[2,153],"133":[2,153],"134":[2,153],"135":[2,153],"136":[2,153],"137":[2,153],"138":[2,153],"139":[2,153],"140":[2,153],"141":[2,153],"142":[2,153],"144":[2,153]},{"4":[1,125],"6":135,"29":[1,6]},{"8":136,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,137],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,71],"4":[2,71],"29":[2,71],"30":[2,71],"41":[2,71],"47":[2,71],"55":[2,71],"59":[2,71],"68":[2,71],"69":[2,71],"70":[2,71],"71":[2,71],"74":[2,71],"75":[2,71],"76":[2,71],"77":[2,71],"80":[2,71],"82":[1,138],"88":[2,71],"89":[2,71],"90":[2,71],"94":[2,71],"96":[2,71],"105":[2,71],"107":[2,71],"108":[2,71],"109":[2,71],"113":[2,71],"121":[2,71],"130":[2,71],"131":[2,71],"133":[2,71],"134":[2,71],"135":[2,71],"136":[2,71],"137":[2,71],"138":[2,71],"139":[2,71],"140":[2,71],"141":[2,71],"142":[2,71],"143":[2,71],"144":[2,71]},{"1":[2,99],"4":[2,99],"15":142,"16":143,"29":[1,140],"30":[2,99],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":144,"43":72,"47":[2,99],"55":[2,99],"58":[1,61],"59":[2,99],"61":139,"63":52,"64":53,"65":30,"66":31,"67":32,"75":[2,99],"78":[1,73],"80":[2,99],"82":[1,141],"87":[1,33],"90":[2,99],"92":[1,60],"94":[2,99],"95":[1,59],"96":[2,99],"104":[1,58],"105":[2,99],"107":[2,99],"108":[2,99],"109":[2,99],"113":[2,99],"121":[2,99],"130":[2,99],"131":[2,99],"133":[2,99],"134":[2,99],"135":[2,99],"136":[2,99],"137":[2,99],"138":[2,99],"139":[2,99],"140":[2,99],"141":[2,99],"142":[2,99],"144":[2,99]},{"1":[2,51],"4":[2,51],"29":[2,51],"30":[2,51],"47":[2,51],"55":[2,51],"59":[2,51],"75":[2,51],"80":[2,51],"90":[2,51],"94":[2,51],"96":[2,51],"101":[2,51],"102":[2,51],"105":[2,51],"107":[2,51],"108":[2,51],"109":[2,51],"113":[2,51],"121":[2,51],"124":[2,51],"126":[2,51],"130":[2,51],"131":[2,51],"133":[2,51],"134":[2,51],"135":[2,51],"136":[2,51],"137":[2,51],"138":[2,51],"139":[2,51],"140":[2,51],"141":[2,51],"142":[2,51],"144":[2,51]},{"1":[2,50],"4":[2,50],"8":145,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[2,50],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"105":[2,50],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"130":[2,50],"131":[2,50],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":146,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,72],"4":[2,72],"29":[2,72],"30":[2,72],"41":[2,72],"47":[2,72],"55":[2,72],"59":[2,72],"68":[2,72],"69":[2,72],"70":[2,72],"71":[2,72],"74":[2,72],"75":[2,72],"76":[2,72],"77":[2,72],"80":[2,72],"88":[2,72],"89":[2,72],"90":[2,72],"94":[2,72],"96":[2,72],"105":[2,72],"107":[2,72],"108":[2,72],"109":[2,72],"113":[2,72],"121":[2,72],"130":[2,72],"131":[2,72],"133":[2,72],"134":[2,72],"135":[2,72],"136":[2,72],"137":[2,72],"138":[2,72],"139":[2,72],"140":[2,72],"141":[2,72],"142":[2,72],"143":[2,72],"144":[2,72]},{"1":[2,73],"4":[2,73],"29":[2,73],"30":[2,73],"41":[2,73],"47":[2,73],"55":[2,73],"59":[2,73],"68":[2,73],"69":[2,73],"70":[2,73],"71":[2,73],"74":[2,73],"75":[2,73],"76":[2,73],"77":[2,73],"80":[2,73],"88":[2,73],"89":[2,73],"90":[2,73],"94":[2,73],"96":[2,73],"105":[2,73],"107":[2,73],"108":[2,73],"109":[2,73],"113":[2,73],"121":[2,73],"130":[2,73],"131":[2,73],"133":[2,73],"134":[2,73],"135":[2,73],"136":[2,73],"137":[2,73],"138":[2,73],"139":[2,73],"140":[2,73],"141":[2,73],"142":[2,73],"143":[2,73],"144":[2,73]},{"1":[2,35],"4":[2,35],"29":[2,35],"30":[2,35],"47":[2,35],"55":[2,35],"59":[2,35],"68":[2,35],"69":[2,35],"70":[2,35],"71":[2,35],"74":[2,35],"75":[2,35],"76":[2,35],"77":[2,35],"80":[2,35],"88":[2,35],"89":[2,35],"90":[2,35],"94":[2,35],"96":[2,35],"105":[2,35],"107":[2,35],"108":[2,35],"109":[2,35],"113":[2,35],"121":[2,35],"130":[2,35],"131":[2,35],"133":[2,35],"134":[2,35],"135":[2,35],"136":[2,35],"137":[2,35],"138":[2,35],"139":[2,35],"140":[2,35],"141":[2,35],"142":[2,35],"143":[2,35],"144":[2,35]},{"1":[2,36],"4":[2,36],"29":[2,36],"30":[2,36],"47":[2,36],"55":[2,36],"59":[2,36],"68":[2,36],"69":[2,36],"70":[2,36],"71":[2,36],"74":[2,36],"75":[2,36],"76":[2,36],"77":[2,36],"80":[2,36],"88":[2,36],"89":[2,36],"90":[2,36],"94":[2,36],"96":[2,36],"105":[2,36],"107":[2,36],"108":[2,36],"109":[2,36],"113":[2,36],"121":[2,36],"130":[2,36],"131":[2,36],"133":[2,36],"134":[2,36],"135":[2,36],"136":[2,36],"137":[2,36],"138":[2,36],"139":[2,36],"140":[2,36],"141":[2,36],"142":[2,36],"143":[2,36],"144":[2,36]},{"1":[2,37],"4":[2,37],"29":[2,37],"30":[2,37],"47":[2,37],"55":[2,37],"59":[2,37],"68":[2,37],"69":[2,37],"70":[2,37],"71":[2,37],"74":[2,37],"75":[2,37],"76":[2,37],"77":[2,37],"80":[2,37],"88":[2,37],"89":[2,37],"90":[2,37],"94":[2,37],"96":[2,37],"105":[2,37],"107":[2,37],"108":[2,37],"109":[2,37],"113":[2,37],"121":[2,37],"130":[2,37],"131":[2,37],"133":[2,37],"134":[2,37],"135":[2,37],"136":[2,37],"137":[2,37],"138":[2,37],"139":[2,37],"140":[2,37],"141":[2,37],"142":[2,37],"143":[2,37],"144":[2,37]},{"1":[2,38],"4":[2,38],"29":[2,38],"30":[2,38],"47":[2,38],"55":[2,38],"59":[2,38],"68":[2,38],"69":[2,38],"70":[2,38],"71":[2,38],"74":[2,38],"75":[2,38],"76":[2,38],"77":[2,38],"80":[2,38],"88":[2,38],"89":[2,38],"90":[2,38],"94":[2,38],"96":[2,38],"105":[2,38],"107":[2,38],"108":[2,38],"109":[2,38],"113":[2,38],"121":[2,38],"130":[2,38],"131":[2,38],"133":[2,38],"134":[2,38],"135":[2,38],"136":[2,38],"137":[2,38],"138":[2,38],"139":[2,38],"140":[2,38],"141":[2,38],"142":[2,38],"143":[2,38],"144":[2,38]},{"7":147,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"105":[1,148],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":149,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"91":151,"92":[1,60],"95":[1,59],"96":[1,150],"97":152,"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,118],"4":[2,118],"29":[2,118],"30":[2,118],"47":[2,118],"55":[2,118],"59":[2,118],"68":[2,118],"69":[2,118],"70":[2,118],"71":[2,118],"74":[2,118],"75":[2,118],"76":[2,118],"77":[2,118],"80":[2,118],"88":[2,118],"89":[2,118],"90":[2,118],"94":[2,118],"96":[2,118],"105":[2,118],"107":[2,118],"108":[2,118],"109":[2,118],"113":[2,118],"121":[2,118],"130":[2,118],"131":[2,118],"133":[2,118],"134":[2,118],"135":[2,118],"136":[2,118],"137":[2,118],"138":[2,118],"139":[2,118],"140":[2,118],"141":[2,118],"142":[2,118],"143":[2,118],"144":[2,118]},{"1":[2,119],"4":[2,119],"29":[2,119],"30":[2,119],"31":155,"32":[1,76],"47":[2,119],"55":[2,119],"59":[2,119],"68":[2,119],"69":[2,119],"70":[2,119],"71":[2,119],"74":[2,119],"75":[2,119],"76":[2,119],"77":[2,119],"80":[2,119],"88":[2,119],"89":[2,119],"90":[2,119],"94":[2,119],"96":[2,119],"105":[2,119],"107":[2,119],"108":[2,119],"109":[2,119],"113":[2,119],"121":[2,119],"130":[2,119],"131":[2,119],"133":[2,119],"134":[2,119],"135":[2,119],"136":[2,119],"137":[2,119],"138":[2,119],"139":[2,119],"140":[2,119],"141":[2,119],"142":[2,119],"143":[2,119],"144":[2,119]},{"4":[2,55],"29":[2,55]},{"4":[2,56],"29":[2,56]},{"8":156,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":157,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":158,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":159,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[1,125],"6":160,"8":161,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"31":166,"32":[1,76],"63":167,"64":168,"66":162,"78":[1,73],"95":[1,59],"116":163,"117":[1,164],"118":165},{"115":169,"119":[1,170],"120":[1,171]},{"1":[2,67],"4":[2,67],"29":[2,67],"30":[2,67],"41":[2,67],"47":[2,67],"55":[2,67],"59":[2,67],"68":[2,67],"69":[2,67],"70":[2,67],"71":[2,67],"74":[2,67],"75":[2,67],"76":[2,67],"77":[2,67],"80":[2,67],"82":[2,67],"88":[2,67],"89":[2,67],"90":[2,67],"94":[2,67],"96":[2,67],"105":[2,67],"107":[2,67],"108":[2,67],"109":[2,67],"113":[2,67],"121":[2,67],"130":[2,67],"131":[2,67],"133":[2,67],"134":[2,67],"135":[2,67],"136":[2,67],"137":[2,67],"138":[2,67],"139":[2,67],"140":[2,67],"141":[2,67],"142":[2,67],"143":[2,67],"144":[2,67]},{"1":[2,70],"4":[2,70],"29":[2,70],"30":[2,70],"41":[2,70],"47":[2,70],"55":[2,70],"59":[2,70],"68":[2,70],"69":[2,70],"70":[2,70],"71":[2,70],"74":[2,70],"75":[2,70],"76":[2,70],"77":[2,70],"80":[2,70],"82":[2,70],"88":[2,70],"89":[2,70],"90":[2,70],"94":[2,70],"96":[2,70],"105":[2,70],"107":[2,70],"108":[2,70],"109":[2,70],"113":[2,70],"121":[2,70],"130":[2,70],"131":[2,70],"133":[2,70],"134":[2,70],"135":[2,70],"136":[2,70],"137":[2,70],"138":[2,70],"139":[2,70],"140":[2,70],"141":[2,70],"142":[2,70],"143":[2,70],"144":[2,70]},{"4":[2,89],"28":177,"29":[2,89],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":173,"43":176,"46":[1,49],"55":[2,89],"58":[1,178],"79":172,"80":[2,89]},{"1":[2,33],"4":[2,33],"29":[2,33],"30":[2,33],"44":[2,33],"47":[2,33],"55":[2,33],"59":[2,33],"68":[2,33],"69":[2,33],"70":[2,33],"71":[2,33],"74":[2,33],"75":[2,33],"76":[2,33],"77":[2,33],"80":[2,33],"88":[2,33],"89":[2,33],"90":[2,33],"94":[2,33],"96":[2,33],"105":[2,33],"107":[2,33],"108":[2,33],"109":[2,33],"113":[2,33],"121":[2,33],"130":[2,33],"131":[2,33],"133":[2,33],"134":[2,33],"135":[2,33],"136":[2,33],"137":[2,33],"138":[2,33],"139":[2,33],"140":[2,33],"141":[2,33],"142":[2,33],"143":[2,33],"144":[2,33]},{"1":[2,34],"4":[2,34],"29":[2,34],"30":[2,34],"44":[2,34],"47":[2,34],"55":[2,34],"59":[2,34],"68":[2,34],"69":[2,34],"70":[2,34],"71":[2,34],"74":[2,34],"75":[2,34],"76":[2,34],"77":[2,34],"80":[2,34],"88":[2,34],"89":[2,34],"90":[2,34],"94":[2,34],"96":[2,34],"105":[2,34],"107":[2,34],"108":[2,34],"109":[2,34],"113":[2,34],"121":[2,34],"130":[2,34],"131":[2,34],"133":[2,34],"134":[2,34],"135":[2,34],"136":[2,34],"137":[2,34],"138":[2,34],"139":[2,34],"140":[2,34],"141":[2,34],"142":[2,34],"143":[2,34],"144":[2,34]},{"1":[2,32],"4":[2,32],"29":[2,32],"30":[2,32],"41":[2,32],"44":[2,32],"47":[2,32],"55":[2,32],"59":[2,32],"68":[2,32],"69":[2,32],"70":[2,32],"71":[2,32],"74":[2,32],"75":[2,32],"76":[2,32],"77":[2,32],"80":[2,32],"82":[2,32],"88":[2,32],"89":[2,32],"90":[2,32],"94":[2,32],"96":[2,32],"105":[2,32],"107":[2,32],"108":[2,32],"109":[2,32],"113":[2,32],"119":[2,32],"120":[2,32],"121":[2,32],"130":[2,32],"131":[2,32],"133":[2,32],"134":[2,32],"135":[2,32],"136":[2,32],"137":[2,32],"138":[2,32],"139":[2,32],"140":[2,32],"141":[2,32],"142":[2,32],"143":[2,32],"144":[2,32]},{"1":[2,31],"4":[2,31],"29":[2,31],"30":[2,31],"47":[2,31],"55":[2,31],"59":[2,31],"75":[2,31],"80":[2,31],"90":[2,31],"94":[2,31],"96":[2,31],"101":[2,31],"102":[2,31],"105":[2,31],"107":[2,31],"108":[2,31],"109":[2,31],"113":[2,31],"121":[2,31],"124":[2,31],"126":[2,31],"130":[2,31],"131":[2,31],"133":[2,31],"134":[2,31],"135":[2,31],"136":[2,31],"137":[2,31],"138":[2,31],"139":[2,31],"140":[2,31],"141":[2,31],"142":[2,31],"144":[2,31]},{"1":[2,7],"4":[2,7],"7":179,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[2,7],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,4]},{"4":[1,78],"30":[1,180]},{"1":[2,30],"4":[2,30],"29":[2,30],"30":[2,30],"47":[2,30],"55":[2,30],"59":[2,30],"75":[2,30],"80":[2,30],"90":[2,30],"94":[2,30],"96":[2,30],"101":[2,30],"102":[2,30],"105":[2,30],"107":[2,30],"108":[2,30],"109":[2,30],"113":[2,30],"121":[2,30],"124":[2,30],"126":[2,30],"130":[2,30],"131":[2,30],"133":[2,30],"134":[2,30],"135":[2,30],"136":[2,30],"137":[2,30],"138":[2,30],"139":[2,30],"140":[2,30],"141":[2,30],"142":[2,30],"144":[2,30]},{"1":[2,197],"4":[2,197],"29":[2,197],"30":[2,197],"47":[2,197],"55":[2,197],"59":[2,197],"75":[2,197],"80":[2,197],"90":[2,197],"94":[2,197],"96":[2,197],"105":[2,197],"107":[2,197],"108":[2,197],"109":[2,197],"113":[2,197],"121":[2,197],"130":[2,197],"131":[2,197],"133":[2,197],"134":[2,197],"135":[2,197],"136":[2,197],"137":[2,197],"138":[2,197],"139":[2,197],"140":[2,197],"141":[2,197],"142":[2,197],"144":[2,197]},{"1":[2,198],"4":[2,198],"29":[2,198],"30":[2,198],"47":[2,198],"55":[2,198],"59":[2,198],"75":[2,198],"80":[2,198],"90":[2,198],"94":[2,198],"96":[2,198],"105":[2,198],"107":[2,198],"108":[2,198],"109":[2,198],"113":[2,198],"121":[2,198],"130":[2,198],"131":[2,198],"133":[2,198],"134":[2,198],"135":[2,198],"136":[2,198],"137":[2,198],"138":[2,198],"139":[2,198],"140":[2,198],"141":[2,198],"142":[2,198],"144":[2,198]},{"8":181,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":182,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":183,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":184,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":185,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":186,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":187,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":188,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":189,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":190,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":191,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,152],"4":[2,152],"29":[2,152],"30":[2,152],"47":[2,152],"55":[2,152],"59":[2,152],"75":[2,152],"80":[2,152],"90":[2,152],"94":[2,152],"96":[2,152],"105":[2,152],"107":[2,152],"108":[2,152],"109":[2,152],"113":[2,152],"121":[2,152],"130":[2,152],"131":[2,152],"133":[2,152],"134":[2,152],"135":[2,152],"136":[2,152],"137":[2,152],"138":[2,152],"139":[2,152],"140":[2,152],"141":[2,152],"142":[2,152],"144":[2,152]},{"1":[2,157],"4":[2,157],"29":[2,157],"30":[2,157],"47":[2,157],"55":[2,157],"59":[2,157],"75":[2,157],"80":[2,157],"90":[2,157],"94":[2,157],"96":[2,157],"105":[2,157],"107":[2,157],"108":[2,157],"109":[2,157],"113":[2,157],"121":[2,157],"130":[2,157],"131":[2,157],"133":[2,157],"134":[2,157],"135":[2,157],"136":[2,157],"137":[2,157],"138":[2,157],"139":[2,157],"140":[2,157],"141":[2,157],"142":[2,157],"144":[2,157]},{"1":[2,52],"4":[2,52],"29":[2,52],"30":[2,52],"47":[2,52],"55":[2,52],"59":[2,52],"75":[2,52],"80":[2,52],"90":[2,52],"94":[2,52],"96":[2,52],"105":[2,52],"107":[2,52],"108":[2,52],"109":[2,52],"113":[2,52],"121":[2,52],"130":[2,52],"131":[2,52],"133":[2,52],"134":[2,52],"135":[2,52],"136":[2,52],"137":[2,52],"138":[2,52],"139":[2,52],"140":[2,52],"141":[2,52],"142":[2,52],"144":[2,52]},{"8":192,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":193,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,151],"4":[2,151],"29":[2,151],"30":[2,151],"47":[2,151],"55":[2,151],"59":[2,151],"75":[2,151],"80":[2,151],"90":[2,151],"94":[2,151],"96":[2,151],"105":[2,151],"107":[2,151],"108":[2,151],"109":[2,151],"113":[2,151],"121":[2,151],"130":[2,151],"131":[2,151],"133":[2,151],"134":[2,151],"135":[2,151],"136":[2,151],"137":[2,151],"138":[2,151],"139":[2,151],"140":[2,151],"141":[2,151],"142":[2,151],"144":[2,151]},{"1":[2,156],"4":[2,156],"29":[2,156],"30":[2,156],"47":[2,156],"55":[2,156],"59":[2,156],"75":[2,156],"80":[2,156],"90":[2,156],"94":[2,156],"96":[2,156],"105":[2,156],"107":[2,156],"108":[2,156],"109":[2,156],"113":[2,156],"121":[2,156],"130":[2,156],"131":[2,156],"133":[2,156],"134":[2,156],"135":[2,156],"136":[2,156],"137":[2,156],"138":[2,156],"139":[2,156],"140":[2,156],"141":[2,156],"142":[2,156],"144":[2,156]},{"86":194,"89":[1,119]},{"8":195,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,196],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,68],"4":[2,68],"29":[2,68],"30":[2,68],"41":[2,68],"47":[2,68],"55":[2,68],"59":[2,68],"68":[2,68],"69":[2,68],"70":[2,68],"71":[2,68],"74":[2,68],"75":[2,68],"76":[2,68],"77":[2,68],"80":[2,68],"82":[2,68],"88":[2,68],"89":[2,68],"90":[2,68],"94":[2,68],"96":[2,68],"105":[2,68],"107":[2,68],"108":[2,68],"109":[2,68],"113":[2,68],"121":[2,68],"130":[2,68],"131":[2,68],"133":[2,68],"134":[2,68],"135":[2,68],"136":[2,68],"137":[2,68],"138":[2,68],"139":[2,68],"140":[2,68],"141":[2,68],"142":[2,68],"143":[2,68],"144":[2,68]},{"89":[2,115]},{"31":197,"32":[1,76]},{"31":198,"32":[1,76]},{"1":[2,81],"4":[2,81],"29":[2,81],"30":[2,81],"41":[2,81],"47":[2,81],"55":[2,81],"59":[2,81],"68":[2,81],"69":[2,81],"70":[2,81],"71":[2,81],"74":[2,81],"75":[2,81],"76":[2,81],"77":[2,81],"80":[2,81],"82":[2,81],"88":[2,81],"89":[2,81],"90":[2,81],"94":[2,81],"96":[2,81],"105":[2,81],"107":[2,81],"108":[2,81],"109":[2,81],"113":[2,81],"121":[2,81],"130":[2,81],"131":[2,81],"133":[2,81],"134":[2,81],"135":[2,81],"136":[2,81],"137":[2,81],"138":[2,81],"139":[2,81],"140":[2,81],"141":[2,81],"142":[2,81],"143":[2,81],"144":[2,81]},{"31":199,"32":[1,76]},{"1":[2,83],"4":[2,83],"29":[2,83],"30":[2,83],"41":[2,83],"47":[2,83],"55":[2,83],"59":[2,83],"68":[2,83],"69":[2,83],"70":[2,83],"71":[2,83],"74":[2,83],"75":[2,83],"76":[2,83],"77":[2,83],"80":[2,83],"82":[2,83],"88":[2,83],"89":[2,83],"90":[2,83],"94":[2,83],"96":[2,83],"105":[2,83],"107":[2,83],"108":[2,83],"109":[2,83],"113":[2,83],"121":[2,83],"130":[2,83],"131":[2,83],"133":[2,83],"134":[2,83],"135":[2,83],"136":[2,83],"137":[2,83],"138":[2,83],"139":[2,83],"140":[2,83],"141":[2,83],"142":[2,83],"143":[2,83],"144":[2,83]},{"1":[2,84],"4":[2,84],"29":[2,84],"30":[2,84],"41":[2,84],"47":[2,84],"55":[2,84],"59":[2,84],"68":[2,84],"69":[2,84],"70":[2,84],"71":[2,84],"74":[2,84],"75":[2,84],"76":[2,84],"77":[2,84],"80":[2,84],"82":[2,84],"88":[2,84],"89":[2,84],"90":[2,84],"94":[2,84],"96":[2,84],"105":[2,84],"107":[2,84],"108":[2,84],"109":[2,84],"113":[2,84],"121":[2,84],"130":[2,84],"131":[2,84],"133":[2,84],"134":[2,84],"135":[2,84],"136":[2,84],"137":[2,84],"138":[2,84],"139":[2,84],"140":[2,84],"141":[2,84],"142":[2,84],"143":[2,84],"144":[2,84]},{"8":200,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"59":[1,203],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"93":201,"94":[1,202],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"72":204,"74":[1,205],"76":[1,113],"77":[1,114]},{"72":206,"74":[1,205],"76":[1,113],"77":[1,114]},{"86":207,"89":[1,119]},{"1":[2,69],"4":[2,69],"29":[2,69],"30":[2,69],"41":[2,69],"47":[2,69],"55":[2,69],"59":[2,69],"68":[2,69],"69":[2,69],"70":[2,69],"71":[2,69],"74":[2,69],"75":[2,69],"76":[2,69],"77":[2,69],"80":[2,69],"82":[2,69],"88":[2,69],"89":[2,69],"90":[2,69],"94":[2,69],"96":[2,69],"105":[2,69],"107":[2,69],"108":[2,69],"109":[2,69],"113":[2,69],"121":[2,69],"130":[2,69],"131":[2,69],"133":[2,69],"134":[2,69],"135":[2,69],"136":[2,69],"137":[2,69],"138":[2,69],"139":[2,69],"140":[2,69],"141":[2,69],"142":[2,69],"143":[2,69],"144":[2,69]},{"8":208,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,209],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,113],"4":[2,113],"29":[2,113],"30":[2,113],"47":[2,113],"55":[2,113],"59":[2,113],"68":[2,113],"69":[2,113],"70":[2,113],"71":[2,113],"74":[2,113],"75":[2,113],"76":[2,113],"77":[2,113],"80":[2,113],"88":[2,113],"89":[2,113],"90":[2,113],"94":[2,113],"96":[2,113],"105":[2,113],"107":[2,113],"108":[2,113],"109":[2,113],"113":[2,113],"121":[2,113],"130":[2,113],"131":[2,113],"133":[2,113],"134":[2,113],"135":[2,113],"136":[2,113],"137":[2,113],"138":[2,113],"139":[2,113],"140":[2,113],"141":[2,113],"142":[2,113],"144":[2,113]},{"8":212,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"90":[1,210],"91":211,"92":[1,60],"95":[1,59],"97":152,"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"50":[1,213],"55":[1,214]},{"50":[2,60],"55":[2,60]},{"50":[2,62],"55":[2,62],"59":[1,215]},{"57":[1,216]},{"1":[2,54],"4":[2,54],"29":[2,54],"30":[2,54],"47":[2,54],"55":[2,54],"59":[2,54],"75":[2,54],"80":[2,54],"90":[2,54],"94":[2,54],"96":[2,54],"105":[2,54],"107":[2,54],"108":[2,54],"109":[2,54],"113":[2,54],"121":[2,54],"130":[2,54],"131":[2,54],"133":[2,54],"134":[2,54],"135":[2,54],"136":[2,54],"137":[2,54],"138":[2,54],"139":[2,54],"140":[2,54],"141":[2,54],"142":[2,54],"144":[2,54]},{"28":77,"46":[1,49]},{"1":[2,192],"4":[2,192],"29":[2,192],"30":[2,192],"47":[1,97],"55":[2,192],"59":[2,192],"75":[2,192],"80":[2,192],"90":[2,192],"94":[2,192],"96":[2,192],"105":[2,192],"106":95,"107":[2,192],"108":[2,192],"109":[2,192],"112":96,"113":[2,192],"114":70,"121":[2,192],"130":[2,192],"131":[2,192],"133":[2,192],"134":[2,192],"135":[1,82],"136":[1,83],"137":[2,192],"138":[2,192],"139":[2,192],"140":[2,192],"141":[2,192],"142":[2,192],"144":[2,192]},{"106":100,"107":[1,66],"109":[1,67],"112":101,"113":[1,69],"114":70,"130":[1,98],"131":[1,99]},{"1":[2,193],"4":[2,193],"29":[2,193],"30":[2,193],"47":[1,97],"55":[2,193],"59":[2,193],"75":[2,193],"80":[2,193],"90":[2,193],"94":[2,193],"96":[2,193],"105":[2,193],"106":95,"107":[2,193],"108":[2,193],"109":[2,193],"112":96,"113":[2,193],"114":70,"121":[2,193],"130":[2,193],"131":[2,193],"133":[2,193],"134":[2,193],"135":[1,82],"136":[1,83],"137":[2,193],"138":[2,193],"139":[2,193],"140":[2,193],"141":[2,193],"142":[2,193],"144":[2,193]},{"1":[2,194],"4":[2,194],"29":[2,194],"30":[2,194],"47":[1,97],"55":[2,194],"59":[2,194],"75":[2,194],"80":[2,194],"90":[2,194],"94":[2,194],"96":[2,194],"105":[2,194],"106":95,"107":[2,194],"108":[2,194],"109":[2,194],"112":96,"113":[2,194],"114":70,"121":[2,194],"130":[2,194],"131":[2,194],"133":[2,194],"134":[2,194],"135":[1,82],"136":[1,83],"137":[2,194],"138":[2,194],"139":[2,194],"140":[2,194],"141":[2,194],"142":[2,194],"144":[2,194]},{"1":[2,195],"4":[2,195],"29":[2,195],"30":[2,195],"47":[2,195],"55":[2,195],"59":[2,195],"75":[2,195],"80":[2,195],"90":[2,195],"94":[2,195],"96":[2,195],"105":[2,195],"106":95,"107":[2,195],"108":[2,195],"109":[2,195],"112":96,"113":[2,195],"114":70,"121":[2,195],"130":[2,195],"131":[2,195],"133":[2,195],"134":[2,195],"137":[2,195],"138":[2,195],"139":[2,195],"140":[2,195],"141":[2,195],"142":[2,195],"144":[2,195]},{"1":[2,196],"4":[2,196],"29":[2,196],"30":[2,196],"47":[2,196],"55":[2,196],"59":[2,196],"75":[2,196],"80":[2,196],"90":[2,196],"94":[2,196],"96":[2,196],"105":[2,196],"106":95,"107":[2,196],"108":[2,196],"109":[2,196],"112":96,"113":[2,196],"114":70,"121":[2,196],"130":[2,196],"131":[2,196],"133":[2,196],"134":[2,196],"137":[2,196],"138":[2,196],"139":[2,196],"140":[2,196],"141":[2,196],"142":[2,196],"144":[2,196]},{"4":[1,125],"6":218,"29":[1,6],"128":[1,217]},{"1":[2,138],"4":[2,138],"29":[2,138],"30":[2,138],"47":[2,138],"55":[2,138],"59":[2,138],"75":[2,138],"80":[2,138],"90":[2,138],"94":[2,138],"96":[2,138],"100":219,"101":[1,220],"102":[1,221],"105":[2,138],"107":[2,138],"108":[2,138],"109":[2,138],"113":[2,138],"121":[2,138],"130":[2,138],"131":[2,138],"133":[2,138],"134":[2,138],"135":[2,138],"136":[2,138],"137":[2,138],"138":[2,138],"139":[2,138],"140":[2,138],"141":[2,138],"142":[2,138],"144":[2,138]},{"1":[2,150],"4":[2,150],"29":[2,150],"30":[2,150],"47":[2,150],"55":[2,150],"59":[2,150],"75":[2,150],"80":[2,150],"90":[2,150],"94":[2,150],"96":[2,150],"105":[2,150],"107":[2,150],"108":[2,150],"109":[2,150],"113":[2,150],"121":[2,150],"130":[2,150],"131":[2,150],"133":[2,150],"134":[2,150],"135":[2,150],"136":[2,150],"137":[2,150],"138":[2,150],"139":[2,150],"140":[2,150],"141":[2,150],"142":[2,150],"144":[2,150]},{"1":[2,158],"4":[2,158],"29":[2,158],"30":[2,158],"47":[2,158],"55":[2,158],"59":[2,158],"75":[2,158],"80":[2,158],"90":[2,158],"94":[2,158],"96":[2,158],"105":[2,158],"107":[2,158],"108":[2,158],"109":[2,158],"113":[2,158],"121":[2,158],"130":[2,158],"131":[2,158],"133":[2,158],"134":[2,158],"135":[2,158],"136":[2,158],"137":[2,158],"138":[2,158],"139":[2,158],"140":[2,158],"141":[2,158],"142":[2,158],"144":[2,158]},{"29":[1,222],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"123":223,"125":224,"126":[1,225]},{"15":226,"16":143,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":144,"43":72,"58":[1,61],"61":227,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"87":[1,33],"92":[1,60],"95":[1,59],"104":[1,58]},{"1":[2,94],"4":[2,94],"29":[1,229],"30":[2,94],"47":[2,94],"55":[2,94],"59":[2,94],"68":[2,71],"69":[2,71],"70":[2,71],"71":[2,71],"74":[2,71],"75":[2,94],"76":[2,71],"77":[2,71],"80":[2,94],"82":[1,228],"88":[2,71],"89":[2,71],"90":[2,94],"94":[2,94],"96":[2,94],"105":[2,94],"107":[2,94],"108":[2,94],"109":[2,94],"113":[2,94],"121":[2,94],"130":[2,94],"131":[2,94],"133":[2,94],"134":[2,94],"135":[2,94],"136":[2,94],"137":[2,94],"138":[2,94],"139":[2,94],"140":[2,94],"141":[2,94],"142":[2,94],"144":[2,94]},{"4":[2,105],"28":177,"30":[2,105],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"83":230,"84":231},{"15":235,"16":143,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":144,"43":72,"58":[1,61],"61":227,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"87":[1,33],"92":[1,60],"95":[1,59],"104":[1,58]},{"62":104,"68":[1,106],"69":[1,107],"70":[1,108],"71":[1,109],"72":110,"73":111,"74":[1,112],"76":[1,113],"77":[1,114],"85":102,"88":[1,105],"89":[2,114]},{"62":116,"68":[1,106],"69":[1,107],"70":[1,108],"71":[1,109],"72":110,"73":111,"74":[1,112],"76":[1,113],"77":[1,114],"85":115,"88":[1,105],"89":[2,114]},{"1":[2,74],"4":[2,74],"29":[2,74],"30":[2,74],"47":[2,74],"55":[2,74],"59":[2,74],"68":[2,74],"69":[2,74],"70":[2,74],"71":[2,74],"74":[2,74],"75":[2,74],"76":[2,74],"77":[2,74],"80":[2,74],"88":[2,74],"89":[2,74],"90":[2,74],"94":[2,74],"96":[2,74],"105":[2,74],"107":[2,74],"108":[2,74],"109":[2,74],"113":[2,74],"121":[2,74],"130":[2,74],"131":[2,74],"133":[2,74],"134":[2,74],"135":[2,74],"136":[2,74],"137":[2,74],"138":[2,74],"139":[2,74],"140":[2,74],"141":[2,74],"142":[2,74],"144":[2,74]},{"1":[2,49],"4":[2,49],"30":[2,49],"47":[1,97],"105":[2,49],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[2,49],"131":[2,49],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,143],"4":[2,143],"30":[2,143],"47":[1,97],"105":[2,143],"106":95,"107":[2,143],"109":[2,143],"112":96,"113":[2,143],"114":70,"130":[2,143],"131":[2,143],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"105":[1,236]},{"1":[2,145],"4":[2,145],"29":[2,145],"30":[2,145],"47":[2,145],"55":[2,145],"59":[2,145],"68":[2,145],"69":[2,145],"70":[2,145],"71":[2,145],"74":[2,145],"75":[2,145],"76":[2,145],"77":[2,145],"80":[2,145],"88":[2,145],"89":[2,145],"90":[2,145],"94":[2,145],"96":[2,145],"105":[2,145],"107":[2,145],"108":[2,145],"109":[2,145],"113":[2,145],"121":[2,145],"130":[2,145],"131":[2,145],"133":[2,145],"134":[2,145],"135":[2,145],"136":[2,145],"137":[2,145],"138":[2,145],"139":[2,145],"140":[2,145],"141":[2,145],"142":[2,145],"143":[2,145],"144":[2,145]},{"4":[2,134],"29":[2,134],"47":[1,97],"55":[2,134],"59":[1,238],"93":237,"94":[1,202],"96":[2,134],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,127],"4":[2,127],"29":[2,127],"30":[2,127],"41":[2,127],"47":[2,127],"55":[2,127],"59":[2,127],"68":[2,127],"69":[2,127],"70":[2,127],"71":[2,127],"74":[2,127],"75":[2,127],"76":[2,127],"77":[2,127],"80":[2,127],"88":[2,127],"89":[2,127],"90":[2,127],"94":[2,127],"96":[2,127],"105":[2,127],"107":[2,127],"108":[2,127],"109":[2,127],"113":[2,127],"119":[2,127],"120":[2,127],"121":[2,127],"130":[2,127],"131":[2,127],"133":[2,127],"134":[2,127],"135":[2,127],"136":[2,127],"137":[2,127],"138":[2,127],"139":[2,127],"140":[2,127],"141":[2,127],"142":[2,127],"143":[2,127],"144":[2,127]},{"4":[2,57],"29":[2,57],"54":239,"55":[1,240],"96":[2,57]},{"4":[2,129],"29":[2,129],"30":[2,129],"55":[2,129],"90":[2,129],"96":[2,129]},{"8":212,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"91":241,"92":[1,60],"95":[1,59],"97":152,"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,135],"29":[2,135],"30":[2,135],"55":[2,135],"90":[2,135],"96":[2,135]},{"1":[2,122],"4":[2,122],"29":[2,122],"30":[2,122],"41":[2,122],"44":[2,122],"47":[2,122],"55":[2,122],"59":[2,122],"68":[2,122],"69":[2,122],"70":[2,122],"71":[2,122],"74":[2,122],"75":[2,122],"76":[2,122],"77":[2,122],"80":[2,122],"82":[2,122],"88":[2,122],"89":[2,122],"90":[2,122],"94":[2,122],"96":[2,122],"105":[2,122],"107":[2,122],"108":[2,122],"109":[2,122],"113":[2,122],"121":[2,122],"130":[2,122],"131":[2,122],"133":[2,122],"134":[2,122],"135":[2,122],"136":[2,122],"137":[2,122],"138":[2,122],"139":[2,122],"140":[2,122],"141":[2,122],"142":[2,122],"143":[2,122],"144":[2,122]},{"4":[1,125],"6":242,"29":[1,6],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"4":[1,125],"6":243,"29":[1,6],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,146],"4":[2,146],"29":[2,146],"30":[2,146],"47":[1,97],"55":[2,146],"59":[2,146],"75":[2,146],"80":[2,146],"90":[2,146],"94":[2,146],"96":[2,146],"105":[2,146],"106":95,"107":[1,66],"108":[1,244],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,146],"130":[2,146],"131":[2,146],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,148],"4":[2,148],"29":[2,148],"30":[2,148],"47":[1,97],"55":[2,148],"59":[2,148],"75":[2,148],"80":[2,148],"90":[2,148],"94":[2,148],"96":[2,148],"105":[2,148],"106":95,"107":[1,66],"108":[1,245],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,148],"130":[2,148],"131":[2,148],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,154],"4":[2,154],"29":[2,154],"30":[2,154],"47":[2,154],"55":[2,154],"59":[2,154],"75":[2,154],"80":[2,154],"90":[2,154],"94":[2,154],"96":[2,154],"105":[2,154],"107":[2,154],"108":[2,154],"109":[2,154],"113":[2,154],"121":[2,154],"130":[2,154],"131":[2,154],"133":[2,154],"134":[2,154],"135":[2,154],"136":[2,154],"137":[2,154],"138":[2,154],"139":[2,154],"140":[2,154],"141":[2,154],"142":[2,154],"144":[2,154]},{"1":[2,155],"4":[2,155],"29":[2,155],"30":[2,155],"47":[1,97],"55":[2,155],"59":[2,155],"75":[2,155],"80":[2,155],"90":[2,155],"94":[2,155],"96":[2,155],"105":[2,155],"106":95,"107":[1,66],"108":[2,155],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,155],"130":[2,155],"131":[2,155],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,159],"4":[2,159],"29":[2,159],"30":[2,159],"47":[2,159],"55":[2,159],"59":[2,159],"75":[2,159],"80":[2,159],"90":[2,159],"94":[2,159],"96":[2,159],"105":[2,159],"107":[2,159],"108":[2,159],"109":[2,159],"113":[2,159],"121":[2,159],"130":[2,159],"131":[2,159],"133":[2,159],"134":[2,159],"135":[2,159],"136":[2,159],"137":[2,159],"138":[2,159],"139":[2,159],"140":[2,159],"141":[2,159],"142":[2,159],"144":[2,159]},{"119":[2,161],"120":[2,161]},{"31":166,"32":[1,76],"63":167,"64":168,"78":[1,73],"95":[1,247],"116":246,"118":165},{"55":[1,248],"119":[2,166],"120":[2,166]},{"55":[2,163],"119":[2,163],"120":[2,163]},{"55":[2,164],"119":[2,164],"120":[2,164]},{"55":[2,165],"119":[2,165],"120":[2,165]},{"1":[2,160],"4":[2,160],"29":[2,160],"30":[2,160],"47":[2,160],"55":[2,160],"59":[2,160],"75":[2,160],"80":[2,160],"90":[2,160],"94":[2,160],"96":[2,160],"105":[2,160],"107":[2,160],"108":[2,160],"109":[2,160],"113":[2,160],"121":[2,160],"130":[2,160],"131":[2,160],"133":[2,160],"134":[2,160],"135":[2,160],"136":[2,160],"137":[2,160],"138":[2,160],"139":[2,160],"140":[2,160],"141":[2,160],"142":[2,160],"144":[2,160]},{"8":249,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":250,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,57],"29":[2,57],"54":251,"55":[1,252],"80":[2,57]},{"4":[2,90],"29":[2,90],"30":[2,90],"55":[2,90],"80":[2,90]},{"4":[2,41],"29":[2,41],"30":[2,41],"44":[1,253],"55":[2,41],"80":[2,41]},{"4":[2,42],"29":[2,42],"30":[2,42],"44":[1,254],"55":[2,42],"80":[2,42]},{"4":[2,43],"29":[2,43],"30":[2,43],"55":[2,43],"80":[2,43]},{"4":[2,48],"29":[2,48],"30":[2,48],"55":[2,48],"80":[2,48]},{"31":155,"32":[1,76]},{"1":[2,6],"4":[2,6],"30":[2,6]},{"1":[2,29],"4":[2,29],"29":[2,29],"30":[2,29],"47":[2,29],"55":[2,29],"59":[2,29],"75":[2,29],"80":[2,29],"90":[2,29],"94":[2,29],"96":[2,29],"101":[2,29],"102":[2,29],"105":[2,29],"107":[2,29],"108":[2,29],"109":[2,29],"113":[2,29],"121":[2,29],"124":[2,29],"126":[2,29],"130":[2,29],"131":[2,29],"133":[2,29],"134":[2,29],"135":[2,29],"136":[2,29],"137":[2,29],"138":[2,29],"139":[2,29],"140":[2,29],"141":[2,29],"142":[2,29],"144":[2,29]},{"1":[2,199],"4":[2,199],"29":[2,199],"30":[2,199],"47":[1,97],"55":[2,199],"59":[2,199],"75":[2,199],"80":[2,199],"90":[2,199],"94":[2,199],"96":[2,199],"105":[2,199],"106":95,"107":[2,199],"108":[2,199],"109":[2,199],"112":96,"113":[2,199],"114":70,"121":[2,199],"130":[2,199],"131":[2,199],"133":[2,199],"134":[2,199],"135":[1,82],"136":[1,83],"137":[2,199],"138":[2,199],"139":[1,88],"140":[2,199],"141":[2,199],"142":[2,199],"144":[2,199]},{"1":[2,200],"4":[2,200],"29":[2,200],"30":[2,200],"47":[1,97],"55":[2,200],"59":[2,200],"75":[2,200],"80":[2,200],"90":[2,200],"94":[2,200],"96":[2,200],"105":[2,200],"106":95,"107":[2,200],"108":[2,200],"109":[2,200],"112":96,"113":[2,200],"114":70,"121":[2,200],"130":[2,200],"131":[2,200],"133":[2,200],"134":[2,200],"135":[1,82],"136":[1,83],"137":[2,200],"138":[2,200],"139":[1,88],"140":[2,200],"141":[2,200],"142":[2,200],"144":[2,200]},{"1":[2,201],"4":[2,201],"29":[2,201],"30":[2,201],"47":[1,97],"55":[2,201],"59":[2,201],"75":[2,201],"80":[2,201],"90":[2,201],"94":[2,201],"96":[2,201],"105":[2,201],"106":95,"107":[2,201],"108":[2,201],"109":[2,201],"112":96,"113":[2,201],"114":70,"121":[2,201],"130":[2,201],"131":[2,201],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[2,201],"138":[2,201],"139":[1,88],"140":[1,89],"141":[1,90],"142":[2,201],"144":[1,92]},{"1":[2,202],"4":[2,202],"29":[2,202],"30":[2,202],"47":[1,97],"55":[2,202],"59":[2,202],"75":[2,202],"80":[2,202],"90":[2,202],"94":[2,202],"96":[2,202],"105":[2,202],"106":95,"107":[2,202],"108":[2,202],"109":[2,202],"112":96,"113":[2,202],"114":70,"121":[2,202],"130":[2,202],"131":[2,202],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[2,202],"138":[2,202],"139":[1,88],"140":[1,89],"141":[1,90],"142":[2,202],"144":[1,92]},{"1":[2,203],"4":[2,203],"29":[2,203],"30":[2,203],"47":[1,97],"55":[2,203],"59":[2,203],"75":[2,203],"80":[2,203],"90":[2,203],"94":[2,203],"96":[2,203],"105":[2,203],"106":95,"107":[2,203],"108":[2,203],"109":[2,203],"112":96,"113":[2,203],"114":70,"121":[2,203],"130":[2,203],"131":[2,203],"133":[2,203],"134":[2,203],"135":[1,82],"136":[1,83],"137":[2,203],"138":[2,203],"139":[2,203],"140":[2,203],"141":[2,203],"142":[2,203],"144":[2,203]},{"1":[2,204],"4":[2,204],"29":[2,204],"30":[2,204],"47":[1,97],"55":[2,204],"59":[2,204],"75":[2,204],"80":[2,204],"90":[2,204],"94":[2,204],"96":[2,204],"105":[2,204],"106":95,"107":[2,204],"108":[2,204],"109":[2,204],"112":96,"113":[2,204],"114":70,"121":[2,204],"130":[2,204],"131":[2,204],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[2,204],"138":[2,204],"139":[1,88],"140":[2,204],"141":[2,204],"142":[2,204],"144":[2,204]},{"1":[2,205],"4":[2,205],"29":[2,205],"30":[2,205],"47":[1,97],"55":[2,205],"59":[2,205],"75":[2,205],"80":[2,205],"90":[2,205],"94":[2,205],"96":[2,205],"105":[2,205],"106":95,"107":[2,205],"108":[2,205],"109":[2,205],"112":96,"113":[2,205],"114":70,"121":[2,205],"130":[2,205],"131":[2,205],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[2,205],"138":[2,205],"139":[1,88],"140":[1,89],"141":[2,205],"142":[2,205],"144":[2,205]},{"1":[2,206],"4":[2,206],"29":[2,206],"30":[2,206],"47":[1,97],"55":[2,206],"59":[2,206],"75":[2,206],"80":[2,206],"90":[2,206],"94":[2,206],"96":[2,206],"105":[2,206],"106":95,"107":[2,206],"108":[2,206],"109":[2,206],"112":96,"113":[2,206],"114":70,"121":[2,206],"130":[2,206],"131":[2,206],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[2,206],"144":[1,92]},{"1":[2,209],"4":[2,209],"29":[2,209],"30":[2,209],"47":[1,97],"55":[2,209],"59":[2,209],"75":[2,209],"80":[2,209],"90":[2,209],"94":[2,209],"96":[2,209],"105":[2,209],"106":95,"107":[2,209],"108":[2,209],"109":[2,209],"112":96,"113":[2,209],"114":70,"121":[2,209],"130":[2,209],"131":[2,209],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[2,209],"138":[2,209],"139":[1,88],"140":[1,89],"141":[1,90],"142":[2,209],"144":[2,209]},{"1":[2,189],"4":[2,189],"29":[2,189],"30":[2,189],"47":[1,97],"55":[2,189],"59":[2,189],"75":[2,189],"80":[2,189],"90":[2,189],"94":[2,189],"96":[2,189],"105":[2,189],"106":95,"107":[1,66],"108":[2,189],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,189],"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,191],"4":[2,191],"29":[2,191],"30":[2,191],"47":[1,97],"55":[2,191],"59":[2,191],"75":[2,191],"80":[2,191],"90":[2,191],"94":[2,191],"96":[2,191],"105":[2,191],"106":95,"107":[1,66],"108":[2,191],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,191],"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,188],"4":[2,188],"29":[2,188],"30":[2,188],"47":[1,97],"55":[2,188],"59":[2,188],"75":[2,188],"80":[2,188],"90":[2,188],"94":[2,188],"96":[2,188],"105":[2,188],"106":95,"107":[1,66],"108":[2,188],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,188],"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,190],"4":[2,190],"29":[2,190],"30":[2,190],"47":[1,97],"55":[2,190],"59":[2,190],"75":[2,190],"80":[2,190],"90":[2,190],"94":[2,190],"96":[2,190],"105":[2,190],"106":95,"107":[1,66],"108":[2,190],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,190],"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,110],"4":[2,110],"29":[2,110],"30":[2,110],"47":[2,110],"55":[2,110],"59":[2,110],"68":[2,110],"69":[2,110],"70":[2,110],"71":[2,110],"74":[2,110],"75":[2,110],"76":[2,110],"77":[2,110],"80":[2,110],"88":[2,110],"89":[2,110],"90":[2,110],"94":[2,110],"96":[2,110],"105":[2,110],"107":[2,110],"108":[2,110],"109":[2,110],"113":[2,110],"121":[2,110],"130":[2,110],"131":[2,110],"133":[2,110],"134":[2,110],"135":[2,110],"136":[2,110],"137":[2,110],"138":[2,110],"139":[2,110],"140":[2,110],"141":[2,110],"142":[2,110],"144":[2,110]},{"1":[2,207],"4":[2,207],"29":[2,207],"30":[2,207],"47":[1,97],"55":[2,207],"59":[2,207],"75":[2,207],"80":[2,207],"90":[2,207],"94":[2,207],"96":[2,207],"105":[2,207],"106":95,"107":[2,207],"108":[2,207],"109":[2,207],"112":96,"113":[2,207],"114":70,"121":[2,207],"130":[2,207],"131":[2,207],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"8":255,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,79],"4":[2,79],"29":[2,79],"30":[2,79],"41":[2,79],"47":[2,79],"55":[2,79],"59":[2,79],"68":[2,79],"69":[2,79],"70":[2,79],"71":[2,79],"74":[2,79],"75":[2,79],"76":[2,79],"77":[2,79],"80":[2,79],"82":[2,79],"88":[2,79],"89":[2,79],"90":[2,79],"94":[2,79],"96":[2,79],"105":[2,79],"107":[2,79],"108":[2,79],"109":[2,79],"113":[2,79],"121":[2,79],"130":[2,79],"131":[2,79],"133":[2,79],"134":[2,79],"135":[2,79],"136":[2,79],"137":[2,79],"138":[2,79],"139":[2,79],"140":[2,79],"141":[2,79],"142":[2,79],"143":[2,79],"144":[2,79]},{"1":[2,80],"4":[2,80],"29":[2,80],"30":[2,80],"41":[2,80],"47":[2,80],"55":[2,80],"59":[2,80],"68":[2,80],"69":[2,80],"70":[2,80],"71":[2,80],"74":[2,80],"75":[2,80],"76":[2,80],"77":[2,80],"80":[2,80],"82":[2,80],"88":[2,80],"89":[2,80],"90":[2,80],"94":[2,80],"96":[2,80],"105":[2,80],"107":[2,80],"108":[2,80],"109":[2,80],"113":[2,80],"121":[2,80],"130":[2,80],"131":[2,80],"133":[2,80],"134":[2,80],"135":[2,80],"136":[2,80],"137":[2,80],"138":[2,80],"139":[2,80],"140":[2,80],"141":[2,80],"142":[2,80],"143":[2,80],"144":[2,80]},{"1":[2,82],"4":[2,82],"29":[2,82],"30":[2,82],"41":[2,82],"47":[2,82],"55":[2,82],"59":[2,82],"68":[2,82],"69":[2,82],"70":[2,82],"71":[2,82],"74":[2,82],"75":[2,82],"76":[2,82],"77":[2,82],"80":[2,82],"82":[2,82],"88":[2,82],"89":[2,82],"90":[2,82],"94":[2,82],"96":[2,82],"105":[2,82],"107":[2,82],"108":[2,82],"109":[2,82],"113":[2,82],"121":[2,82],"130":[2,82],"131":[2,82],"133":[2,82],"134":[2,82],"135":[2,82],"136":[2,82],"137":[2,82],"138":[2,82],"139":[2,82],"140":[2,82],"141":[2,82],"142":[2,82],"143":[2,82],"144":[2,82]},{"47":[1,97],"59":[1,203],"75":[1,256],"93":257,"94":[1,202],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"8":258,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"12":[2,120],"13":[2,120],"14":[2,120],"32":[2,120],"34":[2,120],"35":[2,120],"37":[2,120],"38":[2,120],"39":[2,120],"45":[2,120],"46":[2,120],"48":[2,120],"52":[2,120],"53":[2,120],"58":[2,120],"75":[2,120],"78":[2,120],"81":[2,120],"87":[2,120],"92":[2,120],"95":[2,120],"99":[2,120],"103":[2,120],"104":[2,120],"107":[2,120],"109":[2,120],"111":[2,120],"113":[2,120],"122":[2,120],"128":[2,120],"129":[2,120],"132":[2,120],"133":[2,120],"134":[2,120],"135":[2,120],"136":[2,120]},{"12":[2,121],"13":[2,121],"14":[2,121],"32":[2,121],"34":[2,121],"35":[2,121],"37":[2,121],"38":[2,121],"39":[2,121],"45":[2,121],"46":[2,121],"48":[2,121],"52":[2,121],"53":[2,121],"58":[2,121],"75":[2,121],"78":[2,121],"81":[2,121],"87":[2,121],"92":[2,121],"95":[2,121],"99":[2,121],"103":[2,121],"104":[2,121],"107":[2,121],"109":[2,121],"111":[2,121],"113":[2,121],"122":[2,121],"128":[2,121],"129":[2,121],"132":[2,121],"133":[2,121],"134":[2,121],"135":[2,121],"136":[2,121]},{"1":[2,86],"4":[2,86],"29":[2,86],"30":[2,86],"41":[2,86],"47":[2,86],"55":[2,86],"59":[2,86],"68":[2,86],"69":[2,86],"70":[2,86],"71":[2,86],"74":[2,86],"75":[2,86],"76":[2,86],"77":[2,86],"80":[2,86],"82":[2,86],"88":[2,86],"89":[2,86],"90":[2,86],"94":[2,86],"96":[2,86],"105":[2,86],"107":[2,86],"108":[2,86],"109":[2,86],"113":[2,86],"121":[2,86],"130":[2,86],"131":[2,86],"133":[2,86],"134":[2,86],"135":[2,86],"136":[2,86],"137":[2,86],"138":[2,86],"139":[2,86],"140":[2,86],"141":[2,86],"142":[2,86],"143":[2,86],"144":[2,86]},{"8":259,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,87],"4":[2,87],"29":[2,87],"30":[2,87],"41":[2,87],"47":[2,87],"55":[2,87],"59":[2,87],"68":[2,87],"69":[2,87],"70":[2,87],"71":[2,87],"74":[2,87],"75":[2,87],"76":[2,87],"77":[2,87],"80":[2,87],"82":[2,87],"88":[2,87],"89":[2,87],"90":[2,87],"94":[2,87],"96":[2,87],"105":[2,87],"107":[2,87],"108":[2,87],"109":[2,87],"113":[2,87],"121":[2,87],"130":[2,87],"131":[2,87],"133":[2,87],"134":[2,87],"135":[2,87],"136":[2,87],"137":[2,87],"138":[2,87],"139":[2,87],"140":[2,87],"141":[2,87],"142":[2,87],"143":[2,87],"144":[2,87]},{"1":[2,111],"4":[2,111],"29":[2,111],"30":[2,111],"47":[2,111],"55":[2,111],"59":[2,111],"68":[2,111],"69":[2,111],"70":[2,111],"71":[2,111],"74":[2,111],"75":[2,111],"76":[2,111],"77":[2,111],"80":[2,111],"88":[2,111],"89":[2,111],"90":[2,111],"94":[2,111],"96":[2,111],"105":[2,111],"107":[2,111],"108":[2,111],"109":[2,111],"113":[2,111],"121":[2,111],"130":[2,111],"131":[2,111],"133":[2,111],"134":[2,111],"135":[2,111],"136":[2,111],"137":[2,111],"138":[2,111],"139":[2,111],"140":[2,111],"141":[2,111],"142":[2,111],"144":[2,111]},{"1":[2,39],"4":[2,39],"29":[2,39],"30":[2,39],"47":[1,97],"55":[2,39],"59":[2,39],"75":[2,39],"80":[2,39],"90":[2,39],"94":[2,39],"96":[2,39],"105":[2,39],"106":95,"107":[1,66],"108":[2,39],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,39],"130":[2,39],"131":[2,39],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"8":260,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,116],"4":[2,116],"29":[2,116],"30":[2,116],"47":[2,116],"55":[2,116],"59":[2,116],"68":[2,116],"69":[2,116],"70":[2,116],"71":[2,116],"74":[2,116],"75":[2,116],"76":[2,116],"77":[2,116],"80":[2,116],"88":[2,116],"89":[2,116],"90":[2,116],"94":[2,116],"96":[2,116],"105":[2,116],"107":[2,116],"108":[2,116],"109":[2,116],"113":[2,116],"121":[2,116],"130":[2,116],"131":[2,116],"133":[2,116],"134":[2,116],"135":[2,116],"136":[2,116],"137":[2,116],"138":[2,116],"139":[2,116],"140":[2,116],"141":[2,116],"142":[2,116],"144":[2,116]},{"4":[2,57],"29":[2,57],"54":261,"55":[1,240],"90":[2,57]},{"4":[2,134],"29":[2,134],"30":[2,134],"47":[1,97],"55":[2,134],"59":[1,262],"90":[2,134],"96":[2,134],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"51":263,"52":[1,62],"53":[1,63]},{"56":264,"57":[1,122],"58":[1,123]},{"50":[2,64],"55":[2,64]},{"50":[2,63],"55":[2,63],"59":[1,265]},{"8":266,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,186],"4":[2,186],"29":[2,186],"30":[2,186],"47":[2,186],"55":[2,186],"59":[2,186],"75":[2,186],"80":[2,186],"90":[2,186],"94":[2,186],"96":[2,186],"105":[2,186],"107":[2,186],"108":[2,186],"109":[2,186],"113":[2,186],"121":[2,186],"124":[2,186],"130":[2,186],"131":[2,186],"133":[2,186],"134":[2,186],"135":[2,186],"136":[2,186],"137":[2,186],"138":[2,186],"139":[2,186],"140":[2,186],"141":[2,186],"142":[2,186],"144":[2,186]},{"1":[2,139],"4":[2,139],"29":[2,139],"30":[2,139],"47":[2,139],"55":[2,139],"59":[2,139],"75":[2,139],"80":[2,139],"90":[2,139],"94":[2,139],"96":[2,139],"101":[1,267],"105":[2,139],"107":[2,139],"108":[2,139],"109":[2,139],"113":[2,139],"121":[2,139],"130":[2,139],"131":[2,139],"133":[2,139],"134":[2,139],"135":[2,139],"136":[2,139],"137":[2,139],"138":[2,139],"139":[2,139],"140":[2,139],"141":[2,139],"142":[2,139],"144":[2,139]},{"4":[1,125],"6":268,"29":[1,6]},{"31":269,"32":[1,76]},{"123":270,"125":224,"126":[1,225]},{"30":[1,271],"124":[1,272],"125":273,"126":[1,225]},{"30":[2,179],"124":[2,179],"126":[2,179]},{"8":275,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"98":274,"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,109],"4":[2,109],"29":[2,109],"30":[2,109],"47":[2,109],"55":[2,109],"59":[2,109],"62":104,"68":[1,106],"69":[1,107],"70":[1,108],"71":[1,109],"72":110,"73":111,"74":[1,112],"75":[2,109],"76":[1,113],"77":[1,114],"80":[2,109],"85":102,"88":[1,105],"89":[2,114],"90":[2,109],"94":[2,109],"96":[2,109],"105":[2,109],"107":[2,109],"108":[2,109],"109":[2,109],"113":[2,109],"121":[2,109],"130":[2,109],"131":[2,109],"133":[2,109],"134":[2,109],"135":[2,109],"136":[2,109],"137":[2,109],"138":[2,109],"139":[2,109],"140":[2,109],"141":[2,109],"142":[2,109],"144":[2,109]},{"1":[2,71],"4":[2,71],"29":[2,71],"30":[2,71],"47":[2,71],"55":[2,71],"59":[2,71],"68":[2,71],"69":[2,71],"70":[2,71],"71":[2,71],"74":[2,71],"75":[2,71],"76":[2,71],"77":[2,71],"80":[2,71],"88":[2,71],"89":[2,71],"90":[2,71],"94":[2,71],"96":[2,71],"105":[2,71],"107":[2,71],"108":[2,71],"109":[2,71],"113":[2,71],"121":[2,71],"130":[2,71],"131":[2,71],"133":[2,71],"134":[2,71],"135":[2,71],"136":[2,71],"137":[2,71],"138":[2,71],"139":[2,71],"140":[2,71],"141":[2,71],"142":[2,71],"144":[2,71]},{"15":276,"16":143,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":144,"43":72,"58":[1,61],"61":227,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"87":[1,33],"92":[1,60],"95":[1,59],"104":[1,58]},{"4":[2,105],"28":177,"30":[2,105],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"83":277,"84":231},{"4":[1,279],"30":[1,278]},{"4":[2,106],"30":[2,106],"80":[2,106]},{"4":[2,105],"28":177,"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"80":[2,105],"83":280,"84":231},{"4":[2,102],"30":[2,102],"80":[2,102]},{"4":[2,43],"30":[2,43],"44":[1,281],"80":[2,43]},{"1":[2,100],"4":[2,100],"29":[1,282],"30":[2,100],"47":[2,100],"55":[2,100],"59":[2,100],"62":104,"68":[1,106],"69":[1,107],"70":[1,108],"71":[1,109],"72":110,"73":111,"74":[1,112],"75":[2,100],"76":[1,113],"77":[1,114],"80":[2,100],"85":102,"88":[1,105],"89":[2,114],"90":[2,100],"94":[2,100],"96":[2,100],"105":[2,100],"107":[2,100],"108":[2,100],"109":[2,100],"113":[2,100],"121":[2,100],"130":[2,100],"131":[2,100],"133":[2,100],"134":[2,100],"135":[2,100],"136":[2,100],"137":[2,100],"138":[2,100],"139":[2,100],"140":[2,100],"141":[2,100],"142":[2,100],"144":[2,100]},{"1":[2,144],"4":[2,144],"29":[2,144],"30":[2,144],"47":[2,144],"55":[2,144],"59":[2,144],"68":[2,144],"69":[2,144],"70":[2,144],"71":[2,144],"74":[2,144],"75":[2,144],"76":[2,144],"77":[2,144],"80":[2,144],"88":[2,144],"89":[2,144],"90":[2,144],"94":[2,144],"96":[2,144],"105":[2,144],"107":[2,144],"108":[2,144],"109":[2,144],"113":[2,144],"121":[2,144],"130":[2,144],"131":[2,144],"133":[2,144],"134":[2,144],"135":[2,144],"136":[2,144],"137":[2,144],"138":[2,144],"139":[2,144],"140":[2,144],"141":[2,144],"142":[2,144],"143":[2,144],"144":[2,144]},{"8":283,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,66],"12":[2,121],"13":[2,121],"14":[2,121],"29":[2,66],"32":[2,121],"34":[2,121],"35":[2,121],"37":[2,121],"38":[2,121],"39":[2,121],"45":[2,121],"46":[2,121],"48":[2,121],"52":[2,121],"53":[2,121],"55":[2,66],"58":[2,121],"78":[2,121],"81":[2,121],"87":[2,121],"92":[2,121],"95":[2,121],"96":[2,66],"99":[2,121],"103":[2,121],"104":[2,121],"107":[2,121],"109":[2,121],"111":[2,121],"113":[2,121],"122":[2,121],"128":[2,121],"129":[2,121],"132":[2,121],"133":[2,121],"134":[2,121],"135":[2,121],"136":[2,121]},{"4":[1,285],"29":[1,286],"96":[1,284]},{"4":[2,58],"8":212,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[2,58],"30":[2,58],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"90":[2,58],"92":[1,60],"95":[1,59],"96":[2,58],"97":287,"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,57],"29":[2,57],"30":[2,57],"54":288,"55":[1,240]},{"1":[2,183],"4":[2,183],"29":[2,183],"30":[2,183],"47":[2,183],"55":[2,183],"59":[2,183],"75":[2,183],"80":[2,183],"90":[2,183],"94":[2,183],"96":[2,183],"105":[2,183],"107":[2,183],"108":[2,183],"109":[2,183],"113":[2,183],"121":[2,183],"124":[2,183],"130":[2,183],"131":[2,183],"133":[2,183],"134":[2,183],"135":[2,183],"136":[2,183],"137":[2,183],"138":[2,183],"139":[2,183],"140":[2,183],"141":[2,183],"142":[2,183],"144":[2,183]},{"1":[2,184],"4":[2,184],"29":[2,184],"30":[2,184],"47":[2,184],"55":[2,184],"59":[2,184],"75":[2,184],"80":[2,184],"90":[2,184],"94":[2,184],"96":[2,184],"105":[2,184],"107":[2,184],"108":[2,184],"109":[2,184],"113":[2,184],"121":[2,184],"124":[2,184],"130":[2,184],"131":[2,184],"133":[2,184],"134":[2,184],"135":[2,184],"136":[2,184],"137":[2,184],"138":[2,184],"139":[2,184],"140":[2,184],"141":[2,184],"142":[2,184],"144":[2,184]},{"8":289,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":290,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"119":[2,162],"120":[2,162]},{"8":212,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"91":151,"92":[1,60],"95":[1,59],"96":[1,150],"97":152,"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"31":166,"32":[1,76],"63":167,"64":168,"78":[1,73],"95":[1,247],"118":291},{"1":[2,168],"4":[2,168],"29":[2,168],"30":[2,168],"47":[1,97],"55":[2,168],"59":[2,168],"75":[2,168],"80":[2,168],"90":[2,168],"94":[2,168],"96":[2,168],"105":[2,168],"106":95,"107":[2,168],"108":[1,292],"109":[2,168],"112":96,"113":[2,168],"114":70,"121":[1,293],"130":[2,168],"131":[2,168],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,169],"4":[2,169],"29":[2,169],"30":[2,169],"47":[1,97],"55":[2,169],"59":[2,169],"75":[2,169],"80":[2,169],"90":[2,169],"94":[2,169],"96":[2,169],"105":[2,169],"106":95,"107":[2,169],"108":[1,294],"109":[2,169],"112":96,"113":[2,169],"114":70,"121":[2,169],"130":[2,169],"131":[2,169],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"4":[1,296],"29":[1,297],"80":[1,295]},{"4":[2,58],"28":177,"29":[2,58],"30":[2,58],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":298,"43":176,"46":[1,49],"58":[1,178],"80":[2,58]},{"8":299,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,300],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":301,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,302],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"30":[1,303],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,85],"4":[2,85],"29":[2,85],"30":[2,85],"41":[2,85],"47":[2,85],"55":[2,85],"59":[2,85],"68":[2,85],"69":[2,85],"70":[2,85],"71":[2,85],"74":[2,85],"75":[2,85],"76":[2,85],"77":[2,85],"80":[2,85],"82":[2,85],"88":[2,85],"89":[2,85],"90":[2,85],"94":[2,85],"96":[2,85],"105":[2,85],"107":[2,85],"108":[2,85],"109":[2,85],"113":[2,85],"121":[2,85],"130":[2,85],"131":[2,85],"133":[2,85],"134":[2,85],"135":[2,85],"136":[2,85],"137":[2,85],"138":[2,85],"139":[2,85],"140":[2,85],"141":[2,85],"142":[2,85],"143":[2,85],"144":[2,85]},{"8":304,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"75":[1,305],"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"47":[1,97],"75":[1,306],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"47":[1,97],"75":[1,256],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"30":[1,307],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"4":[1,285],"29":[1,286],"90":[1,308]},{"4":[2,66],"29":[2,66],"30":[2,66],"55":[2,66],"90":[2,66],"96":[2,66]},{"4":[1,125],"6":309,"29":[1,6]},{"50":[2,61],"55":[2,61]},{"50":[2,65],"55":[2,65]},{"4":[1,125],"6":310,"29":[1,6],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"4":[1,125],"6":311,"29":[1,6]},{"1":[2,140],"4":[2,140],"29":[2,140],"30":[2,140],"47":[2,140],"55":[2,140],"59":[2,140],"75":[2,140],"80":[2,140],"90":[2,140],"94":[2,140],"96":[2,140],"105":[2,140],"107":[2,140],"108":[2,140],"109":[2,140],"113":[2,140],"121":[2,140],"130":[2,140],"131":[2,140],"133":[2,140],"134":[2,140],"135":[2,140],"136":[2,140],"137":[2,140],"138":[2,140],"139":[2,140],"140":[2,140],"141":[2,140],"142":[2,140],"144":[2,140]},{"4":[1,125],"6":312,"29":[1,6]},{"30":[1,313],"124":[1,314],"125":273,"126":[1,225]},{"1":[2,177],"4":[2,177],"29":[2,177],"30":[2,177],"47":[2,177],"55":[2,177],"59":[2,177],"75":[2,177],"80":[2,177],"90":[2,177],"94":[2,177],"96":[2,177],"105":[2,177],"107":[2,177],"108":[2,177],"109":[2,177],"113":[2,177],"121":[2,177],"130":[2,177],"131":[2,177],"133":[2,177],"134":[2,177],"135":[2,177],"136":[2,177],"137":[2,177],"138":[2,177],"139":[2,177],"140":[2,177],"141":[2,177],"142":[2,177],"144":[2,177]},{"4":[1,125],"6":315,"29":[1,6]},{"30":[2,180],"124":[2,180],"126":[2,180]},{"4":[1,125],"6":316,"29":[1,6],"55":[1,317]},{"4":[2,136],"29":[2,136],"47":[1,97],"55":[2,136],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,95],"4":[2,95],"29":[1,318],"30":[2,95],"47":[2,95],"55":[2,95],"59":[2,95],"62":104,"68":[1,106],"69":[1,107],"70":[1,108],"71":[1,109],"72":110,"73":111,"74":[1,112],"75":[2,95],"76":[1,113],"77":[1,114],"80":[2,95],"85":102,"88":[1,105],"89":[2,114],"90":[2,95],"94":[2,95],"96":[2,95],"105":[2,95],"107":[2,95],"108":[2,95],"109":[2,95],"113":[2,95],"121":[2,95],"130":[2,95],"131":[2,95],"133":[2,95],"134":[2,95],"135":[2,95],"136":[2,95],"137":[2,95],"138":[2,95],"139":[2,95],"140":[2,95],"141":[2,95],"142":[2,95],"144":[2,95]},{"4":[1,279],"30":[1,319]},{"1":[2,98],"4":[2,98],"29":[2,98],"30":[2,98],"47":[2,98],"55":[2,98],"59":[2,98],"75":[2,98],"80":[2,98],"90":[2,98],"94":[2,98],"96":[2,98],"105":[2,98],"107":[2,98],"108":[2,98],"109":[2,98],"113":[2,98],"121":[2,98],"130":[2,98],"131":[2,98],"133":[2,98],"134":[2,98],"135":[2,98],"136":[2,98],"137":[2,98],"138":[2,98],"139":[2,98],"140":[2,98],"141":[2,98],"142":[2,98],"144":[2,98]},{"28":177,"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"84":320},{"4":[1,279],"80":[1,321]},{"8":322,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,323],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,105],"28":177,"30":[2,105],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"83":324,"84":231},{"47":[1,97],"96":[1,325],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,128],"4":[2,128],"29":[2,128],"30":[2,128],"41":[2,128],"47":[2,128],"55":[2,128],"59":[2,128],"68":[2,128],"69":[2,128],"70":[2,128],"71":[2,128],"74":[2,128],"75":[2,128],"76":[2,128],"77":[2,128],"80":[2,128],"88":[2,128],"89":[2,128],"90":[2,128],"94":[2,128],"96":[2,128],"105":[2,128],"107":[2,128],"108":[2,128],"109":[2,128],"113":[2,128],"119":[2,128],"120":[2,128],"121":[2,128],"130":[2,128],"131":[2,128],"133":[2,128],"134":[2,128],"135":[2,128],"136":[2,128],"137":[2,128],"138":[2,128],"139":[2,128],"140":[2,128],"141":[2,128],"142":[2,128],"143":[2,128],"144":[2,128]},{"8":212,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"97":326,"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":212,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"91":327,"92":[1,60],"95":[1,59],"97":152,"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,130],"29":[2,130],"30":[2,130],"55":[2,130],"90":[2,130],"96":[2,130]},{"4":[1,285],"29":[1,286],"30":[1,328]},{"1":[2,147],"4":[2,147],"29":[2,147],"30":[2,147],"47":[1,97],"55":[2,147],"59":[2,147],"75":[2,147],"80":[2,147],"90":[2,147],"94":[2,147],"96":[2,147],"105":[2,147],"106":95,"107":[1,66],"108":[2,147],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,147],"130":[2,147],"131":[2,147],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,149],"4":[2,149],"29":[2,149],"30":[2,149],"47":[1,97],"55":[2,149],"59":[2,149],"75":[2,149],"80":[2,149],"90":[2,149],"94":[2,149],"96":[2,149],"105":[2,149],"106":95,"107":[1,66],"108":[2,149],"109":[1,67],"112":96,"113":[1,69],"114":70,"121":[2,149],"130":[2,149],"131":[2,149],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"119":[2,167],"120":[2,167]},{"8":329,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":330,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":331,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,88],"4":[2,88],"29":[2,88],"30":[2,88],"41":[2,88],"47":[2,88],"55":[2,88],"59":[2,88],"68":[2,88],"69":[2,88],"70":[2,88],"71":[2,88],"74":[2,88],"75":[2,88],"76":[2,88],"77":[2,88],"80":[2,88],"88":[2,88],"89":[2,88],"90":[2,88],"94":[2,88],"96":[2,88],"105":[2,88],"107":[2,88],"108":[2,88],"109":[2,88],"113":[2,88],"119":[2,88],"120":[2,88],"121":[2,88],"130":[2,88],"131":[2,88],"133":[2,88],"134":[2,88],"135":[2,88],"136":[2,88],"137":[2,88],"138":[2,88],"139":[2,88],"140":[2,88],"141":[2,88],"142":[2,88],"143":[2,88],"144":[2,88]},{"28":177,"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":332,"43":176,"46":[1,49],"58":[1,178]},{"4":[2,89],"28":177,"29":[2,89],"30":[2,89],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":173,"43":176,"46":[1,49],"55":[2,89],"58":[1,178],"79":333},{"4":[2,91],"29":[2,91],"30":[2,91],"55":[2,91],"80":[2,91]},{"4":[2,44],"29":[2,44],"30":[2,44],"47":[1,97],"55":[2,44],"80":[2,44],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"8":334,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,45],"29":[2,45],"30":[2,45],"47":[1,97],"55":[2,45],"80":[2,45],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"8":335,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,208],"4":[2,208],"29":[2,208],"30":[2,208],"47":[2,208],"55":[2,208],"59":[2,208],"75":[2,208],"80":[2,208],"90":[2,208],"94":[2,208],"96":[2,208],"105":[2,208],"107":[2,208],"108":[2,208],"109":[2,208],"113":[2,208],"121":[2,208],"130":[2,208],"131":[2,208],"133":[2,208],"134":[2,208],"135":[2,208],"136":[2,208],"137":[2,208],"138":[2,208],"139":[2,208],"140":[2,208],"141":[2,208],"142":[2,208],"144":[2,208]},{"47":[1,97],"75":[1,336],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,125],"4":[2,125],"29":[2,125],"30":[2,125],"41":[2,125],"47":[2,125],"55":[2,125],"59":[2,125],"68":[2,125],"69":[2,125],"70":[2,125],"71":[2,125],"74":[2,125],"75":[2,125],"76":[2,125],"77":[2,125],"80":[2,125],"82":[2,125],"88":[2,125],"89":[2,125],"90":[2,125],"94":[2,125],"96":[2,125],"105":[2,125],"107":[2,125],"108":[2,125],"109":[2,125],"113":[2,125],"121":[2,125],"130":[2,125],"131":[2,125],"133":[2,125],"134":[2,125],"135":[2,125],"136":[2,125],"137":[2,125],"138":[2,125],"139":[2,125],"140":[2,125],"141":[2,125],"142":[2,125],"143":[2,125],"144":[2,125]},{"1":[2,126],"4":[2,126],"29":[2,126],"30":[2,126],"41":[2,126],"47":[2,126],"55":[2,126],"59":[2,126],"68":[2,126],"69":[2,126],"70":[2,126],"71":[2,126],"74":[2,126],"75":[2,126],"76":[2,126],"77":[2,126],"80":[2,126],"82":[2,126],"88":[2,126],"89":[2,126],"90":[2,126],"94":[2,126],"96":[2,126],"105":[2,126],"107":[2,126],"108":[2,126],"109":[2,126],"113":[2,126],"121":[2,126],"130":[2,126],"131":[2,126],"133":[2,126],"134":[2,126],"135":[2,126],"136":[2,126],"137":[2,126],"138":[2,126],"139":[2,126],"140":[2,126],"141":[2,126],"142":[2,126],"143":[2,126],"144":[2,126]},{"1":[2,40],"4":[2,40],"29":[2,40],"30":[2,40],"47":[2,40],"55":[2,40],"59":[2,40],"75":[2,40],"80":[2,40],"90":[2,40],"94":[2,40],"96":[2,40],"105":[2,40],"107":[2,40],"108":[2,40],"109":[2,40],"113":[2,40],"121":[2,40],"130":[2,40],"131":[2,40],"133":[2,40],"134":[2,40],"135":[2,40],"136":[2,40],"137":[2,40],"138":[2,40],"139":[2,40],"140":[2,40],"141":[2,40],"142":[2,40],"144":[2,40]},{"1":[2,117],"4":[2,117],"29":[2,117],"30":[2,117],"47":[2,117],"55":[2,117],"59":[2,117],"68":[2,117],"69":[2,117],"70":[2,117],"71":[2,117],"74":[2,117],"75":[2,117],"76":[2,117],"77":[2,117],"80":[2,117],"88":[2,117],"89":[2,117],"90":[2,117],"94":[2,117],"96":[2,117],"105":[2,117],"107":[2,117],"108":[2,117],"109":[2,117],"113":[2,117],"121":[2,117],"130":[2,117],"131":[2,117],"133":[2,117],"134":[2,117],"135":[2,117],"136":[2,117],"137":[2,117],"138":[2,117],"139":[2,117],"140":[2,117],"141":[2,117],"142":[2,117],"144":[2,117]},{"1":[2,53],"4":[2,53],"29":[2,53],"30":[2,53],"47":[2,53],"55":[2,53],"59":[2,53],"75":[2,53],"80":[2,53],"90":[2,53],"94":[2,53],"96":[2,53],"105":[2,53],"107":[2,53],"108":[2,53],"109":[2,53],"113":[2,53],"121":[2,53],"130":[2,53],"131":[2,53],"133":[2,53],"134":[2,53],"135":[2,53],"136":[2,53],"137":[2,53],"138":[2,53],"139":[2,53],"140":[2,53],"141":[2,53],"142":[2,53],"144":[2,53]},{"1":[2,185],"4":[2,185],"29":[2,185],"30":[2,185],"47":[2,185],"55":[2,185],"59":[2,185],"75":[2,185],"80":[2,185],"90":[2,185],"94":[2,185],"96":[2,185],"105":[2,185],"107":[2,185],"108":[2,185],"109":[2,185],"113":[2,185],"121":[2,185],"124":[2,185],"130":[2,185],"131":[2,185],"133":[2,185],"134":[2,185],"135":[2,185],"136":[2,185],"137":[2,185],"138":[2,185],"139":[2,185],"140":[2,185],"141":[2,185],"142":[2,185],"144":[2,185]},{"1":[2,141],"4":[2,141],"29":[2,141],"30":[2,141],"47":[2,141],"55":[2,141],"59":[2,141],"75":[2,141],"80":[2,141],"90":[2,141],"94":[2,141],"96":[2,141],"105":[2,141],"107":[2,141],"108":[2,141],"109":[2,141],"113":[2,141],"121":[2,141],"130":[2,141],"131":[2,141],"133":[2,141],"134":[2,141],"135":[2,141],"136":[2,141],"137":[2,141],"138":[2,141],"139":[2,141],"140":[2,141],"141":[2,141],"142":[2,141],"144":[2,141]},{"1":[2,142],"4":[2,142],"29":[2,142],"30":[2,142],"47":[2,142],"55":[2,142],"59":[2,142],"75":[2,142],"80":[2,142],"90":[2,142],"94":[2,142],"96":[2,142],"101":[2,142],"105":[2,142],"107":[2,142],"108":[2,142],"109":[2,142],"113":[2,142],"121":[2,142],"130":[2,142],"131":[2,142],"133":[2,142],"134":[2,142],"135":[2,142],"136":[2,142],"137":[2,142],"138":[2,142],"139":[2,142],"140":[2,142],"141":[2,142],"142":[2,142],"144":[2,142]},{"1":[2,175],"4":[2,175],"29":[2,175],"30":[2,175],"47":[2,175],"55":[2,175],"59":[2,175],"75":[2,175],"80":[2,175],"90":[2,175],"94":[2,175],"96":[2,175],"105":[2,175],"107":[2,175],"108":[2,175],"109":[2,175],"113":[2,175],"121":[2,175],"130":[2,175],"131":[2,175],"133":[2,175],"134":[2,175],"135":[2,175],"136":[2,175],"137":[2,175],"138":[2,175],"139":[2,175],"140":[2,175],"141":[2,175],"142":[2,175],"144":[2,175]},{"4":[1,125],"6":337,"29":[1,6]},{"30":[1,338]},{"4":[1,339],"30":[2,181],"124":[2,181],"126":[2,181]},{"8":340,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,105],"28":177,"30":[2,105],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"83":341,"84":231},{"1":[2,96],"4":[2,96],"29":[2,96],"30":[2,96],"47":[2,96],"55":[2,96],"59":[2,96],"75":[2,96],"80":[2,96],"90":[2,96],"94":[2,96],"96":[2,96],"105":[2,96],"107":[2,96],"108":[2,96],"109":[2,96],"113":[2,96],"121":[2,96],"130":[2,96],"131":[2,96],"133":[2,96],"134":[2,96],"135":[2,96],"136":[2,96],"137":[2,96],"138":[2,96],"139":[2,96],"140":[2,96],"141":[2,96],"142":[2,96],"144":[2,96]},{"4":[2,107],"30":[2,107],"80":[2,107]},{"4":[2,108],"30":[2,108],"80":[2,108]},{"4":[2,103],"30":[2,103],"47":[1,97],"80":[2,103],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"8":342,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[1,279],"30":[1,343]},{"1":[2,123],"4":[2,123],"29":[2,123],"30":[2,123],"47":[2,123],"55":[2,123],"59":[2,123],"68":[2,123],"69":[2,123],"70":[2,123],"71":[2,123],"74":[2,123],"75":[2,123],"76":[2,123],"77":[2,123],"80":[2,123],"88":[2,123],"89":[2,123],"90":[2,123],"94":[2,123],"96":[2,123],"105":[2,123],"107":[2,123],"108":[2,123],"109":[2,123],"113":[2,123],"121":[2,123],"130":[2,123],"131":[2,123],"133":[2,123],"134":[2,123],"135":[2,123],"136":[2,123],"137":[2,123],"138":[2,123],"139":[2,123],"140":[2,123],"141":[2,123],"142":[2,123],"143":[2,123],"144":[2,123]},{"4":[2,131],"29":[2,131],"30":[2,131],"55":[2,131],"90":[2,131],"96":[2,131]},{"4":[2,57],"29":[2,57],"30":[2,57],"54":344,"55":[1,240]},{"4":[2,132],"29":[2,132],"30":[2,132],"55":[2,132],"90":[2,132],"96":[2,132]},{"1":[2,170],"4":[2,170],"29":[2,170],"30":[2,170],"47":[1,97],"55":[2,170],"59":[2,170],"75":[2,170],"80":[2,170],"90":[2,170],"94":[2,170],"96":[2,170],"105":[2,170],"106":95,"107":[2,170],"108":[2,170],"109":[2,170],"112":96,"113":[2,170],"114":70,"121":[1,345],"130":[2,170],"131":[2,170],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,172],"4":[2,172],"29":[2,172],"30":[2,172],"47":[1,97],"55":[2,172],"59":[2,172],"75":[2,172],"80":[2,172],"90":[2,172],"94":[2,172],"96":[2,172],"105":[2,172],"106":95,"107":[2,172],"108":[1,346],"109":[2,172],"112":96,"113":[2,172],"114":70,"121":[2,172],"130":[2,172],"131":[2,172],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,171],"4":[2,171],"29":[2,171],"30":[2,171],"47":[1,97],"55":[2,171],"59":[2,171],"75":[2,171],"80":[2,171],"90":[2,171],"94":[2,171],"96":[2,171],"105":[2,171],"106":95,"107":[2,171],"108":[2,171],"109":[2,171],"112":96,"113":[2,171],"114":70,"121":[2,171],"130":[2,171],"131":[2,171],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"4":[2,92],"29":[2,92],"30":[2,92],"55":[2,92],"80":[2,92]},{"4":[2,57],"29":[2,57],"30":[2,57],"54":347,"55":[1,252]},{"30":[1,348],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"30":[1,349],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,124],"4":[2,124],"29":[2,124],"30":[2,124],"41":[2,124],"47":[2,124],"55":[2,124],"59":[2,124],"68":[2,124],"69":[2,124],"70":[2,124],"71":[2,124],"74":[2,124],"75":[2,124],"76":[2,124],"77":[2,124],"80":[2,124],"82":[2,124],"88":[2,124],"89":[2,124],"90":[2,124],"94":[2,124],"96":[2,124],"105":[2,124],"107":[2,124],"108":[2,124],"109":[2,124],"113":[2,124],"121":[2,124],"130":[2,124],"131":[2,124],"133":[2,124],"134":[2,124],"135":[2,124],"136":[2,124],"137":[2,124],"138":[2,124],"139":[2,124],"140":[2,124],"141":[2,124],"142":[2,124],"143":[2,124],"144":[2,124]},{"30":[1,350]},{"1":[2,178],"4":[2,178],"29":[2,178],"30":[2,178],"47":[2,178],"55":[2,178],"59":[2,178],"75":[2,178],"80":[2,178],"90":[2,178],"94":[2,178],"96":[2,178],"105":[2,178],"107":[2,178],"108":[2,178],"109":[2,178],"113":[2,178],"121":[2,178],"130":[2,178],"131":[2,178],"133":[2,178],"134":[2,178],"135":[2,178],"136":[2,178],"137":[2,178],"138":[2,178],"139":[2,178],"140":[2,178],"141":[2,178],"142":[2,178],"144":[2,178]},{"30":[2,182],"124":[2,182],"126":[2,182]},{"4":[2,137],"29":[2,137],"47":[1,97],"55":[2,137],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"4":[1,279],"30":[1,351]},{"30":[1,352],"47":[1,97],"106":95,"107":[1,66],"109":[1,67],"112":96,"113":[1,69],"114":70,"130":[1,93],"131":[1,94],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,101],"4":[2,101],"29":[2,101],"30":[2,101],"47":[2,101],"55":[2,101],"59":[2,101],"75":[2,101],"80":[2,101],"90":[2,101],"94":[2,101],"96":[2,101],"105":[2,101],"107":[2,101],"108":[2,101],"109":[2,101],"113":[2,101],"121":[2,101],"130":[2,101],"131":[2,101],"133":[2,101],"134":[2,101],"135":[2,101],"136":[2,101],"137":[2,101],"138":[2,101],"139":[2,101],"140":[2,101],"141":[2,101],"142":[2,101],"144":[2,101]},{"4":[1,285],"29":[1,286],"30":[1,353]},{"8":354,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":355,"9":127,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":71,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":72,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":47,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,42],"103":[1,51],"104":[1,58],"106":43,"107":[1,66],"109":[1,67],"110":44,"111":[1,68],"112":45,"113":[1,69],"114":70,"122":[1,46],"127":41,"128":[1,64],"129":[1,65],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[1,296],"29":[1,297],"30":[1,356]},{"4":[2,46],"29":[2,46],"30":[2,46],"55":[2,46],"80":[2,46]},{"4":[2,47],"29":[2,47],"30":[2,47],"55":[2,47],"80":[2,47]},{"1":[2,176],"4":[2,176],"29":[2,176],"30":[2,176],"47":[2,176],"55":[2,176],"59":[2,176],"75":[2,176],"80":[2,176],"90":[2,176],"94":[2,176],"96":[2,176],"105":[2,176],"107":[2,176],"108":[2,176],"109":[2,176],"113":[2,176],"121":[2,176],"130":[2,176],"131":[2,176],"133":[2,176],"134":[2,176],"135":[2,176],"136":[2,176],"137":[2,176],"138":[2,176],"139":[2,176],"140":[2,176],"141":[2,176],"142":[2,176],"144":[2,176]},{"1":[2,97],"4":[2,97],"29":[2,97],"30":[2,97],"47":[2,97],"55":[2,97],"59":[2,97],"75":[2,97],"80":[2,97],"90":[2,97],"94":[2,97],"96":[2,97],"105":[2,97],"107":[2,97],"108":[2,97],"109":[2,97],"113":[2,97],"121":[2,97],"130":[2,97],"131":[2,97],"133":[2,97],"134":[2,97],"135":[2,97],"136":[2,97],"137":[2,97],"138":[2,97],"139":[2,97],"140":[2,97],"141":[2,97],"142":[2,97],"144":[2,97]},{"4":[2,104],"30":[2,104],"80":[2,104]},{"4":[2,133],"29":[2,133],"30":[2,133],"55":[2,133],"90":[2,133],"96":[2,133]},{"1":[2,173],"4":[2,173],"29":[2,173],"30":[2,173],"47":[1,97],"55":[2,173],"59":[2,173],"75":[2,173],"80":[2,173],"90":[2,173],"94":[2,173],"96":[2,173],"105":[2,173],"106":95,"107":[2,173],"108":[2,173],"109":[2,173],"112":96,"113":[2,173],"114":70,"121":[2,173],"130":[2,173],"131":[2,173],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"1":[2,174],"4":[2,174],"29":[2,174],"30":[2,174],"47":[1,97],"55":[2,174],"59":[2,174],"75":[2,174],"80":[2,174],"90":[2,174],"94":[2,174],"96":[2,174],"105":[2,174],"106":95,"107":[2,174],"108":[2,174],"109":[2,174],"112":96,"113":[2,174],"114":70,"121":[2,174],"130":[2,174],"131":[2,174],"133":[1,85],"134":[1,84],"135":[1,82],"136":[1,83],"137":[1,86],"138":[1,87],"139":[1,88],"140":[1,89],"141":[1,90],"142":[1,91],"144":[1,92]},{"4":[2,93],"29":[2,93],"30":[2,93],"55":[2,93],"80":[2,93]}],defaultActions:{"79":[2,4],"105":[2,115]},parseError:function parseError(str,hash){throw new Error(str)},parse:function parse(input){var self=this,stack=[0],vstack=[null],table=this.table,yytext="",yylineno=0,yyleng=0,shifts=0,reductions=0,recovering=0,TERROR=2,EOF=1;this.lexer.setInput(input);this.lexer.yy=this.yy;this.yy.lexer=this.lexer;var parseError=this.yy.parseError=typeof this.yy.parseError=="function"?this.yy.parseError:this.parseError;function popStack(n){stack.length=stack.length-2*n;vstack.length=vstack.length-n}function checkRecover(st){for(var p in table[st]){if(p==TERROR){return true}}return false}function lex(){var token;token=self.lexer.lex()||1;if(typeof token!=="number"){token=self.symbols_[token]||token}return token}var symbol,preErrorSymbol,state,action,a,r,yyval={},p,len,newState,expected,recovered=false;while(true){state=stack[stack.length-1];if(this.defaultActions[state]){action=this.defaultActions[state]}else{if(symbol==null){symbol=lex()}action=table[state]&&table[state][symbol]}if(typeof action==="undefined"||!action.length||!action[0]){if(!recovering){expected=[];for(p in table[state]){if(this.terminals_[p]&&p>2){expected.push("'"+this.terminals_[p]+"'")}}if(this.lexer.showPosition){parseError.call(this,"Parse error on line "+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(", "),{text:this.lexer.match,token:this.terminals_[symbol]||symbol,line:this.lexer.yylineno,expected:expected})}else{parseError.call(this,"Parse error on line "+(yylineno+1)+": Unexpected '"+(this.terminals_[symbol]||symbol)+"'",{text:this.lexer.match,token:this.terminals_[symbol]||symbol,line:this.lexer.yylineno,expected:expected})}}if(recovering==3){if(symbol==EOF){throw"Parsing halted."}yyleng=this.lexer.yyleng;yytext=this.lexer.yytext;yylineno=this.lexer.yylineno;symbol=lex()}while(1){if(checkRecover(state)){break}if(state==0){throw"Parsing halted."}popStack(1);state=stack[stack.length-1]}preErrorSymbol=symbol;symbol=TERROR;state=stack[stack.length-1];action=table[state]&&table[state][TERROR];recovering=3}if(action[0] instanceof Array&&action.length>1){throw new Error("Parse Error: multiple actions possible at state: "+state+", token: "+symbol)}a=action;switch(a[0]){case 1:shifts++;stack.push(symbol);vstack.push(this.lexer.yytext);stack.push(a[1]);symbol=null;if(!preErrorSymbol){yyleng=this.lexer.yyleng;yytext=this.lexer.yytext;yylineno=this.lexer.yylineno;if(recovering>0){recovering--}}else{symbol=preErrorSymbol;preErrorSymbol=null}break;case 2:reductions++;len=this.productions_[a[1]][1];yyval.$=vstack[vstack.length-len];r=this.performAction.call(yyval,yytext,yyleng,yylineno,this.yy,a[1],vstack);if(typeof r!=="undefined"){return r}if(len){stack=stack.slice(0,-1*len*2);vstack=vstack.slice(0,-1*len)}stack.push(this.productions_[a[1]][0]);vstack.push(yyval.$);newState=table[stack[stack.length-2]][stack[stack.length-1]];stack.push(newState);break;case 3:this.reductionCount=reductions;this.shiftCount=shifts;return true}}return true}};return parser})();if(typeof require!=="undefined"){exports.parser=parser;exports.parse=function(){return parser.parse.apply(parser,arguments)};exports.main=function commonjsMain(args){if(!args[1]){throw new Error("Usage: "+args[0]+" FILE")}if(typeof process!=="undefined"){var source=require("fs").readFileSync(require("path").join(process.cwd(),args[1]),"utf8")}else{var cwd=require("file").path(require("file").cwd());var source=cwd.join(args[1]).read({charset:"utf-8"})}return exports.parser.parse(source)};if(typeof module!=="undefined"&&require.main===module){exports.main(typeof process!=="undefined"?process.argv.slice(1):require("system").args)}}};require["./scope"]=new function(){var exports=this;(function(){var Scope,_ref,extend,last;var __hasProp=Object.prototype.hasOwnProperty;_ref=require("./helpers"),extend=_ref.extend,last=_ref.last;exports.Scope=(function(){Scope=(function(){function Scope(_arg,_arg2,_arg3){this.method=_arg3;this.expressions=_arg2;this.parent=_arg;this.variables={"arguments":"arguments"};if(this.parent){this.garbage=this.parent.garbage}else{this.garbage=[];Scope.root=this}return this}return Scope})();Scope.root=null;Scope.prototype.startLevel=function(){return this.garbage.push([])};Scope.prototype.endLevel=function(){var _i,_len,_ref2,_result,name,vars;vars=this.variables;_result=[];for(_i=0,_len=(_ref2=this.garbage.pop()).length;_i<_len;_i++){name=_ref2[_i];if(vars[name]==="var"){_result.push(vars[name]="reuse")}}return _result};Scope.prototype.find=function(name,options){if(this.check(name,options)){return true}this.variables[name]="var";return false};Scope.prototype.any=function(fn){var _ref2,k,v;for(v in _ref2=this.variables){if(!__hasProp.call(_ref2,v)){continue}k=_ref2[v];if(fn(v,k)){return true}}return false};Scope.prototype.parameter=function(name){return(this.variables[name]="param")};Scope.prototype.check=function(name,options){var _ref2,immediate;immediate=Object.prototype.hasOwnProperty.call(this.variables,name);if(immediate||((options!=null)?options.immediate:undefined)){return immediate}return !!(((_ref2=this.parent)!=null)?_ref2.check(name):undefined)};Scope.prototype.temporary=function(type,index){return type.length>1?"_"+type+(index>1?index:""):"_"+(index+parseInt(type,36)).toString(36).replace(/\d/g,"a")};Scope.prototype.freeVariable=function(type){var index,temp;index=0;while(this.check(temp=this.temporary(type,index))&&this.variables[temp]!=="reuse"){index++}this.variables[temp]="var";if(this.garbage.length){last(this.garbage).push(temp)}return temp};Scope.prototype.assign=function(name,value){return(this.variables[name]={value:value,assigned:true})};Scope.prototype.hasDeclarations=function(body){return body===this.expressions&&this.any(function(k,val){return(val==="var"||val==="reuse")})};Scope.prototype.hasAssignments=function(body){return body===this.expressions&&this.any(function(k,val){return val.assigned})};Scope.prototype.declaredVariables=function(){var _ref2,_result,key,val;return(function(){_result=[];for(key in _ref2=this.variables){if(!__hasProp.call(_ref2,key)){continue}val=_ref2[key];if((val==="var"||val==="reuse")){_result.push(key)}}return _result}).call(this).sort()};Scope.prototype.assignedVariables=function(){var _ref2,_result,key,val;_result=[];for(key in _ref2=this.variables){if(!__hasProp.call(_ref2,key)){continue}val=_ref2[key];if(val.assigned){_result.push(""+key+" = "+(val.value))}}return _result};Scope.prototype.compiledDeclarations=function(){return this.declaredVariables().join(", ")};Scope.prototype.compiledAssignments=function(){return this.assignedVariables().join(", ")};return Scope}).call(this)}).call(this)};require["./nodes"]=new function(){var exports=this;(function(){var Accessor,ArrayLiteral,Assign,Base,Call,Class,Closure,Code,Comment,Existence,Expressions,Extends,For,IDENTIFIER,IS_STRING,If,In,Index,Literal,NO,NUMBER,ObjectLiteral,Op,Param,Parens,Push,Range,Return,SIMPLENUM,Scope,Slice,Splat,Switch,TAB,THIS,TRAILING_WHITESPACE,Throw,Try,UTILITIES,Value,While,YES,_ref,compact,del,ends,flatten,include,last,merge,starts,utility;var __extends=function(child,parent){function ctor(){this.constructor=child}ctor.prototype=parent.prototype;child.prototype=new ctor;if(typeof parent.extended==="function"){parent.extended(child)}child.__super__=parent.prototype};Scope=require("./scope").Scope;_ref=require("./helpers"),compact=_ref.compact,flatten=_ref.flatten,merge=_ref.merge,del=_ref.del,include=_ref.include,starts=_ref.starts,ends=_ref.ends,last=_ref.last;YES=function(){return true};NO=function(){return false};THIS=function(){return this};exports.Base=(function(){Base=(function(){function Base(){this.tags={};return this}return Base})();Base.prototype.compile=function(o){var closure,code,top;this.options=o?merge(o):{};this.tab=o.indent;top=this.topSensitive()?this.options.top:del(this.options,"top");closure=this.isStatement(o)&&!this.isPureStatement()&&!top&&!this.options.asStatement&&!(this instanceof Comment)&&!this.containsPureStatement();code=closure?this.compileClosure(this.options):this.compileNode(this.options);return code};Base.prototype.compileClosure=function(o){o.sharedScope=o.scope;return Closure.wrap(this).compile(o)};Base.prototype.compileReference=function(o,options){var _len,compiled,i,node,pair,reference;pair=(function(){if(!this.isComplex()){return[this,this]}else{reference=new Literal(o.scope.freeVariable("ref"));compiled=new Assign(reference,this);return[compiled,reference]}}).call(this);if(((options!=null)?options.precompile:undefined)){for(i=0,_len=pair.length;i<_len;i++){node=pair[i];(pair[i]=node.compile(o))}}return pair};Base.prototype.idt=function(tabs){var idt,num;idt=this.tab||"";num=(tabs||0)+1;while(num-=1){idt+=TAB}return idt};Base.prototype.makeReturn=function(){return new Return(this)};Base.prototype.contains=function(block){var contains;contains=false;this.traverseChildren(false,function(node){if(block(node)){contains=true;return false}});return contains};Base.prototype.containsType=function(type){return this instanceof type||this.contains(function(node){return node instanceof type})};Base.prototype.containsPureStatement=function(){return this.isPureStatement()||this.contains(function(node){return node.isPureStatement()})};Base.prototype.traverse=function(block){return this.traverseChildren(true,block)};Base.prototype.toString=function(idt,override){var _i,_len,_ref2,_result,child,children,klass;idt||(idt="");children=(function(){_result=[];for(_i=0,_len=(_ref2=this.collectChildren()).length;_i<_len;_i++){child=_ref2[_i];_result.push(child.toString(idt+TAB))}return _result}).call(this).join("");klass=override||this.constructor.name+(this.soakNode||this.exist?"?":"");return"\n"+idt+klass+children};Base.prototype.eachChild=function(func){var _i,_j,_len,_len2,_ref2,_ref3,_result,attr,child;if(!this.children){return}_result=[];for(_i=0,_len=(_ref2=this.children).length;_i<_len;_i++){attr=_ref2[_i];if(this[attr]){for(_j=0,_len2=(_ref3=flatten([this[attr]])).length;_j<_len2;_j++){child=_ref3[_j];if(func(child)===false){return}}}}return _result};Base.prototype.collectChildren=function(){var nodes;nodes=[];this.eachChild(function(node){return nodes.push(node)});return nodes};Base.prototype.traverseChildren=function(crossScope,func){return this.eachChild(function(child){if(func(child)===false){return false}return crossScope||!(child instanceof Code)?child.traverseChildren(crossScope,func):undefined})};Base.prototype.invert=function(){return new Op("!",this)};Base.prototype.children=[];Base.prototype.unwrap=THIS;Base.prototype.isStatement=NO;Base.prototype.isPureStatement=NO;Base.prototype.isComplex=YES;Base.prototype.topSensitive=NO;Base.prototype.assigns=NO;return Base})();exports.Expressions=(function(){Expressions=(function(){function Expressions(nodes){Expressions.__super__.constructor.call(this);this.expressions=compact(flatten(nodes||[]));return this}return Expressions})();__extends(Expressions,Base);Expressions.prototype.children=["expressions"];Expressions.prototype.isStatement=YES;Expressions.prototype.push=function(node){this.expressions.push(node);return this};Expressions.prototype.unshift=function(node){this.expressions.unshift(node);return this};Expressions.prototype.unwrap=function(){return this.expressions.length===1?this.expressions[0]:this};Expressions.prototype.empty=function(){return this.expressions.length===0};Expressions.prototype.makeReturn=function(){var end,idx;end=this.expressions[(idx=this.expressions.length-1)];if(end instanceof Comment){end=this.expressions[idx-=1]}if(end&&!(end instanceof Return)){this.expressions[idx]=end.makeReturn()}return this};Expressions.prototype.compile=function(o){o||(o={});return o.scope?Expressions.__super__.compile.call(this,o):this.compileRoot(o)};Expressions.prototype.compileNode=function(o){var _i,_len,_ref2,_result,node;return(function(){_result=[];for(_i=0,_len=(_ref2=this.expressions).length;_i<_len;_i++){node=_ref2[_i];_result.push(this.compileExpression(node,merge(o)))}return _result}).call(this).join("\n")};Expressions.prototype.compileRoot=function(o){var code;o.indent=(this.tab=o.bare?"":TAB);o.scope=new Scope(null,this,null);code=this.compileWithDeclarations(o);code=code.replace(TRAILING_WHITESPACE,"");return o.bare?code:("(function() {\n"+code+"\n}).call(this);\n")};Expressions.prototype.compileWithDeclarations=function(o){var code;code=this.compileNode(o);if(o.scope.hasAssignments(this)){code=(""+(this.tab)+"var "+(o.scope.compiledAssignments().replace(/\n/g,"$&"+this.tab))+";\n"+code)}if(!o.globals&&o.scope.hasDeclarations(this)){code=(""+(this.tab)+"var "+(o.scope.compiledDeclarations())+";\n"+code)}return code};Expressions.prototype.compileExpression=function(node,o){var compiledNode;this.tab=o.indent;node.tags.front=true;compiledNode=node.compile(merge(o,{top:true}));return node.isStatement(o)?compiledNode:(""+(this.idt())+compiledNode+";")};return Expressions})();Expressions.wrap=function(nodes){if(nodes.length===1&&nodes[0] instanceof Expressions){return nodes[0]}return new Expressions(nodes)};exports.Literal=(function(){Literal=(function(){function Literal(_arg){this.value=_arg;Literal.__super__.constructor.call(this);return this}return Literal})();__extends(Literal,Base);Literal.prototype.makeReturn=function(){return this.isStatement()?this:Literal.__super__.makeReturn.call(this)};Literal.prototype.isStatement=function(){var _ref2;return((_ref2=this.value)==="break"||_ref2==="continue"||_ref2==="debugger")};Literal.prototype.isPureStatement=Literal.prototype.isStatement;Literal.prototype.isComplex=NO;Literal.prototype.isReserved=function(){return !!this.value.reserved};Literal.prototype.assigns=function(name){return name===this.value};Literal.prototype.compileNode=function(o){var end,idt,val;idt=this.isStatement(o)?this.idt():"";end=this.isStatement(o)?";":"";val=this.isReserved()?('"'+(this.value)+'"'):this.value;return idt+val+end};Literal.prototype.toString=function(){return' "'+this.value+'"'};return Literal})();exports.Return=(function(){Return=(function(){function Return(_arg){this.expression=_arg;Return.__super__.constructor.call(this);return this}return Return})();__extends(Return,Base);Return.prototype.isStatement=YES;Return.prototype.isPureStatement=YES;Return.prototype.children=["expression"];Return.prototype.makeReturn=THIS;Return.prototype.compile=function(o){var _ref2,expr;expr=(((_ref2=this.expression)!=null)?_ref2.makeReturn():undefined);if(expr&&(!(expr instanceof Return))){return expr.compile(o)}return Return.__super__.compile.call(this,o)};Return.prototype.compileNode=function(o){var expr;expr="";if(this.expression){if(this.expression.isStatement(o)){o.asStatement=true}expr=" "+this.expression.compile(o)}return""+(this.tab)+"return"+expr+";"};return Return})();exports.Value=(function(){Value=(function(){function Value(_arg,_arg2,tag){this.properties=_arg2;this.base=_arg;Value.__super__.constructor.call(this);this.properties||(this.properties=[]);if(tag){this.tags[tag]=true}return this}return Value})();__extends(Value,Base);Value.prototype.children=["base","properties"];Value.prototype.push=function(prop){this.properties.push(prop);return this};Value.prototype.hasProperties=function(){return !!this.properties.length};Value.prototype.isArray=function(){return this.base instanceof ArrayLiteral&&!this.properties.length};Value.prototype.isObject=function(){return this.base instanceof ObjectLiteral&&!this.properties.length};Value.prototype.isSplice=function(){return last(this.properties) instanceof Slice};Value.prototype.isComplex=function(){return this.base.isComplex()||this.hasProperties()};Value.prototype.assigns=function(name){return !this.properties.length&&this.base.assigns(name)};Value.prototype.makeReturn=function(){return this.properties.length?Value.__super__.makeReturn.call(this):this.base.makeReturn()};Value.prototype.unwrap=function(){return this.properties.length?this:this.base};Value.prototype.isStatement=function(o){return this.base.isStatement(o)&&!this.properties.length};Value.prototype.isSimpleNumber=function(){return this.base instanceof Literal&&SIMPLENUM.test(this.base.value)};Value.prototype.cacheReference=function(o){var base,bref,name,nref;name=last(this.properties);if(!this.base.isComplex()&&this.properties.length<2&&!((name!=null)?name.isComplex():undefined)){return[this,this]}base=new Value(this.base,this.properties.slice(0,-1));if(base.isComplex()){bref=new Literal(o.scope.freeVariable("base"));base=new Value(new Parens(new Assign(bref,base)))}if(!name){return[base,bref]}if(name.isComplex()){nref=new Literal(o.scope.freeVariable("name"));name=new Index(new Assign(nref,name.index));nref=new Index(nref)}return[base.push(name),new Value(bref||base.base,[nref||name])]};Value.prototype.compile=function(o){this.base.tags.front=this.tags.front;return !o.top||this.properties.length?Value.__super__.compile.call(this,o):this.base.compile(o)};Value.prototype.compileNode=function(o){var _i,_len,code,ex,prop,props;if(ex=this.unfoldSoak(o)){return ex.compile(o)}props=this.properties;if(this.parenthetical&&!props.length){this.base.parenthetical=true}code=this.base.compile(o);if(props[0] instanceof Accessor&&this.isSimpleNumber()){code=("("+code+")")}for(_i=0,_len=props.length;_i<_len;_i++){prop=props[_i];(code+=prop.compile(o))}return code};Value.prototype.unfoldSoak=function(o){var _len,_ref2,fst,i,ifn,prop,ref,snd;if(this.base.soakNode){Array.prototype.push.apply(this.base.body.properties,this.properties);return this.base}for(i=0,_len=(_ref2=this.properties).length;i<_len;i++){prop=_ref2[i];if(prop.soakNode){prop.soakNode=false;fst=new Value(this.base,this.properties.slice(0,i));snd=new Value(this.base,this.properties.slice(i));if(fst.isComplex()){ref=new Literal(o.scope.freeVariable("ref"));fst=new Parens(new Assign(ref,fst));snd.base=ref}ifn=new If(new Existence(fst),snd,{operation:true});ifn.soakNode=true;return ifn}}return null};Value.unfoldSoak=function(o,parent,name){var ifnode,node;node=parent[name];if(node instanceof If&&node.soakNode){ifnode=node}else{if(node instanceof Value){ifnode=node.unfoldSoak(o)}}if(!ifnode){return}parent[name]=ifnode.body;ifnode.body=new Value(parent);return ifnode};return Value}).call(this);exports.Comment=(function(){Comment=(function(){function Comment(_arg){this.comment=_arg;Comment.__super__.constructor.call(this);return this}return Comment})();__extends(Comment,Base);Comment.prototype.isStatement=YES;Comment.prototype.makeReturn=THIS;Comment.prototype.compileNode=function(o){return this.tab+"/*"+this.comment.replace(/\n/g,"\n"+this.tab)+"*/"};return Comment})();exports.Call=(function(){Call=(function(){function Call(variable,_arg,_arg2){this.exist=_arg2;this.args=_arg;Call.__super__.constructor.call(this);this.isNew=false;this.isSuper=variable==="super";this.variable=this.isSuper?null:variable;this.args||(this.args=[]);return this}return Call})();__extends(Call,Base);Call.prototype.children=["variable","args"];Call.prototype.compileSplatArguments=function(o){return Splat.compileSplattedArray(this.args,o)};Call.prototype.newInstance=function(){this.isNew=true;return this};Call.prototype.prefix=function(){return this.isNew?"new ":""};Call.prototype.superReference=function(o){var method,name;method=o.scope.method;if(!method){throw Error("cannot call super outside of a function")}name=method.name;if(!name){throw Error("cannot call super on an anonymous function.")}return method.klass?(""+(method.klass)+".__super__."+name):(""+name+".__super__.constructor")};Call.prototype.unfoldSoak=function(o){var _i,_len,_ref2,call,list,node;call=this;list=[];while(true){if(call.variable instanceof Call){list.push(call);call=call.variable;continue}if(!(call.variable instanceof Value)){break}list.push(call);if(!((call=call.variable.base) instanceof Call)){break}}for(_i=0,_len=(_ref2=list.reverse()).length;_i<_len;_i++){call=_ref2[_i];if(node){if(call.variable instanceof Call){call.variable=node}else{call.variable.base=node}}node=Value.unfoldSoak(o,call,"variable")}return node};Call.prototype.compileNode=function(o){var _i,_j,_len,_len2,_ref2,_ref3,_ref4,_ref5,_result,arg,args,left,node,rite,val;if(node=this.unfoldSoak(o)){return node.compile(o)}(((_ref2=this.variable)!=null)?(_ref2.tags.front=this.tags.front):undefined);if(this.exist){if(val=this.variable){if(!(val instanceof Value)){val=new Value(val)}_ref3=val.cacheReference(o),left=_ref3[0],rite=_ref3[1];rite=new Call(rite,this.args)}else{left=new Literal(this.superReference(o));rite=new Call(new Value(left),this.args);rite.isNew=this.isNew}left=("typeof "+(left.compile(o))+' !== "function"');rite=rite.compile(o);return("("+left+" ? undefined : "+rite+")")}for(_i=0,_len=(_ref4=this.args).length;_i<_len;_i++){arg=_ref4[_i];if(arg instanceof Splat){return this.compileSplat(o)}}args=(function(){_result=[];for(_j=0,_len2=(_ref5=this.args).length;_j<_len2;_j++){arg=_ref5[_j];_result.push((arg.parenthetical=true)&&arg.compile(o))}return _result}).call(this).join(", ");return this.isSuper?this.compileSuper(args,o):(""+(this.prefix())+(this.variable.compile(o))+"("+args+")")};Call.prototype.compileSuper=function(args,o){return""+(this.superReference(o))+".call(this"+(args.length?", ":"")+args+")"};Call.prototype.compileSplat=function(o){var base,fun,idt,name,ref,splatargs;splatargs=this.compileSplatArguments(o);if(this.isSuper){return(""+(this.superReference(o))+".apply(this, "+splatargs+")")}if(!this.isNew){if(!((base=this.variable) instanceof Value)){base=new Value(base)}if((name=base.properties.pop())&&base.isComplex()){ref=o.scope.freeVariable("this");fun=("("+ref+" = "+(base.compile(o))+")"+(name.compile(o)))}else{fun=(ref=base.compile(o));if(name){fun+=name.compile(o)}}return(""+fun+".apply("+ref+", "+splatargs+")")}idt=this.idt(1);return"(function(func, args, ctor) {\n"+idt+"ctor.prototype = func.prototype;\n"+idt+"var child = new ctor, result = func.apply(child, args);\n"+idt+'return typeof result === "object" ? result : child;\n'+(this.tab)+"})("+(this.variable.compile(o))+", "+splatargs+", function() {})"};return Call})();exports.Extends=(function(){Extends=(function(){function Extends(_arg,_arg2){this.parent=_arg2;this.child=_arg;Extends.__super__.constructor.call(this);return this}return Extends})();__extends(Extends,Base);Extends.prototype.children=["child","parent"];Extends.prototype.compileNode=function(o){var ref;ref=new Value(new Literal(utility("extends")));return(new Call(ref,[this.child,this.parent])).compile(o)};return Extends})();exports.Accessor=(function(){Accessor=(function(){function Accessor(_arg,tag){this.name=_arg;Accessor.__super__.constructor.call(this);this.prototype=tag==="prototype"?".prototype":"";this.soakNode=tag==="soak";return this}return Accessor})();__extends(Accessor,Base);Accessor.prototype.children=["name"];Accessor.prototype.compileNode=function(o){var name,namePart;name=this.name.compile(o);namePart=name.match(IS_STRING)?("["+name+"]"):("."+name);return this.prototype+namePart};Accessor.prototype.isComplex=NO;return Accessor})();exports.Index=(function(){Index=(function(){function Index(_arg){this.index=_arg;Index.__super__.constructor.call(this);return this}return Index})();__extends(Index,Base);Index.prototype.children=["index"];Index.prototype.compileNode=function(o){var idx,prefix;idx=this.index.compile(o);prefix=this.proto?".prototype":"";return""+prefix+"["+idx+"]"};Index.prototype.isComplex=function(){return this.index.isComplex()};return Index})();exports.Range=(function(){Range=(function(){function Range(_arg,_arg2,tag){this.to=_arg2;this.from=_arg;Range.__super__.constructor.call(this);this.exclusive=tag==="exclusive";this.equals=this.exclusive?"":"=";return this}return Range})();__extends(Range,Base);Range.prototype.children=["from","to"];Range.prototype.compileVariables=function(o){var _ref2,_ref3,_ref4,parts;o=merge(o,{top:true});_ref2=this.from.compileReference(o,{precompile:true}),this.from=_ref2[0],this.fromVar=_ref2[1];_ref3=this.to.compileReference(o,{precompile:true}),this.to=_ref3[0],this.toVar=_ref3[1];_ref4=[this.fromVar.match(SIMPLENUM),this.toVar.match(SIMPLENUM)],this.fromNum=_ref4[0],this.toNum=_ref4[1];parts=[];if(this.from!==this.fromVar){parts.push(this.from)}return this.to!==this.toVar?parts.push(this.to):undefined};Range.prototype.compileNode=function(o){var compare,idx,incr,intro,step,stepPart,vars;this.compileVariables(o);if(!o.index){return this.compileArray(o)}if(this.fromNum&&this.toNum){return this.compileSimple(o)}idx=del(o,"index");step=del(o,"step");vars=(""+idx+" = "+(this.from))+(this.to!==this.toVar?(", "+(this.to)):"");intro=("("+(this.fromVar)+" <= "+(this.toVar)+" ? "+idx);compare=(""+intro+" <"+(this.equals)+" "+(this.toVar)+" : "+idx+" >"+(this.equals)+" "+(this.toVar)+")");stepPart=step?step.compile(o):"1";incr=step?(""+idx+" += "+stepPart):(""+intro+" += "+stepPart+" : "+idx+" -= "+stepPart+")");return""+vars+"; "+compare+"; "+incr};Range.prototype.compileSimple=function(o){var _ref2,from,idx,step,to;_ref2=[+this.fromNum,+this.toNum],from=_ref2[0],to=_ref2[1];idx=del(o,"index");step=del(o,"step");step&&(step=(""+idx+" += "+(step.compile(o))));return from<=to?(""+idx+" = "+from+"; "+idx+" <"+(this.equals)+" "+to+"; "+(step||(""+idx+"++"))):(""+idx+" = "+from+"; "+idx+" >"+(this.equals)+" "+to+"; "+(step||(""+idx+"--")))};Range.prototype.compileArray=function(o){var _i,_ref2,_ref3,_result,body,clause,i,idt,post,pre,range,result,vars;if(this.fromNum&&this.toNum&&(Math.abs(this.fromNum-this.toNum)<=20)){range=(function(){_result=[];for(var _i=_ref2=+this.fromNum,_ref3=+this.toNum;_ref2<=_ref3?_i<=_ref3:_i>=_ref3;_ref2<=_ref3?_i+=1:_i-=1){_result.push(_i)}return _result}).call(this);if(this.exclusive){range.pop()}return("["+(range.join(", "))+"]")}idt=this.idt(1);i=o.scope.freeVariable("i");result=o.scope.freeVariable("result");pre=("\n"+idt+result+" = [];");if(this.fromNum&&this.toNum){o.index=i;body=this.compileSimple(o)}else{vars=(""+i+" = "+(this.from))+(this.to!==this.toVar?(", "+(this.to)):"");clause=(""+(this.fromVar)+" <= "+(this.toVar)+" ?");body=("var "+vars+"; "+clause+" "+i+" <"+(this.equals)+" "+(this.toVar)+" : "+i+" >"+(this.equals)+" "+(this.toVar)+"; "+clause+" "+i+" += 1 : "+i+" -= 1")}post=("{ "+result+".push("+i+"); }\n"+idt+"return "+result+";\n"+(o.indent));return"(function() {"+pre+"\n"+idt+"for ("+body+")"+post+"}).call(this)"};return Range})();exports.Slice=(function(){Slice=(function(){function Slice(_arg){this.range=_arg;Slice.__super__.constructor.call(this);return this}return Slice})();__extends(Slice,Base);Slice.prototype.children=["range"];Slice.prototype.compileNode=function(o){var from,to;from=this.range.from?this.range.from.compile(o):"0";to=this.range.to?this.range.to.compile(o):"";to+=(!to||this.range.exclusive?"":" + 1");if(to){to=", "+to}return".slice("+from+to+")"};return Slice})();exports.ObjectLiteral=(function(){ObjectLiteral=(function(){function ObjectLiteral(props){ObjectLiteral.__super__.constructor.call(this);this.objects=(this.properties=props||[]);return this}return ObjectLiteral})();__extends(ObjectLiteral,Base);ObjectLiteral.prototype.children=["properties"];ObjectLiteral.prototype.compileNode=function(o){var _i,_len,_ref2,_result,i,indent,join,lastNoncom,nonComments,obj,prop,props,top;top=del(o,"top");o.indent=this.idt(1);nonComments=(function(){_result=[];for(_i=0,_len=(_ref2=this.properties).length;_i<_len;_i++){prop=_ref2[_i];if(!(prop instanceof Comment)){_result.push(prop)}}return _result}).call(this);lastNoncom=last(nonComments);props=(function(){_result=[];for(i=0,_len=(_ref2=this.properties).length;i<_len;i++){prop=_ref2[i];_result.push((function(){join=i===this.properties.length-1?"":(prop===lastNoncom||prop instanceof Comment?"\n":",\n");indent=prop instanceof Comment?"":this.idt(1);if(prop instanceof Value&&prop.tags["this"]){prop=new Assign(prop.properties[0].name,prop,"object")}else{if(!(prop instanceof Assign)&&!(prop instanceof Comment)){prop=new Assign(prop,prop,"object")}}return indent+prop.compile(o)+join}).call(this))}return _result}).call(this);props=props.join("");obj=("{"+(props?"\n"+props+"\n"+this.idt():"")+"}");return this.tags.front?("("+obj+")"):obj};ObjectLiteral.prototype.assigns=function(name){var _i,_len,_ref2,prop;for(_i=0,_len=(_ref2=this.properties).length;_i<_len;_i++){prop=_ref2[_i];if(prop.assigns(name)){return true}}return false};return ObjectLiteral})();exports.ArrayLiteral=(function(){ArrayLiteral=(function(){function ArrayLiteral(_arg){this.objects=_arg;ArrayLiteral.__super__.constructor.call(this);this.objects||(this.objects=[]);return this}return ArrayLiteral})();__extends(ArrayLiteral,Base);ArrayLiteral.prototype.children=["objects"];ArrayLiteral.prototype.compileSplatLiteral=function(o){return Splat.compileSplattedArray(this.objects,o)};ArrayLiteral.prototype.compileNode=function(o){var _i,_len,_len2,_ref2,_ref3,code,i,obj,objects;o.indent=this.idt(1);for(_i=0,_len=(_ref2=this.objects).length;_i<_len;_i++){obj=_ref2[_i];if(obj instanceof Splat){return this.compileSplatLiteral(o)}}objects=[];for(i=0,_len2=(_ref3=this.objects).length;i<_len2;i++){obj=_ref3[i];code=obj.compile(o);objects.push(obj instanceof Comment?("\n"+code+"\n"+(o.indent)):(i===this.objects.length-1?code:code+", "))}objects=objects.join("");return 0= "+this.arglength);end=this.trailings.length?(", "+len+" - "+(this.trailings.length)):undefined;for(idx=0,_len=(_ref2=this.trailings).length;idx<_len;idx++){trailing=_ref2[idx];if(trailing.attach){assign=trailing.assign;trailing=new Literal(o.scope.freeVariable("arg"));assign.value=trailing}pos=this.trailings.length-idx;o.scope.assign(trailing.compile(o),"arguments["+variadic+" ? "+len+" - "+pos+" : "+(this.index+idx)+"]")}}return""+name+" = "+(utility("slice"))+".call(arguments, "+(this.index)+end+")"};Splat.prototype.compileValue=function(o,name,index,trailings){var trail;trail=trailings?(", "+name+".length - "+trailings):"";return""+(utility("slice"))+".call("+name+", "+index+trail+")"};Splat.compileSplattedArray=function(list,o){var _len,arg,args,code,end,i,prev;args=[];end=-1;for(i=0,_len=list.length;i<_len;i++){arg=list[i];code=arg.compile(o);prev=args[end];if(!(arg instanceof Splat)){if(prev&&starts(prev,"[")&&ends(prev,"]")){args[end]=(""+(prev.slice(0,-1))+", "+code+"]");continue}if(prev&&starts(prev,".concat([")&&ends(prev,"])")){args[end]=(""+(prev.slice(0,-2))+", "+code+"])");continue}code=("["+code+"]")}args[++end]=i===0?code:(".concat("+code+")")}return args.join("")};return Splat}).call(this);exports.While=(function(){While=(function(){function While(condition,opts){While.__super__.constructor.call(this);this.condition=((opts!=null)?opts.invert:undefined)?condition.invert():condition;this.guard=((opts!=null)?opts.guard:undefined);return this}return While})();__extends(While,Base);While.prototype.children=["condition","guard","body"];While.prototype.isStatement=YES;While.prototype.addBody=function(body){this.body=body;return this};While.prototype.makeReturn=function(){this.returns=true;return this};While.prototype.topSensitive=YES;While.prototype.compileNode=function(o){var cond,post,pre,rvar,set,top;top=del(o,"top")&&!this.returns;o.indent=this.idt(1);this.condition.parenthetical=true;cond=this.condition.compile(o);o.top=true;set="";if(!top){rvar=o.scope.freeVariable("result");set=(""+(this.tab)+rvar+" = [];\n");if(this.body){this.body=Push.wrap(rvar,this.body)}}pre=(""+set+(this.tab)+"while ("+cond+")");if(this.guard){this.body=Expressions.wrap([new If(this.guard,this.body)])}if(this.returns){post="\n"+new Return(new Literal(rvar)).compile(merge(o,{indent:this.idt()}))}else{post=""}return""+pre+" {\n"+(this.body.compile(o))+"\n"+(this.tab)+"}"+post};return While})();exports.Op=(function(){Op=(function(){function Op(op,first,second,flip){if(op==="new"){if(first instanceof Call){return first.newInstance()}if(first instanceof Code&&first.bound){first=new Parens(first)}}Op.__super__.constructor.call(this);this.operator=this.CONVERSIONS[op]||op;(this.first=first).tags.operation=true;if(second){(this.second=second).tags.operation=true}this.flip=!!flip;return this}return Op})();__extends(Op,Base);Op.prototype.CONVERSIONS={"==":"===","!=":"!==",of:"in"};Op.prototype.INVERSIONS={"!==":"===","===":"!=="};Op.prototype.CHAINABLE=["<",">",">=","<=","===","!=="];Op.prototype.ASSIGNMENT=["||=","&&=","?="];Op.prototype.PREFIX_OPERATORS=["new","typeof","delete"];Op.prototype.children=["first","second"];Op.prototype.isUnary=function(){return !this.second};Op.prototype.isComplex=function(){return this.operator!=="!"||this.first.isComplex()};Op.prototype.isMutator=function(){var _ref2;return ends(this.operator,"=")&&!((_ref2=this.operator)==="==="||_ref2==="!==")};Op.prototype.isChainable=function(){return include(this.CHAINABLE,this.operator)};Op.prototype.invert=function(){var _ref2;if(((_ref2=this.operator)==="==="||_ref2==="!==")){this.operator=this.INVERSIONS[this.operator];return this}else{return this.second?new Parens(this).invert():Op.__super__.invert.call(this)}};Op.prototype.toString=function(idt){return Op.__super__.toString.call(this,idt,this.constructor.name+" "+this.operator)};Op.prototype.compileNode=function(o){if(this.second){this.first.tags.front=this.tags.front}if(this.isChainable()&&this.first.unwrap() instanceof Op&&this.first.unwrap().isChainable()){return this.compileChain(o)}if(include(this.ASSIGNMENT,this.operator)){return this.compileAssignment(o)}if(this.isUnary()){return this.compileUnary(o)}if(this.operator==="?"){return this.compileExistence(o)}if(this.first instanceof Op&&this.first.isMutator()){this.first=new Parens(this.first)}if(this.second instanceof Op&&this.second.isMutator()){this.second=new Parens(this.second)}return[this.first.compile(o),this.operator,this.second.compile(o)].join(" ")};Op.prototype.compileChain=function(o){var _ref2,_ref3,first,second,shared;shared=this.first.unwrap().second;_ref2=shared.compileReference(o),this.first.second=_ref2[0],shared=_ref2[1];_ref3=[this.first.compile(o),this.second.compile(o),shared.compile(o)],first=_ref3[0],second=_ref3[1],shared=_ref3[2];return"("+first+") && ("+shared+" "+(this.operator)+" "+second+")"};Op.prototype.compileAssignment=function(o){var _ref2,left,rite;_ref2=this.first.cacheReference(o),left=_ref2[0],rite=_ref2[1];rite=new Assign(rite,this.second);return new Op(this.operator.slice(0,-1),left,rite).compile(o)};Op.prototype.compileExistence=function(o){var fst,ref;if(this.first.isComplex()){ref=o.scope.freeVariable("ref");fst=new Parens(new Assign(new Literal(ref),this.first))}else{fst=this.first;ref=fst.compile(o)}return new Existence(fst).compile(o)+(" ? "+ref+" : "+(this.second.compile(o)))};Op.prototype.compileUnary=function(o){var parts,space;space=include(this.PREFIX_OPERATORS,this.operator)?" ":"";parts=[this.operator,space,this.first.compile(o)];return(this.flip?parts.reverse():parts).join("")};return Op})();exports.In=(function(){In=(function(){function In(_arg,_arg2){this.array=_arg2;this.object=_arg;In.__super__.constructor.call(this);return this}return In})();__extends(In,Base);In.prototype.children=["object","array"];In.prototype.isArray=function(){return this.array instanceof Value&&this.array.isArray()};In.prototype.compileNode=function(o){var _ref2;_ref2=this.object.compileReference(o,{precompile:true}),this.obj1=_ref2[0],this.obj2=_ref2[1];return this.isArray()?this.compileOrTest(o):this.compileLoopTest(o)};In.prototype.compileOrTest=function(o){var _len,_ref2,_result,i,item,tests;tests=(function(){_result=[];for(i=0,_len=(_ref2=this.array.base.objects).length;i<_len;i++){item=_ref2[i];_result.push(""+(i?this.obj2:this.obj1)+" === "+(item.compile(o)))}return _result}).call(this);return"("+(tests.join(" || "))+")"};In.prototype.compileLoopTest=function(o){var _ref2,_ref3,i,l,prefix;_ref2=this.array.compileReference(o,{precompile:true}),this.arr1=_ref2[0],this.arr2=_ref2[1];_ref3=[o.scope.freeVariable("i"),o.scope.freeVariable("len")],i=_ref3[0],l=_ref3[1];prefix=this.obj1!==this.obj2?this.obj1+"; ":"";return"(function(){ "+prefix+"for (var "+i+"=0, "+l+"="+(this.arr1)+".length; "+i+"<"+l+"; "+i+"++) { if ("+(this.arr2)+"["+i+"] === "+(this.obj2)+") return true; } return false; }).call(this)"};return In})();exports.Try=(function(){Try=(function(){function Try(_arg,_arg2,_arg3,_arg4){this.ensure=_arg4;this.recovery=_arg3;this.error=_arg2;this.attempt=_arg;Try.__super__.constructor.call(this);return this}return Try})();__extends(Try,Base);Try.prototype.children=["attempt","recovery","ensure"];Try.prototype.isStatement=YES;Try.prototype.makeReturn=function(){if(this.attempt){this.attempt=this.attempt.makeReturn()}if(this.recovery){this.recovery=this.recovery.makeReturn()}return this};Try.prototype.compileNode=function(o){var attemptPart,catchPart,errorPart,finallyPart;o.indent=this.idt(1);o.top=true;attemptPart=this.attempt.compile(o);errorPart=this.error?(" ("+(this.error.compile(o))+") "):" ";catchPart=this.recovery?(" catch"+errorPart+"{\n"+(this.recovery.compile(o))+"\n"+(this.tab)+"}"):(!(this.ensure||this.recovery)?" catch (_e) {}":"");finallyPart=(this.ensure||"")&&" finally {\n"+this.ensure.compile(merge(o))+("\n"+(this.tab)+"}");return""+(this.tab)+"try {\n"+attemptPart+"\n"+(this.tab)+"}"+catchPart+finallyPart};return Try})();exports.Throw=(function(){Throw=(function(){function Throw(_arg){this.expression=_arg;Throw.__super__.constructor.call(this);return this}return Throw})();__extends(Throw,Base);Throw.prototype.children=["expression"];Throw.prototype.isStatement=YES;Throw.prototype.makeReturn=THIS;Throw.prototype.compileNode=function(o){return""+(this.tab)+"throw "+(this.expression.compile(o))+";"};return Throw})();exports.Existence=(function(){Existence=(function(){function Existence(_arg){this.expression=_arg;Existence.__super__.constructor.call(this);return this}return Existence})();__extends(Existence,Base);Existence.prototype.children=["expression"];Existence.prototype.compileNode=function(o){var code;code=this.expression.compile(o);code=IDENTIFIER.test(code)&&!o.scope.check(code)?("typeof "+code+' !== "undefined" && '+code+" !== null"):(""+code+" != null");return this.parenthetical?code:("("+code+")")};return Existence})();exports.Parens=(function(){Parens=(function(){function Parens(_arg){this.expression=_arg;Parens.__super__.constructor.call(this);return this}return Parens})();__extends(Parens,Base);Parens.prototype.children=["expression"];Parens.prototype.isStatement=function(o){return this.expression.isStatement(o)};Parens.prototype.isComplex=function(){return this.expression.isComplex()};Parens.prototype.topSensitive=YES;Parens.prototype.makeReturn=function(){return this.expression.makeReturn()};Parens.prototype.compileNode=function(o){var code,top;top=del(o,"top");this.expression.parenthetical=true;code=this.expression.compile(o);if(top&&this.expression.isPureStatement(o)){return code}if(this.parenthetical||this.isStatement(o)){return top?this.tab+code+";":code}return"("+code+")"};return Parens})();exports.For=(function(){For=(function(){function For(_arg,source,_arg2,_arg3){var _ref2;this.index=_arg3;this.name=_arg2;this.body=_arg;For.__super__.constructor.call(this);this.source=source.source,this.guard=source.guard,this.step=source.step;this.raw=!!source.raw;this.object=!!source.object;if(this.object){_ref2=[this.index,this.name],this.name=_ref2[0],this.index=_ref2[1]}this.pattern=this.name instanceof Value;if(this.index instanceof Value){throw new Error("index cannot be a pattern matching expression")}this.returns=false;return this}return For})();__extends(For,Base);For.prototype.children=["body","source","guard"];For.prototype.isStatement=YES;For.prototype.topSensitive=YES;For.prototype.makeReturn=function(){this.returns=true;return this};For.prototype.compileReturnValue=function(val,o){if(this.returns){return"\n"+new Return(new Literal(val)).compile(o)}if(val){return"\n"+val}return""};For.prototype.compileNode=function(o){var body,codeInBody,forPart,guardPart,idt1,index,ivar,lvar,name,namePart,range,ref,resultPart,returnResult,rvar,scope,source,sourcePart,stepPart,svar,topLevel,varPart,vars;topLevel=del(o,"top")&&!this.returns;range=this.source instanceof Value&&this.source.base instanceof Range&&!this.source.properties.length;source=range?this.source.base:this.source;codeInBody=this.body.contains(function(node){return node instanceof Code});scope=o.scope;name=this.name&&this.name.compile(o);index=this.index&&this.index.compile(o);if(name&&!this.pattern&&(range||!codeInBody)){scope.find(name,{immediate:true})}if(index){scope.find(index,{immediate:true})}if(!topLevel){rvar=scope.freeVariable("result")}ivar=range?name:index;if(!ivar||codeInBody){ivar=scope.freeVariable("i")}varPart="";guardPart="";body=Expressions.wrap([this.body]);idt1=this.idt(1);if(range){forPart=source.compile(merge(o,{index:ivar,step:this.step}))}else{svar=(sourcePart=this.source.compile(o));if((name||!this.raw)&&!(IDENTIFIER.test(svar)&&scope.check(svar,{immediate:true}))){sourcePart=(""+(ref=scope.freeVariable("ref"))+" = "+svar);if(!this.object){sourcePart=("("+sourcePart+")")}svar=ref}namePart=this.pattern?new Assign(this.name,new Literal(""+svar+"["+ivar+"]")).compile(merge(o,{top:true})):(name?(""+name+" = "+svar+"["+ivar+"]"):undefined);if(!this.object){lvar=scope.freeVariable("len");stepPart=this.step?(""+ivar+" += "+(this.step.compile(o))):(""+ivar+"++");forPart=(""+ivar+" = 0, "+lvar+" = "+sourcePart+".length; "+ivar+" < "+lvar+"; "+stepPart)}}resultPart=rvar?(""+(this.tab)+rvar+" = [];\n"):"";returnResult=this.compileReturnValue(rvar,o);if(!topLevel){body=Push.wrap(rvar,body)}if(this.guard){body=Expressions.wrap([new If(this.guard,body)])}if(codeInBody){if(range){body.unshift(new Literal("var "+name+" = "+ivar))}if(namePart){body.unshift(new Literal("var "+namePart))}if(index){body.unshift(new Literal("var "+index+" = "+ivar))}body=Closure.wrap(body,true)}else{if(namePart){varPart=(""+idt1+namePart+";\n")}}if(this.object){forPart=(""+ivar+" in "+sourcePart);if(!this.raw){guardPart=("\n"+idt1+"if (!"+(utility("hasProp"))+".call("+svar+", "+ivar+")) continue;")}}body=body.compile(merge(o,{indent:idt1,top:true}));vars=range?name:(""+name+", "+ivar);return""+resultPart+(this.tab)+"for ("+forPart+") {"+guardPart+"\n"+varPart+body+"\n"+(this.tab)+"}"+returnResult};return For})();exports.Switch=(function(){Switch=(function(){function Switch(_arg,_arg2,_arg3){this.otherwise=_arg3;this.cases=_arg2;this.subject=_arg;Switch.__super__.constructor.call(this);this.tags.subjectless=!this.subject;this.subject||(this.subject=new Literal("true"));return this}return Switch})();__extends(Switch,Base);Switch.prototype.children=["subject","cases","otherwise"];Switch.prototype.isStatement=YES;Switch.prototype.makeReturn=function(){var _i,_len,_ref2,pair;for(_i=0,_len=(_ref2=this.cases).length;_i<_len;_i++){pair=_ref2[_i];pair[1].makeReturn()}if(this.otherwise){this.otherwise.makeReturn()}return this};Switch.prototype.compileNode=function(o){var _i,_j,_len,_len2,_ref2,_ref3,block,code,condition,conditions,exprs,idt,pair;idt=(o.indent=this.idt(2));o.top=true;code=(""+(this.tab)+"switch ("+(this.subject.compile(o))+") {");for(_i=0,_len=(_ref2=this.cases).length;_i<_len;_i++){pair=_ref2[_i];conditions=pair[0],block=pair[1];exprs=block.expressions;for(_j=0,_len2=(_ref3=flatten([conditions])).length;_j<_len2;_j++){condition=_ref3[_j];if(this.tags.subjectless){condition=new Op("!!",new Parens(condition))}code+=("\n"+(this.idt(1))+"case "+(condition.compile(o))+":")}code+=("\n"+(block.compile(o)));if(!(last(exprs) instanceof Return)){code+=("\n"+idt+"break;")}}if(this.otherwise){code+=("\n"+(this.idt(1))+"default:\n"+(this.otherwise.compile(o)))}code+=("\n"+(this.tab)+"}");return code};return Switch})();exports.If=(function(){If=(function(){function If(condition,_arg,_arg2){this.tags=_arg2;this.body=_arg;this.tags||(this.tags={});this.condition=this.tags.invert?condition.invert():condition;this.elseBody=null;this.isChain=false;return this}return If})();__extends(If,Base);If.prototype.children=["condition","body","elseBody","assigner"];If.prototype.topSensitive=YES;If.prototype.bodyNode=function(){var _ref2;return(((_ref2=this.body)!=null)?_ref2.unwrap():undefined)};If.prototype.elseBodyNode=function(){var _ref2;return(((_ref2=this.elseBody)!=null)?_ref2.unwrap():undefined)};If.prototype.addElse=function(elseBody){if(this.isChain){this.elseBodyNode().addElse(elseBody)}else{this.isChain=elseBody instanceof If;this.elseBody=this.ensureExpressions(elseBody)}return this};If.prototype.isStatement=function(o){var _ref2;return this.statement||(this.statement=((o!=null)?o.top:undefined)||this.bodyNode().isStatement(o)||(((_ref2=this.elseBodyNode())!=null)?_ref2.isStatement(o):undefined))};If.prototype.compileCondition=function(o){this.condition.parenthetical=true;return this.condition.compile(o)};If.prototype.compileNode=function(o){return this.isStatement(o)?this.compileStatement(o):this.compileExpression(o)};If.prototype.makeReturn=function(){if(this.isStatement()){this.body&&(this.body=this.ensureExpressions(this.body.makeReturn()));this.elseBody&&(this.elseBody=this.ensureExpressions(this.elseBody.makeReturn()));return this}else{return new Return(this)}};If.prototype.ensureExpressions=function(node){return node instanceof Expressions?node:new Expressions([node])};If.prototype.compileStatement=function(o){var child,condO,ifPart,top;top=del(o,"top");child=del(o,"chainChild");condO=merge(o);o.indent=this.idt(1);o.top=true;ifPart=("if ("+(this.compileCondition(condO))+") {\n"+(this.body.compile(o))+"\n"+(this.tab)+"}");if(!child){ifPart=this.tab+ifPart}if(!this.elseBody){return ifPart}return ifPart+(this.isChain?" else "+this.elseBodyNode().compile(merge(o,{indent:this.tab,chainChild:true})):(" else {\n"+(this.elseBody.compile(o))+"\n"+(this.tab)+"}"))};If.prototype.compileExpression=function(o){var code,elsePart,ifPart;this.bodyNode().tags.operation=(this.condition.tags.operation=true);if(this.elseBody){this.elseBodyNode().tags.operation=true}ifPart=this.condition.compile(o)+" ? "+this.bodyNode().compile(o);elsePart=this.elseBody?this.elseBodyNode().compile(o):"undefined";code=(""+ifPart+" : "+elsePart);return this.tags.operation?("("+code+")"):code};return If})();Push={wrap:function(name,expressions){if(expressions.empty()||expressions.containsPureStatement()){return expressions}return Expressions.wrap([new Call(new Value(new Literal(name),[new Accessor(new Literal("push"))]),[expressions.unwrap()])])}};Closure={wrap:function(expressions,statement){var args,call,func,mentionsArgs,meth;if(expressions.containsPureStatement()){return expressions}func=new Parens(new Code([],Expressions.wrap([expressions])));args=[];if((mentionsArgs=expressions.contains(this.literalArgs))||(expressions.contains(this.literalThis))){meth=new Literal(mentionsArgs?"apply":"call");args=[new Literal("this")];if(mentionsArgs){args.push(new Literal("arguments"))}func=new Value(func,[new Accessor(meth)])}call=new Call(func,args);return statement?Expressions.wrap([call]):call},literalArgs:function(node){return node instanceof Literal&&node.value==="arguments"},literalThis:function(node){return node instanceof Literal&&node.value==="this"||node instanceof Code&&node.bound}};UTILITIES={"extends":'function(child, parent) {\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor;\n if (typeof parent.extended === "function") parent.extended(child);\n child.__super__ = parent.prototype;\n}',bind:"function(func, context) {\n return function() { return func.apply(context, arguments); };\n}",hasProp:"Object.prototype.hasOwnProperty",slice:"Array.prototype.slice"};TAB=" ";TRAILING_WHITESPACE=/[ \t]+$/gm;IDENTIFIER=/^[$A-Za-z_][$\w]*$/;NUMBER=/^0x[\da-f]+|^(?:\d+(\.\d+)?|\.\d+)(?:e[+-]?\d+)?$/i;SIMPLENUM=/^[+-]?\d+$/;IS_STRING=/^['"]/;utility=function(name){var ref;ref=("__"+name);Scope.root.assign(ref,UTILITIES[name]);return ref}}).call(this)};require["./coffee-script"]=new function(){var exports=this;(function(){var Lexer,compile,fs,lexer,parser,path;path=require("path");Lexer=require("./lexer").Lexer;parser=require("./parser").parser;if(require.extensions){fs=require("fs");require.extensions[".coffee"]=function(module,filename){var content;content=compile(fs.readFileSync(filename,"utf8"));return module._compile(content,filename)}}else{if(require.registerExtension){require.registerExtension(".coffee",function(content){return compile(content)})}}exports.VERSION="0.9.4";exports.helpers=require("./helpers");exports.compile=(compile=function(code,options){options||(options={});try{return(parser.parse(lexer.tokenize(code))).compile(options)}catch(err){if(options.fileName){err.message=("In "+(options.fileName)+", "+(err.message))}throw err}});exports.tokens=function(code,options){return lexer.tokenize(code,options)};exports.nodes=function(code,options){return parser.parse(lexer.tokenize(code,options))};exports.run=function(code,options){var root;root=module;while(root.parent){root=root.parent}root.filename=options.fileName;if(root.moduleCache){root.moduleCache={}}return path.extname(root.filename)!==".coffee"||require.extensions?root._compile(exports.compile(code,options),root.filename):root._compile(code,root.filename)};exports.eval=function(code,options){var __dirname,__filename;__filename=options.fileName;__dirname=path.dirname(__filename);return eval(exports.compile(code,options))};lexer=new Lexer;parser.lexer={lex:function(){var token;token=this.tokens[this.pos]||[""];this.pos+=1;this.yylineno=token[2];this.yytext=token[1];return token[0]},setInput:function(tokens){this.tokens=tokens;return(this.pos=0)},upcomingInput:function(){return""}};parser.yy=require("./nodes")}).call(this)};require["./browser"]=new function(){var exports=this;(function(){var CoffeeScript,runScripts;CoffeeScript=require("./coffee-script");CoffeeScript.require=require;CoffeeScript.eval=function(code,options){return eval(CoffeeScript.compile(code,options))};CoffeeScript.run=function(code,options){((options!=null)?(options.bare=true):undefined);return Function(CoffeeScript.compile(code,options))()};if(!(typeof window!=="undefined"&&window!==null)){return}CoffeeScript.load=function(url,options){var xhr;xhr=new (window.ActiveXObject||XMLHttpRequest)("Microsoft.XMLHTTP");xhr.open("GET",url,true);if("overrideMimeType" in xhr){xhr.overrideMimeType("text/plain")}xhr.onreadystatechange=function(){return xhr.readyState===4?CoffeeScript.run(xhr.responseText,options):undefined};return xhr.send(null)};runScripts=function(){var _i,_len,_ref;for(_i=0,_len=(_ref=document.getElementsByTagName("script")).length;_i<_len;_i++){(function(){var script=_ref[_i];return script.type==="text/coffeescript"?(script.src?CoffeeScript.load(script.src):setTimeout(function(){return CoffeeScript.run(script.innerHTML)})):undefined})()}return null};if(window.addEventListener){addEventListener("DOMContentLoaded",runScripts,false)}else{attachEvent("onload",runScripts)}}).call(this)};return require["./coffee-script"]}();
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/extras/jsl.conf b/node_modules/jade/support/coffee-script/extras/jsl.conf
new file mode 100644
index 0000000..fb41a61
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/extras/jsl.conf
@@ -0,0 +1,44 @@
+# JavaScriptLint configuration file for CoffeeScript.
+
++no_return_value # function {0} does not always return a value
++duplicate_formal # duplicate formal argument {0}
+-equal_as_assign # test for equality (==) mistyped as assignment (=)?{0}
++var_hides_arg # variable {0} hides argument
++redeclared_var # redeclaration of {0} {1}
+-anon_no_return_value # anonymous function does not always return a value
++missing_semicolon # missing semicolon
++meaningless_block # meaningless block; curly braces have no impact
+-comma_separated_stmts # multiple statements separated by commas (use semicolons?)
++unreachable_code # unreachable code
++missing_break # missing break statement
++missing_break_for_last_case # missing break statement for last case in switch
+-comparison_type_conv # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)
+-inc_dec_within_stmt # increment (++) and decrement (--) operators used as part of greater statement
++useless_void # use of the void type may be unnecessary (void is always undefined)
++multiple_plus_minus # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
++use_of_label # use of label
+-block_without_braces # block statement without curly braces
++leading_decimal_point # leading decimal point may indicate a number or an object member
++trailing_decimal_point # trailing decimal point may indicate a number or an object member
++octal_number # leading zeros make an octal number
++nested_comment # nested comment
++misplaced_regex # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma
++ambiguous_newline # unexpected end of line; it is ambiguous whether these lines are part of the same statement
++empty_statement # empty statement or extra semicolon
+-missing_option_explicit # the "option explicit" control comment is missing
++partial_option_explicit # the "option explicit" control comment, if used, must be in the first script tag
++dup_option_explicit # duplicate "option explicit" control comment
++useless_assign # useless assignment
++ambiguous_nested_stmt # block statements containing block statements should use curly braces to resolve ambiguity
++ambiguous_else_stmt # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent)
+-missing_default_case # missing default case in switch statement
++duplicate_case_in_switch # duplicate case in switch statements
++default_not_at_end # the default case is not at the end of the switch statement
++legacy_cc_not_understood # couldn't understand control comment using /*@keyword@*/ syntax
++jsl_cc_not_understood # couldn't understand control comment using /*jsl:keyword*/ syntax
++useless_comparison # useless comparison; comparing identical expressions
++with_statement # with statement hides undeclared variables; use temporary variable instead
++trailing_comma_in_array # extra comma is not recommended in array initializers
++assign_to_function_call # assignment to a function call
++parseint_missing_radix # parseInt missing radix parameter
++lambda_assign_requires_semicolon
diff --git a/node_modules/jade/support/coffee-script/index.html b/node_modules/jade/support/coffee-script/index.html
new file mode 100644
index 0000000..5b28b8b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/index.html
@@ -0,0 +1,2225 @@
+
+
+
+
+
+
+
+ CoffeeScript
+
+
+
+
+
+
+
+
+
+ CoffeeScript is a little language that compiles into JavaScript. Think
+ of it as JavaScript's less ostentatious kid brother — the same genes,
+ roughly the same height, but a different sense of style. Apart from a handful of
+ bonus goodies, statements in CoffeeScript correspond one-to-one with their
+ equivalent in JavaScript, it's just another way of saying it.
+
+
+
+ Disclaimer:
+ CoffeeScript is just for fun. Until it reaches 1.0, there are no guarantees
+ that the syntax won't change between versions. That said,
+ it compiles into clean JavaScript (the good parts) that can use existing
+ JavaScript libraries seamlessly, and passes through
+ JSLint without warnings. The compiled
+ output is pretty-printed and quite readable.
+
+ For a longer CoffeeScript example, check out
+ Underscore.coffee, a port
+ of the Underscore.js
+ library of helper functions. Underscore.coffee can pass the entire Underscore.js
+ test suite. The CoffeeScript version is faster than the original for a number
+ of methods (in general, due to the speed of CoffeeScript's array comprehensions), and
+ after being minified and gzipped, is only 241 bytes larger than the original
+ JavaScript version.
+ Additional examples are included in the source repository, inside the
+ examples folder.
+
+
+
+
+ Installation and Usage
+
+
+
+ The CoffeeScript compiler is written in pure CoffeeScript, using a
+ small DSL
+ on top of the Jison parser generator, and is available
+ as a Node.js utility. The core compiler however,
+ does not depend on Node, and can be run in other server-side-JavaScript environments,
+ or in the browser (see "Try CoffeeScript", above).
+
+
+
+ To install, first make sure you have a working copy of the latest tagged version of
+ Node.js, currently 0.1.102 or higher.
+ Then clone the CoffeeScript
+ source repository
+ from GitHub, or download the latest
+ release: 0.9.4.
+ To install the CoffeeScript compiler system-wide
+ under /usr/local, open the directory and run:
+
+
+
+sudo bin/cake install
+
+
+ Alternatively, if you already have the
+ Node Package Manager installed,
+ you can use that to grab the latest CoffeeScript:
+
+
+
+sudo npm install coffee-script
+
+
+ Both of these provide the coffee command, which will execute CoffeeScripts
+ under Node.js by default, but is also used to compile CoffeeScript
+ .coffee files into JavaScript, or to run an an interactive REPL.
+ When compiling to JavaScript, coffee writes the output
+ as .js files in the same directory by default, but output
+ can be customized with the following options:
+
+
+
+
+
-c, --compile
+
+ Compile a .coffee script into a .js JavaScript file
+ of the same name.
+
+
+
+
-i, --interactive
+
+ Launch an interactive CoffeeScript session to try short snippets.
+ More pleasant if wrapped with
+ rlwrap.
+
+
+
+
-o, --output [DIR]
+
+ Write out all compiled JavaScript files into the specified directory.
+ Use in conjunction with --compile or --watch.
+
+
+
+
-w, --watch
+
+ Watch the modification times of the coffee-scripts, recompiling as
+ soon as a change occurs.
+
+
+
+
-p, --print
+
+ Instead of writing out the JavaScript as a file, print it
+ directly to stdout.
+
+
+
+
-l, --lint
+
+ If the jsl
+ (JavaScript Lint)
+ command is installed, use it
+ to check the compilation of a CoffeeScript file. (Handy in
+ conjunction with --watch)
+
+
+
+
-s, --stdio
+
+ Pipe in CoffeeScript to STDIN and get back JavaScript over STDOUT.
+ Good for use with processes written in other languages. An example:
+ cat src/cake.coffee | coffee -sc
+
+
+
+
-e, --eval
+
+ Compile and print a little snippet of CoffeeScript directly from the
+ command line. For example: coffee -e "puts num for num in [10..1]"
+
+
+
+
-r, --require
+
+ Load a library before compiling or executing your script. Can be used
+ to hook in to the compiler (to add Growl notifications, for example).
+
+
+
+
-b, --bare
+
+ Compile the JavaScript without the top-level function safety wrapper.
+ (Used for CoffeeScript as a Node.js module.)
+
+
+
+
-t, --tokens
+
+ Instead of parsing the CoffeeScript, just lex it, and print out the
+ token stream: [IDENTIFIER square] [ASSIGN =] [PARAM_START (] ...
+
+
+
+
-n, --nodes
+
+ Instead of compiling the CoffeeScript, just lex and parse it, and print
+ out the parse tree:
+
+Expressions
+ Assign
+ Value "square"
+ Code "x"
+ Op *
+ Value "x"
+ Value "x"
+
+ This reference is structured so that it can be read from top to bottom,
+ if you like. Later sections use ideas and syntax previously introduced.
+ Familiarity with JavaScript is assumed.
+ In all of the following examples, the source CoffeeScript is provided on
+ the left, and the direct compilation into JavaScript is on the right.
+
+
+
+
+
+ Many of the examples can be run (where it makes sense) by pressing the "run"
+ button towards the bottom right. You can also paste examples into
+ "Try CoffeeScript" in the toolbar, and play with them from there.
+
+
+
+ Significant Whitespace
+ CoffeeScript uses Python-style significant whitespace: You don't need to
+ use semicolons ; to terminate expressions, ending
+ the line will do just as well. Semicolons can still be used to fit
+ multiple expressions onto a single line. Instead of using curly braces
+ { } to delimit blocks of code (like functions,
+ if-statements,
+ switch, and try/catch),
+ use indentation.
+
+
+
+ You don't need to use parentheses to invoke a function if you're passing
+ arguments: print "coffee". Implicit parentheses wrap forwards
+ to the end of the line, or block expression.
+
+
+
+ You can use newlines to break up your expression into smaller pieces,
+ as long as CoffeeScript can determine that the line hasn't finished yet,
+ because it ends with an operator or a dot ... seen most commonly
+ in jQuery-chaining style JavaScript.
+
+
+
+
+ Functions and Invocation
+ Functions are defined by a list of parameters, an arrow, and the
+ function body. The empty function looks like this: ->
+
+
+ Objects and Arrays
+ Object and Array literals look very similar to their JavaScript cousins.
+ When you spread out each property on a separate line, the commas are
+ optional. Implicit objects may be created with indentation instead of
+ brackets, winding up looking quite similar to YAML.
+
+ In JavaScript, you can't use reserved words, like class, as properties
+ of an object, without quoting them as strings. CoffeeScript notices and quotes
+ them for you, so you don't have to worry about it (say, when using jQuery).
+
+
$('.account').css class: 'active'
+
$('.account').css({
+ "class": 'active'
+});
+
+
+
+
+ Lexical Scoping and Variable Safety
+ The CoffeeScript compiler takes care to make sure that all of your variables
+ are properly declared within lexical scope — you never need to write
+ var yourself.
+
+ Notice how all of the variable declarations have been pushed up to
+ the top of the closest scope, the first time they appear.
+ outer is not redeclared within the inner function, because it's
+ already in scope; inner within the function, on the other hand,
+ should not be able to change the value of the external variable of the same name, and
+ therefore has a declaration of its own.
+
+
+ This behavior is effectively identical to Ruby's scope for local variables.
+ Because you don't have direct access to the var keyword,
+ it's impossible to shadow an outer variable on purpose, you may only refer
+ to it. So be careful that you're not reusing the name of an external
+ variable accidentally, if you're writing a deeply nested function.
+
+
+ Although suppressed within this documentation for clarity, all
+ CoffeeScript output is wrapped in an anonymous function:
+ (function(){ ... })(); This safety wrapper, combined with the
+ automatic generation of the var keyword, make it exceedingly difficult
+ to pollute the global namespace by accident.
+
+
+ If you'd like to create top-level variables for other scripts to use,
+ attach them as properties on window, or on the exports
+ object in CommonJS. The existential operator (covered below), gives you a
+ reliable way to figure out where to add them, if you're targeting both
+ CommonJS and the browser: root = exports ? this
+
+
+
+
+ If, Else, Unless, and Conditional Assignment
+ If/else statements can be written without the use of parentheses and
+ curly brackets. As with functions and other block expressions,
+ multi-line conditionals are delimited by indentation. There's also a handy
+ postfix form, with the if or unless at the end.
+
+
+ CoffeeScript can compile if statements into JavaScript expressions,
+ using the ternary operator when possible, and closure wrapping otherwise. There
+ is no explicit ternary statement in CoffeeScript — you simply use
+ a regular if statement inline.
+
+
mood = greatlyImproved if singing
+
+if happy and knowsIt
+ clapsHands()
+ chaChaCha()
+else
+ showIt()
+
+date =if friday then sue else jill
+
+options or= defaults
+
+
+ Aliases
+ Because the == operator frequently causes undesirable coercion,
+ is intransitive, and has a different meaning than in other languages,
+ CoffeeScript compiles == into ===, and != into
+ !==.
+ In addition, is compiles into ===,
+ and isnt into !==.
+
+
+ You can use not as an alias for !.
+
+
+ For logic, and compiles to &&, and or
+ into ||.
+
+
+ Instead of a newline or semicolon, then can be used to separate
+ conditions from expressions, in while,
+ if/else, and switch/when statements.
+
+
+ As in YAML, on and yes
+ are the same as boolean true, while off and no are boolean false.
+
+
+ For single-line statements, unless can be used as the inverse of if.
+
+
+ As a shortcut for this.property, you can use @property.
+
+
+ You can use in to test for array presence, and of to
+ test for JavaScript object-key presence.
+
+
launch() if ignition ison
+
+volume =10if band isnt SpinalTap
+
+letTheWildRumpusBegin() unless answer isno
+
+if car.speed < limit then accelerate()
+
+winner =yesif pick in [47, 92, 13]
+
+print inspect "My name is "+@name
+
+
+ Splats...
+ The JavaScript arguments object is a useful way to work with
+ functions that accept variable numbers of arguments. CoffeeScript provides
+ splats ..., both for function definition as well as invocation,
+ making variable numbers of arguments a little bit more palatable.
+
+
+ While, Until, and Loop
+ The only low-level loop that CoffeeScript provides is the while loop. The
+ main difference from JavaScript is that the while loop can be used
+ as an expression, returning an array containing the result of each iteration
+ through the loop.
+
+
# Econ 101
+ifthis.studyingEconomics
+ buy() while supply > demand
+ sell() until supply > demand
+
+# Nursery Rhyme
+num =6
+lyrics =while num -=1
+ num +" little monkeys, jumping on the bed.
+ One fell out and bumped his head."
+
var _result, lyrics, num;
+if (this.studyingEconomics) {
+ while (supply > demand) {
+ buy();
+ }
+ while (!(supply > demand)) {
+ sell();
+ }
+}
+num =6;
+lyrics = (function() {
+ _result = [];
+ while (num -=1) {
+ _result.push(num +" little monkeys, jumping on the bed. One fell out and bumped his head.");
+ }
+ return _result;
+})();
+
+
+ For readability, the until keyword is equivalent to while not,
+ and the loop keyword is equivalent to while true.
+ Other JavaScript loops, such as for loops and do-while loops
+ can be mimicked by variations on loop, but the hope is that you
+ won't need to do that with CoffeeScript, either because you're using
+ each (forEach) style iterators, or...
+
+
+
+
+ Comprehensions (Arrays, Objects, and Ranges)
+ For your looping needs, CoffeeScript provides array comprehensions
+ similar to Python's. They replace (and compile into) for loops, with
+ optional guard clauses and the value of the current array index.
+ Unlike for loops, array comprehensions are expressions, and can be returned
+ and assigned. They should be able to handle most places where you otherwise
+ would use a loop, each/forEach, map, or select/filter.
+
+
# Eat lunch.
+lunch = eat food for food in ['toast', 'cheese', 'wine']
+
+# Naive collision detection.
+for roid, pos in asteroids
+ for roid2 in asteroids when roid isnt roid2
+ roid.explode() if roid.overlaps roid2
+
+ If you know the start and end of your loop, or would like to step through
+ in fixed-size increments, you can use a range to specify the start and
+ end of your comprehension.
+
+
countdown = num for num in [10..1]
+
+deliverEggs =->
+ for i in [0...eggs.length] by12
+ dozen = eggs[i...i+12]
+ deliver neweggCarton dozen
+
var _result, countdown, deliverEggs, num;
+countdown = (function() {
+ _result = [];
+ for (num =10; num >=1; num--) {
+ _result.push(num);
+ }
+ return _result;
+})();
+deliverEggs = function() {
+ var _ref, _result2, dozen, i;
+ _result2 = []; _ref = eggs.length;
+ for (i =0; (0<= _ref ? i < _ref : i > _ref); i +=12) {
+ _result2.push((function() {
+ dozen = eggs.slice(i, i +12);
+ return deliver(neweggCarton(dozen));
+ })());
+ }
+ return _result2;
+};
+
+
+ Comprehensions can also be used to iterate over the keys and values in
+ an object. Use of to signal comprehension over the properties of
+ an object instead of the values in an array.
+
+
yearsOld = max: 10, ida: 9, tim: 11
+
+ages =for child, age of yearsOld
+ child +" is "+ age
+
var _result, age, ages, child, yearsOld;
+var __hasProp =Object.prototype.hasOwnProperty;
+yearsOld = {
+ max: 10,
+ ida: 9,
+ tim: 11
+};
+ages = (function() {
+ _result = [];
+ for (child in yearsOld) {
+ if (!__hasProp.call(yearsOld, child)) continue;
+ age = yearsOld[child];
+ _result.push(child +" is "+ age);
+ }
+ return _result;
+})();
+
+
+ By default, object comprehensions are safe, and use a hasOwnProperty
+ check to make sure that you're dealing with properties on the current
+ object. If you'd like the regular JavaScript for (key in obj) ...
+ loop, for speed or for another reason, you can use
+ for all key, value of object in CoffeeScript.
+
+
+
+
+ Array Slicing and Splicing with Ranges
+ CoffeeScript borrows Ruby's
+ range syntax
+ for extracting slices of arrays. With two dots (3..5), the range
+ is inclusive: the first argument is the index of the first element in
+ the slice, and the second is the index of the last one. Three dots signify
+ a range that excludes the end.
+
+
+ Everything is an Expression (at least, as much as possible)
+ You might have noticed how even though we don't add return statements
+ to CoffeeScript functions, they nonetheless return their final value.
+ The CoffeeScript compiler tries to make sure that all statements in the
+ language can be used as expressions. Watch how the return gets
+ pushed down into each possible branch of execution, in the function
+ below.
+
+ Even though functions will always return their final value, it's both possible
+ and encouraged to return early from a function body writing out the explicit
+ return (return value), when you know that you're done.
+
+
+ Because variable declarations occur at the top of scope, assignment can
+ be used within expressions, even for variables that haven't been seen before:
+
+ Things that would otherwise be statements in JavaScript, when used
+ as part of an expression in CoffeeScript, are converted into expressions
+ by wrapping them in a closure. This lets you do useful things, like assign
+ the result of a comprehension to a variable:
+
+
# The first ten global properties.
+
+globals = (name for name of window)[0...10]
+
+ There are a handful of statements in JavaScript that can't be meaningfully
+ converted into expressions, namely break, continue,
+ and return. If you make use of them within a block of code,
+ CoffeeScript won't try to perform the conversion.
+
+
+
+
+ The Existential Operator
+ It's a little difficult to check for the existence of a variable in
+ JavaScript. if (variable) ... comes close, but fails for zero,
+ the empty string, and false. CoffeeScript's existential operator ? returns true unless
+ a variable is null or undefined, which makes it analogous
+ to Ruby's nil?
+
+
+ It can also be used for safer conditional assignment than ||=
+ provides, for cases where you may be handling numbers or strings.
+
var solipsism, speed;
+if ((typeof mind !=="undefined"&& mind !==null) &&!(typeof world !=="undefined"&& world !==null)) {
+ solipsism =true;
+}
+(typeof speed !=="undefined"&& speed !==null) ? speed : (speed =140);
+
+
+ The accessor variant of the existential operator ?. can be used to soak
+ up null references in a chain of properties. Use it instead
+ of the dot accessor . in cases where the base value may be null
+ or undefined. If all of the properties exist then you'll get the expected
+ result, if the chain is broken, undefined is returned instead of
+ the TypeError that would be raised otherwise.
+
+
+ Classes, Inheritance, and Super
+ JavaScript's prototypal inheritance has always been a bit of a
+ brain-bender, with a whole family tree of libraries that provide a cleaner
+ syntax for classical inheritance on top of JavaScript's prototypes:
+ Base2,
+ Prototype.js,
+ JS.Class, etc.
+ The libraries provide syntactic sugar, but the built-in inheritance would
+ be completely usable if it weren't for a couple of small exceptions:
+ it's awkward to call super (the prototype object's
+ implementation of the current function), and it's awkward to correctly
+ set the prototype chain.
+
+
+ Instead of repetitively attaching functions to a prototype, CoffeeScript
+ provides a basic class structure that allows you to name your class,
+ set the superclass, assign prototypal properties, and define the constructor,
+ in a single assignable expression.
+
+ If structuring your prototypes classically isn't your cup of tea, CoffeeScript
+ provides a couple of lower-level conveniences. The extends operator
+ helps with proper prototype setup, :: gives you
+ quick access to an object's prototype, and super()
+ is converted into a call against the immediate ancestor's method of the same name.
+
+ Finally, you may assign Class-level (static) properties within a class
+ definition by using @property: value
+
+
+
+
+ Pattern Matching (Destructuring Assignment)
+ To make extracting values from complex arrays and objects more convenient,
+ CoffeeScript implements ECMAScript Harmony's proposed
+ destructuring assignment
+ syntax. When you assign an array or object literal to a value, CoffeeScript
+ breaks up and matches both sides against each other, assigning the values
+ on the right to the variables on the left. In the simplest case, it can be
+ used for parallel assignment:
+
var _ref, close, contents, open, tag;
+var __slice =Array.prototype.slice;
+tag ="<impossible>";
+_ref = tag.split(""), open = _ref[0], contents = __slice.call(_ref, 1, _ref.length-1), close = _ref[_ref.length-1];
+
+
+
+
+ Function binding
+ In JavaScript, the this keyword is dynamically scoped to mean the
+ object that the current function is attached to. If you pass a function as
+ as callback, or attach it to a different object, the original value of this
+ will be lost. If you're not familiar with this behavior,
+ this Digital Web article
+ gives a good overview of the quirks.
+
+
+ The fat arrow => can be used to both define a function, and to bind
+ it to the current value of this, right on the spot. This is helpful
+ when using callback-based libraries like Prototype or jQuery, for creating
+ iterator functions to pass to each, or event-handler functions
+ to use with bind. Functions created with the fat arrow are able to access
+ properties of the this where they're defined.
+
+ If we had used -> in the callback above, @customer would
+ have referred to the undefined "customer" property of the DOM element,
+ and trying to call purchase() on it would have raised an exception.
+
+
+
+
+ Embedded JavaScript
+ Hopefully, you'll never need to use it, but if you ever need to intersperse
+ snippets of JavaScript within your CoffeeScript, you can
+ use backticks to pass it straight through.
+
+
+ Switch/When/Else
+ Switch statements in JavaScript are a bit awkward. You need to
+ remember to break at the end of every case statement to
+ avoid accidentally falling through to the default case.
+ CoffeeScript prevents accidental fall-through, and can convert the switch
+ into a returnable, assignable expression. The format is: switch condition,
+ when clauses, else the default case.
+
+
+ As in Ruby, switch statements in CoffeeScript can take multiple
+ values for each when clause. If any of the values match, the clause
+ runs.
+
+
switch day
+ when"Mon"then go work
+ when"Tue"then go relax
+ when"Thu"then go iceFishing
+ when"Fri", "Sat"
+ if day is bingoDay
+ go bingo
+ go dancing
+ when"Sun"then go church
+ else go work
+
+
+ Chained Comparisons
+ CoffeeScript borrows
+ chained comparisons
+ from Python — making it easy to test if a value falls within a
+ certain range.
+
+
+ String and RegExp Interpolation
+ Ruby-style string interpolation is included in CoffeeScript. Double-quoted
+ strings allow for interpolated values, while single-quoted strings are literal.
+
+
author ="Wittgenstein"
+quote ="A picture is a fact. -- #{author}"
+
var author, quote;
+author ="Wittgenstein";
+quote = ("A picture is a fact. -- "+ author);
+
+
+ And arbitrary expressions can be interpolated by using brackets #{ ... }
+ Interpolation works the same way within regular expressions.
+
+
sentence ="#{22/7} is a decent approximation of π"
+
+sep ="[.\\/\\- ]"
+dates =/\d+#{sep}\d+#{sep}\d+/g
+
+
+
var dates, sentence, sep;
+sentence = (""+ (22 / 7) +" is a decent approximation of π");
+sep ="[.\\/\\- ]";
+dates =/\d+#{sep}\d+#{sep}\d+/g;
+
+
+
+
+ Multiline Strings, Heredocs, and Block Comments
+ Multiline strings are allowed in CoffeeScript.
+
+
mobyDick ="Call me Ishmael. Some years ago --
+ never mind how long precisely -- having little
+ or no money in my purse, and nothing particular
+ to interest me on shore, I thought I would sail
+ about a little and see the watery part of the
+ world..."
+
+
+
var mobyDick;
+mobyDick ="Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world...";
+
+
+ Heredocs can be used to hold formatted or indentation-sensitive text
+ (or, if you just don't feel like escaping quotes and apostrophes). The
+ indentation level that begins the heredoc is maintained throughout, so
+ you can keep it all aligned with the body of your code.
+
+
html ='''
+ <strong>
+ cup of coffeescript
+ </strong>
+'''
+
var html;
+html ='<strong>\n cup of coffeescript\n</strong>';
+
+
+ Double-quoted heredocs, like double-quoted strings, allow interpolation.
+
+
+ Sometimes you'd like to pass a block comment through to the generated
+ JavaScript. For example, when you need to embed a licensing header at
+ the top of a file. Block comments, which mirror the syntax for heredocs,
+ are preserved in the generated code.
+
+
###
+CoffeeScript Compiler v0.9.4
+Released under the MIT License
+###
+
/*
+CoffeeScript Compiler v0.9.4
+Released under the MIT License
+*/
+
+
+
+
+ Cake, and Cakefiles
+
+
+
+ CoffeeScript includes a simple build system similar to
+ Make and
+ Rake. Naturally,
+ it's called Cake, and is used for the build and test tasks for the CoffeeScript
+ language itself. Tasks are defined in a file named Cakefile, and
+ can be invoked by running cake taskname from within the directory.
+ To print a list of all the tasks and options, just run cake.
+
+
+
+ Task definitions are written in CoffeeScript, so you can put arbitrary code
+ in your Cakefile. Define a task with a name, a long description, and the
+ function to invoke when the task is run. If your task takes a command-line
+ option, you can define the option with short and long flags, and it will
+ be made available in the options object. Here's a task that uses
+ the Node.js API to rebuild CoffeeScript's parser:
+
var fs;
+fs = require('fs');
+option('-o', '--output [DIR]', 'directory for compiled code');
+task('build:parser', 'rebuild the Jison parser', function(options) {
+ var code, dir;
+ require('jison');
+ code = require('./lib/grammar').parser.generate();
+ dir = options.output ||'lib';
+ return fs.writeFile(""+ dir +"/parser.js", code);
+});
+
+
+ If you need to invoke one task before another — for example, running
+ build before test, you can use the invoke function:
+ invoke 'build'
+
+
+
+
+ "text/coffeescript" Script Tags
+
+
+
+ While it's not recommended for serious use, CoffeeScripts may be included
+ directly within the browser using <script type="text/coffeescript">
+ tags. The source includes a compressed and minified version of the compiler
+ (Download current version here, 43k when gzipped)
+ as extras/coffee-script.js. Include this file on a page with
+ inline CoffeeScript tags, and it will compile and evaluate them in order.
+
+
+
+ In fact, the little bit of glue script that runs "Try CoffeeScript" above,
+ as well as jQuery for the menu, is implemented in just this way.
+ View source and look at the bottom of the page to see the example.
+ Including the script also gives you access to CoffeeScript.compile()
+ so you can pop open Firebug and try compiling some strings.
+
+
+
+ The usual caveats about CoffeeScript apply — your inline scripts will
+ run within a closure wrapper, so if you want to expose global variables or
+ functions, attach them to the window object.
+
+
+
+
+ Resources
+
+
+
+
+ Source Code
+ Use bin/coffee to test your changes,
+ bin/cake test to run the test suite,
+ bin/cake build to rebuild the CoffeeScript compiler, and
+ bin/cake build:parser to regenerate the Jison parser if you're
+ working on the grammar.
+ git checkout lib && bin/cake build:full is a good command to run when you're working
+ on the core language. It'll refresh the lib directory
+ (in case you broke something), build your altered compiler, use that to
+ rebuild itself (a good sanity test) and then run all of the tests. If
+ they pass, there's a good chance you've made a successful change.
+
+
+ CoffeeScript Issues
+ Bugs reports, feature requests, and general discussion all belong here.
+
+
+ If you'd like to chat, stop by #coffeescript on Freenode in the
+ IRC client of your choice, or on
+ webchat.freenode.net.
+
+
+ yeungda's JCoffeeScript
+ — A Java Library that uses Rhino to compile CoffeeScript, allowing
+ compilation within Java projects or on systems that Node.js doesn't support.
+
+
+ defunkt's CoffeeScript Major Mode
+ — a Emacs major mode that provides syntax highlighting, indentation
+ support, and some bonus commands.
+
+
+ jashkenas's CoffeeScript TextMate Bundle
+ — which provides syntax highlighting, snippet expansion, and the
+ ability to run bits of CoffeeScript from within TextMate itself.
+
+
+ kchmck's Vim CoffeeScript
+ — which adds Vim syntax highlighting and indentation support.
+
+
+ wavded's gedit-coffeescript
+ — a CoffeeScript syntax highlighter for the gedit text editor.
+
+
+ yeungda's coffeescript-idea
+ — a plugin for IntelliJ IDEA and RubyMine providing syntax highlighting.
+
+
+ mattly's rack-coffee
+ — a small Rack middleware for serving CoffeeScript files as
+ compiled JavaScript on the fly.
+
+
+ jnicklas's BistroCar
+ — a plugin that serves and bundles CoffeeScript from within your
+ Rails application.
+
+
+ dsc's CoffeeCup
+ — a Python WSGI middleware that compiles CoffeeScript to JavaScript
+ on-demand during development.
+
+
+ sutto's Barista
+ — a BistroCar alternative that integrates well with
+ Jammit and Rails 3.
+
+
+ inem and gerad's coffee-haml-filter
+ — a custom filter for rendering CoffeeScript inline within
+ HAML templates.
+
+
+ chrislloyd's Roast
+ — a CoffeeScript compiler plug-in that allows you to include external
+ source files.
+
+
+ mauricemach's CoffeeKup
+ — Markup as CoffeeScript. After _why's
+ Markaby.
+
+
+ jashkenas's Docco
+ — a quick-and-dirty literate-programming-style documentation generator
+ for CoffeeScript. Used to produce the annotated source.
+
+
+
+
+
+ Web Chat (IRC)
+
+
+
+ Quick help and advice can usually be found in the CoffeeScript IRC room.
+ Join #coffeescript on irc.freenode.net, or click the
+ button below to open a webchat session on this page.
+
+
+
+
+
+
+
+
+ Change Log
+
+
+
+ 0.9.4
+ CoffeeScript now uses appropriately-named temporary variables, and recycles
+ their references after use. Added require.extensions support for
+ Node.js 0.3. Loading CoffeeScript in the browser now adds just a
+ single CoffeeScript object to global scope.
+ Fixes for implicit object and block comment edge cases.
+
+
+
+ 0.9.3
+ CoffeeScript switch statements now compile into JS switch
+ statements — they previously compiled into if/else chains
+ for JavaScript 1.3 compatibility.
+ Soaking a function invocation is now supported. Users of the RubyMine
+ editor should now be able to use --watch mode.
+
+
+
+ 0.9.2
+ Specifying the start and end of a range literal is now optional, eg. array[3..].
+ You can now say a not instanceof b.
+ Fixed important bugs with nested significant and non-significant indentation (Issue #637).
+ Added a --require flag that allows you to hook into the coffee command.
+ Added a custom jsl.conf file for our preferred JavaScriptLint setup.
+ Sped up Jison grammar compilation time by flattening rules for operations.
+ Block comments can now be used with JavaScript-minifier-friendly syntax.
+ Added JavaScript's compound assignment bitwise operators. Bugfixes to
+ implicit object literals with leading number and string keys, as the subject
+ of implicit calls, and as part of compound assignment.
+
+
+
+ 0.9.1
+ Bugfix release for 0.9.1. Greatly improves the handling of mixed
+ implicit objects, implicit function calls, and implicit indentation.
+ String and regex interpolation is now strictly #{ ... } (Ruby style).
+ The compiler now takes a --require flag, which specifies scripts
+ to run before compilation.
+
+
+
+ 0.9.0
+ The CoffeeScript 0.9 series is considered to be a release candidate
+ for 1.0; let's give her a shakedown cruise. 0.9.0 introduces a massive
+ backwards-incompatible change: Assignment now uses =, and object
+ literals use :, as in JavaScript. This allows us to have implicit
+ object literals, and YAML-style object definitions. Half assignments are
+ removed, in favor of +=, or=, and friends.
+ Interpolation now uses a hash mark # instead of the dollar sign
+ $ — because dollar signs may be part of a valid JS identifier.
+ Downwards range comprehensions are now safe again, and are optimized to
+ straight for loops when created with integer endpoints.
+ A fast, unguarded form of object comprehension was added:
+ for all key, value of object. Mentioning the super keyword
+ with no arguments now forwards all arguments passed to the function,
+ as in Ruby. If you extend class B from parent class A, if
+ A has an extended method defined, it will be called, passing in B —
+ this enables static inheritance, among other things. Cleaner output for
+ functions bound with the fat arrow. @variables can now be used
+ in parameter lists, with the parameter being automatically set as a property
+ on the object — useful in constructors and setter functions.
+ Constructor functions can now take splats.
+
+
+
+ 0.7.2
+ Quick bugfix (right after 0.7.1) for a problem that prevented coffee
+ command-line options from being parsed in some circumstances.
+
+
+
+ 0.7.1
+ Block-style comments are now passed through and printed as JavaScript block
+ comments -- making them useful for licenses and copyright headers. Better
+ support for running coffee scripts standalone via hashbangs.
+ Improved syntax errors for tokens that are not in the grammar.
+
+
+
+ 0.7.0
+ Official CoffeeScript variable style is now camelCase, as in JavaScript.
+ Reserved words are now allowed as object keys, and will be quoted for you.
+ Range comprehensions now generate cleaner code, but you have to specify by -1
+ if you'd like to iterate downward. Reporting of syntax errors is greatly
+ improved from the previous release. Running coffee with no arguments
+ now launches the REPL, with Readline support. The <- bind operator
+ has been removed from CoffeeScript. The loop keyword was added,
+ which is equivalent to a while true loop. Comprehensions that contain
+ closures will now close over their variables, like the semantics of a forEach.
+ You can now use bound function in class definitions (bound to the instance).
+ For consistency, a in b is now an array presence check, and a of b
+ is an object-key check. Comments are no longer passed through to the generated
+ JavaScript.
+
+
+
+ 0.6.2
+ The coffee command will now preserve directory structure when
+ compiling a directory full of scripts. Fixed two omissions that were preventing
+ the CoffeeScript compiler from running live within Internet Explorer.
+ There's now a syntax for block comments, similar in spirit to CoffeeScript's heredocs.
+ ECMA Harmony DRY-style pattern matching is now supported, where the name
+ of the property is the same as the name of the value: {name, length}: func.
+ Pattern matching is now allowed within comprehension variables. unless
+ is now allowed in block form. until loops were added, as the inverse
+ of while loops. switch statements are now allowed without
+ switch object clauses. Compatible
+ with Node.js v0.1.95.
+
+
+
+ 0.6.1
+ Upgraded CoffeeScript for compatibility with the new Node.js v0.1.90
+ series.
+
+
+
+ 0.6.0
+ Trailing commas are now allowed, a-la Python. Static
+ properties may be assigned directly within class definitions,
+ using @property notation.
+
+
+
+ 0.5.6
+ Interpolation can now be used within regular expressions and heredocs, as well as
+ strings. Added the <- bind operator.
+ Allowing assignment to half-expressions instead of special ||=-style
+ operators. The arguments object is no longer automatically converted into
+ an array. After requiring coffee-script, Node.js can now directly
+ load .coffee files, thanks to registerExtension. Multiple
+ splats can now be used in function calls, arrays, and pattern matching.
+
+
+
+ 0.5.5
+ String interpolation, contributed by
+ Stan Angeloff.
+ Since --run has been the default since 0.5.3, updating
+ --stdio and --eval to run by default, pass --compile
+ as well if you'd like to print the result.
+
+
+
+ 0.5.4
+ Bugfix that corrects the Node.js global constants __filename and
+ __dirname. Tweaks for more flexible parsing of nested function
+ literals and improperly-indented comments. Updates for the latest Node.js API.
+
+
+
+ 0.5.3
+ CoffeeScript now has a syntax for defining classes. Many of the core
+ components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them.
+ Cakefiles can use optparse.coffee to define options for tasks.
+ --run is now the default flag for the coffee command,
+ use --compile to save JavaScripts. Bugfix for an ambiguity between
+ RegExp literals and chained divisions.
+
+
+
+ 0.5.2
+ Added a compressed version of the compiler for inclusion in web pages as
+ extras/coffee-script.js. It'll automatically run any script tags
+ with type text/coffeescript for you. Added a --stdio option
+ to the coffee command, for piped-in compiles.
+
+
+
+
+ 0.5.1
+ Improvements to null soaking with the existential operator, including
+ soaks on indexed properties. Added conditions to while loops,
+ so you can use them as filters with when, in the same manner as
+ comprehensions.
+
+
+
+ 0.5.0
+ CoffeeScript 0.5.0 is a major release, While there are no language changes,
+ the Ruby compiler has been removed in favor of a self-hosting
+ compiler written in pure CoffeeScript.
+
+
+
+ 0.3.2
+ @property is now a shorthand for this.property.
+ Switched the default JavaScript engine from Narwhal to Node.js. Pass
+ the --narwhal flag if you'd like to continue using it.
+
+
+
+ 0.3.0
+ CoffeeScript 0.3 includes major syntax changes:
+
+ The function symbol was changed to
+ ->, and the bound function symbol is now =>.
+
+ Parameter lists in function definitions must now be wrapped in parentheses.
+
+ Added property soaking, with the ?. operator.
+
+ Made parentheses optional, when invoking functions with arguments.
+
+ Removed the obsolete block literal syntax.
+
+
+
+ 0.2.6
+ Added Python-style chained comparisons, the conditional existence
+ operator ?=, and some examples from Beautiful Code.
+ Bugfixes relating to statement-to-expression conversion, arguments-to-array
+ conversion, and the TextMate syntax highlighter.
+
+
+
+ 0.2.5
+ The conditions in switch statements can now take multiple values at once —
+ If any of them are true, the case will run. Added the long arrow ==>,
+ which defines and immediately binds a function to this. While loops can
+ now be used as expressions, in the same way that comprehensions can. Splats
+ can be used within pattern matches to soak up the rest of an array.
+
+
+
+ 0.2.4
+ Added ECMAScript Harmony style destructuring assignment, for dealing with
+ extracting values from nested arrays and objects. Added indentation-sensitive
+ heredocs for nicely formatted strings or chunks of code.
+
+
+
+ 0.2.3
+ Axed the unsatisfactory ino keyword, replacing it with of for
+ object comprehensions. They now look like: for prop, value of object.
+
+
+
+ 0.2.2
+ When performing a comprehension over an object, use ino, instead
+ of in, which helps us generate smaller, more efficient code at
+ compile time.
+
+ Added :: as a shorthand for saying .prototype.
+
+ The "splat" symbol has been changed from a prefix asterisk *, to
+ a postfix ellipsis ...
+
+ Added JavaScript's in operator,
+ empty return statements, and empty while loops.
+
+ Constructor functions that start with capital letters now include a
+ safety check to make sure that the new instance of the object is returned.
+
+ The extends keyword now functions identically to goog.inherits
+ in Google's Closure Library.
+
+
+
+ 0.2.1
+ Arguments objects are now converted into real arrays when referenced.
+
+
+
+ 0.2.0
+ Major release. Significant whitespace. Better statement-to-expression
+ conversion. Splats. Splice literals. Object comprehensions. Blocks.
+ The existential operator. Many thanks to all the folks who posted issues,
+ with special thanks to
+ Liam O'Connor-Davis for whitespace
+ and expression help.
+
+
+
+ 0.1.6
+ Bugfix for running coffee --interactive and --run
+ from outside of the CoffeeScript directory. Bugfix for nested
+ function/if-statements.
+
+
+
+ 0.1.5
+ Array slice literals and array comprehensions can now both take Ruby-style
+ ranges to specify the start and end. JavaScript variable declaration is
+ now pushed up to the top of the scope, making all assignment statements into
+ expressions. You can use \ to escape newlines.
+ The coffee-script command is now called coffee.
+
+
+
+ 0.1.4
+ The official CoffeeScript extension is now .coffee instead of
+ .cs, which properly belongs to
+ C#.
+ Due to popular demand, you can now also use = to assign. Unlike
+ JavaScript, = can also be used within object literals, interchangeably
+ with :. Made a grammatical fix for chained function calls
+ like func(1)(2)(3)(4). Inheritance and super no longer use
+ __proto__, so they should be IE-compatible now.
+
+
+
+ 0.1.3
+ The coffee command now includes --interactive,
+ which launches an interactive CoffeeScript session, and --run,
+ which directly compiles and executes a script. Both options depend on a
+ working installation of Narwhal.
+ The aint keyword has been replaced by isnt, which goes
+ together a little smoother with is.
+ Quoted strings are now allowed as identifiers within object literals: eg.
+ {"5+5": 10}.
+ All assignment operators now use a colon: +:, -:,
+ *:, etc.
+
+
+
+ 0.1.2
+ Fixed a bug with calling super() through more than one level of
+ inheritance, with the re-addition of the extends keyword.
+ Added experimental Narwhal
+ support (as a Tusk package), contributed by
+ Tom Robinson, including
+ bin/cs as a CoffeeScript REPL and interpreter.
+ New --no-wrap option to suppress the safety function
+ wrapper.
+
+
+
+ 0.1.1
+ Added instanceof and typeof as operators.
+
+
+
+ 0.1.0
+ Initial CoffeeScript release.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node_modules/jade/support/coffee-script/lib/browser.js b/node_modules/jade/support/coffee-script/lib/browser.js
new file mode 100644
index 0000000..c35d5fe
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/browser.js
@@ -0,0 +1,46 @@
+(function() {
+ var CoffeeScript, runScripts;
+ CoffeeScript = require('./coffee-script');
+ CoffeeScript.require = require;
+ CoffeeScript.eval = function(code, options) {
+ return eval(CoffeeScript.compile(code, options));
+ };
+ CoffeeScript.run = function(code, options) {
+ ((options != null) ? (options.bare = true) : undefined);
+ return Function(CoffeeScript.compile(code, options))();
+ };
+ if (!(typeof window !== "undefined" && window !== null)) {
+ return;
+ }
+ CoffeeScript.load = function(url, options) {
+ var xhr;
+ xhr = new (window.ActiveXObject || XMLHttpRequest)('Microsoft.XMLHTTP');
+ xhr.open('GET', url, true);
+ if ('overrideMimeType' in xhr) {
+ xhr.overrideMimeType('text/plain');
+ }
+ xhr.onreadystatechange = function() {
+ return xhr.readyState === 4 ? CoffeeScript.run(xhr.responseText, options) : undefined;
+ };
+ return xhr.send(null);
+ };
+ runScripts = function() {
+ var _i, _j, _len, _ref, script;
+ for (_i = 0, _len = (_ref = document.getElementsByTagName('script')).length; _i < _len; _i++) {
+ (function() {
+ var script = _ref[_i];
+ _j = script;
+ return script.type === 'text/coffeescript' ? (script.src ? CoffeeScript.load(script.src) : setTimeout(function() {
+ return CoffeeScript.run(script.innerHTML);
+ })) : undefined;
+ })();
+ script = _j;
+ }
+ return null;
+ };
+ if (window.addEventListener) {
+ addEventListener('DOMContentLoaded', runScripts, false);
+ } else {
+ attachEvent('onload', runScripts);
+ }
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/cake.js b/node_modules/jade/support/coffee-script/lib/cake.js
new file mode 100755
index 0000000..770a648
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/cake.js
@@ -0,0 +1,73 @@
+(function() {
+ var CoffeeScript, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks;
+ fs = require('fs');
+ path = require('path');
+ helpers = require('./helpers');
+ optparse = require('./optparse');
+ CoffeeScript = require('./coffee-script');
+ tasks = {};
+ options = {};
+ switches = [];
+ oparse = null;
+ helpers.extend(global, {
+ task: function(name, description, action) {
+ var _ref;
+ if (!action) {
+ _ref = [description, action], action = _ref[0], description = _ref[1];
+ }
+ return (tasks[name] = {
+ name: name,
+ description: description,
+ action: action
+ });
+ },
+ option: function(letter, flag, description) {
+ return switches.push([letter, flag, description]);
+ },
+ invoke: function(name) {
+ if (!tasks[name]) {
+ missingTask(name);
+ }
+ return tasks[name].action(options);
+ }
+ });
+ exports.run = function() {
+ return path.exists('Cakefile', function(exists) {
+ var _i, _len, _ref, _result, arg, args;
+ if (!exists) {
+ throw new Error("Cakefile not found in " + (process.cwd()));
+ }
+ args = process.argv.slice(2);
+ CoffeeScript.run(fs.readFileSync('Cakefile').toString(), {
+ fileName: 'Cakefile'
+ });
+ oparse = new optparse.OptionParser(switches);
+ if (!args.length) {
+ return printTasks();
+ }
+ options = oparse.parse(args);
+ _result = [];
+ for (_i = 0, _len = (_ref = options.arguments).length; _i < _len; _i++) {
+ arg = _ref[_i];
+ _result.push(invoke(arg));
+ }
+ return _result;
+ });
+ };
+ printTasks = function() {
+ var _ref, desc, name, spaces, task;
+ puts('');
+ for (name in _ref = tasks) {
+ task = _ref[name];
+ spaces = 20 - name.length;
+ spaces = spaces > 0 ? Array(spaces + 1).join(' ') : '';
+ desc = task.description ? ("# " + (task.description)) : '';
+ puts("cake " + name + spaces + " " + desc);
+ }
+ return switches.length ? puts(oparse.help()) : undefined;
+ };
+ missingTask = function(task) {
+ puts("No such task: \"" + task + "\"");
+ return process.exit(1);
+ };
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/coffee-script.js b/node_modules/jade/support/coffee-script/lib/coffee-script.js
new file mode 100755
index 0000000..7bd422c
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/coffee-script.js
@@ -0,0 +1,74 @@
+(function() {
+ var Lexer, compile, fs, lexer, parser, path;
+ path = require('path');
+ Lexer = require('./lexer').Lexer;
+ parser = require('./parser').parser;
+ if (require.extensions) {
+ fs = require('fs');
+ require.extensions['.coffee'] = function(module, filename) {
+ var content;
+ content = compile(fs.readFileSync(filename, 'utf8'));
+ return module._compile(content, filename);
+ };
+ } else if (require.registerExtension) {
+ require.registerExtension('.coffee', function(content) {
+ return compile(content);
+ });
+ }
+ exports.VERSION = '0.9.4';
+ exports.helpers = require('./helpers');
+ exports.compile = (compile = function(code, options) {
+ options || (options = {});
+ try {
+ return (parser.parse(lexer.tokenize(code))).compile(options);
+ } catch (err) {
+ if (options.fileName) {
+ err.message = ("In " + (options.fileName) + ", " + (err.message));
+ }
+ throw err;
+ }
+ });
+ exports.tokens = function(code, options) {
+ return lexer.tokenize(code, options);
+ };
+ exports.nodes = function(code, options) {
+ return parser.parse(lexer.tokenize(code, options));
+ };
+ exports.run = function(code, options) {
+ var root;
+ root = module;
+ while (root.parent) {
+ root = root.parent;
+ }
+ root.filename = options.fileName;
+ if (root.moduleCache) {
+ root.moduleCache = {};
+ }
+ return path.extname(root.filename) !== '.coffee' || require.extensions ? root._compile(exports.compile(code, options), root.filename) : root._compile(code, root.filename);
+ };
+ exports.eval = function(code, options) {
+ var __dirname, __filename;
+ __filename = options.fileName;
+ __dirname = path.dirname(__filename);
+ return eval(exports.compile(code, options));
+ };
+ lexer = new Lexer;
+ parser.lexer = {
+ lex: function() {
+ var token;
+ token = this.tokens[this.pos] || [""];
+ this.pos += 1;
+ this.yylineno = token[2];
+ this.yytext = token[1];
+ return token[0];
+ },
+ setInput: function(tokens) {
+ this.tokens = tokens;
+ return (this.pos = 0);
+ },
+ upcomingInput: function() {
+ return "";
+ }
+ };
+ parser.yy = require('./nodes');
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/command.js b/node_modules/jade/support/coffee-script/lib/command.js
new file mode 100644
index 0000000..58a2774
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/command.js
@@ -0,0 +1,227 @@
+(function() {
+ var BANNER, CoffeeScript, EventEmitter, SWITCHES, _ref, compileOptions, compileScript, compileScripts, compileStdio, exec, fs, helpers, lint, optionParser, optparse, opts, parseOptions, path, printTokens, sources, spawn, usage, version, watch, writeJs;
+ fs = require('fs');
+ path = require('path');
+ optparse = require('./optparse');
+ CoffeeScript = require('./coffee-script');
+ helpers = require('./helpers');
+ _ref = require('child_process'), spawn = _ref.spawn, exec = _ref.exec;
+ EventEmitter = require('events').EventEmitter;
+ helpers.extend(CoffeeScript, new EventEmitter);
+ global.CoffeeScript = CoffeeScript;
+ BANNER = 'coffee compiles CoffeeScript source files into JavaScript.\n\nUsage:\n coffee path/to/script.coffee';
+ SWITCHES = [['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-o', '--output [DIR]', 'set the directory for compiled JavaScript'], ['-w', '--watch', 'watch scripts for changes, and recompile'], ['-p', '--print', 'print the compiled JavaScript to stdout'], ['-l', '--lint', 'pipe the compiled JavaScript through JSLint'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-e', '--eval', 'compile a string from the command line'], ['-r', '--require [FILE*]', 'require a library before executing your script'], ['-b', '--bare', 'compile without the top-level function wrapper'], ['-t', '--tokens', 'print the tokens that the lexer produces'], ['-n', '--nodes', 'print the parse tree that Jison produces'], ['-v', '--version', 'display CoffeeScript version'], ['-h', '--help', 'display this help message']];
+ opts = {};
+ sources = [];
+ optionParser = null;
+ exports.run = function() {
+ var flags, separator;
+ parseOptions();
+ if (opts.help) {
+ return usage();
+ }
+ if (opts.version) {
+ return version();
+ }
+ if (opts.interactive) {
+ return require('./repl');
+ }
+ if (opts.stdio) {
+ return compileStdio();
+ }
+ if (opts.eval) {
+ return compileScript('console', sources[0]);
+ }
+ if (!sources.length) {
+ return require('./repl');
+ }
+ separator = sources.indexOf('--');
+ flags = [];
+ if (separator >= 0) {
+ flags = sources.splice(separator + 1);
+ sources.pop();
+ }
+ if (opts.run) {
+ flags = sources.splice(1).concat(flags);
+ }
+ process.ARGV = (process.argv = flags);
+ return compileScripts();
+ };
+ compileScripts = function() {
+ var _i, _j, _len, _ref2, _result, base, compile, source;
+ _result = [];
+ for (_i = 0, _len = (_ref2 = sources).length; _i < _len; _i++) {
+ (function() {
+ var source = _ref2[_i];
+ _j = source;
+ return _result.push((function() {
+ base = source;
+ compile = function(source, topLevel) {
+ return path.exists(source, function(exists) {
+ if (!exists) {
+ throw new Error("File not found: " + source);
+ }
+ return fs.stat(source, function(err, stats) {
+ if (stats.isDirectory()) {
+ return fs.readdir(source, function(err, files) {
+ var _k, _len2, _result2, file;
+ _result2 = [];
+ for (_k = 0, _len2 = files.length; _k < _len2; _k++) {
+ file = files[_k];
+ _result2.push(compile(path.join(source, file)));
+ }
+ return _result2;
+ });
+ } else if (topLevel || path.extname(source) === '.coffee') {
+ fs.readFile(source, function(err, code) {
+ return compileScript(source, code.toString(), base);
+ });
+ return opts.watch ? watch(source, base) : undefined;
+ }
+ });
+ });
+ };
+ return compile(source, true);
+ })());
+ })();
+ source = _j;
+ }
+ return _result;
+ };
+ compileScript = function(file, input, base) {
+ var _i, _len, _ref2, o, options, req, t, task;
+ o = opts;
+ options = compileOptions(file);
+ if (o.require) {
+ for (_i = 0, _len = (_ref2 = o.require).length; _i < _len; _i++) {
+ req = _ref2[_i];
+ require(helpers.starts(req, '.') ? fs.realpathSync(req) : req);
+ }
+ }
+ try {
+ t = (task = {
+ file: file,
+ input: input,
+ options: options
+ });
+ CoffeeScript.emit('compile', task);
+ if (o.tokens) {
+ return printTokens(CoffeeScript.tokens(t.input));
+ } else if (o.nodes) {
+ return puts(CoffeeScript.nodes(t.input).toString().trim());
+ } else if (o.run) {
+ return CoffeeScript.run(t.input, t.options);
+ } else {
+ t.output = CoffeeScript.compile(t.input, t.options);
+ CoffeeScript.emit('success', task);
+ return o.print ? print(t.output) : (o.compile ? writeJs(t.file, t.output, base) : (o.lint ? lint(t.output) : undefined));
+ }
+ } catch (err) {
+ CoffeeScript.emit('failure', err, task);
+ if (CoffeeScript.listeners('failure').length) {
+ return;
+ }
+ if (o.watch) {
+ return puts(err.message);
+ }
+ error(err.stack);
+ return process.exit(1);
+ }
+ };
+ compileStdio = function() {
+ var code, stdin;
+ code = '';
+ stdin = process.openStdin();
+ stdin.on('data', function(buffer) {
+ return buffer ? code += buffer.toString() : undefined;
+ });
+ return stdin.on('end', function() {
+ return compileScript('stdio', code);
+ });
+ };
+ watch = function(source, base) {
+ return fs.watchFile(source, {
+ persistent: true,
+ interval: 500
+ }, function(curr, prev) {
+ if (curr.size === prev.size && curr.mtime.getTime() === prev.mtime.getTime()) {
+ return;
+ }
+ return fs.readFile(source, function(err, code) {
+ if (err) {
+ throw err;
+ }
+ return compileScript(source, code.toString(), base);
+ });
+ });
+ };
+ writeJs = function(source, js, base) {
+ var baseDir, compile, dir, filename, jsPath, srcDir;
+ filename = path.basename(source, path.extname(source)) + '.js';
+ srcDir = path.dirname(source);
+ baseDir = srcDir.substring(base.length);
+ dir = opts.output ? path.join(opts.output, baseDir) : srcDir;
+ jsPath = path.join(dir, filename);
+ compile = function() {
+ if (js.length <= 0) {
+ js = ' ';
+ }
+ return fs.writeFile(jsPath, js, function(err) {
+ return opts.compile && opts.watch ? puts("Compiled " + source) : undefined;
+ });
+ };
+ return path.exists(dir, function(exists) {
+ return exists ? compile() : exec("mkdir -p " + dir, compile);
+ });
+ };
+ lint = function(js) {
+ var conf, jsl, printIt;
+ printIt = function(buffer) {
+ return puts(buffer.toString().trim());
+ };
+ conf = __dirname + '/../extras/jsl.conf';
+ jsl = spawn('jsl', ['-nologo', '-stdin', '-conf', conf]);
+ jsl.stdout.on('data', printIt);
+ jsl.stderr.on('data', printIt);
+ jsl.stdin.write(js);
+ return jsl.stdin.end();
+ };
+ printTokens = function(tokens) {
+ var _i, _len, _ref2, _result, strings, tag, token, value;
+ strings = (function() {
+ _result = [];
+ for (_i = 0, _len = tokens.length; _i < _len; _i++) {
+ token = tokens[_i];
+ _result.push((function() {
+ _ref2 = [token[0], token[1].toString().replace(/\n/, '\\n')], tag = _ref2[0], value = _ref2[1];
+ return "[" + tag + " " + value + "]";
+ })());
+ }
+ return _result;
+ })();
+ return puts(strings.join(' '));
+ };
+ parseOptions = function() {
+ var o;
+ optionParser = new optparse.OptionParser(SWITCHES, BANNER);
+ o = (opts = optionParser.parse(process.argv.slice(2)));
+ o.compile || (o.compile = !!o.output);
+ o.run = !(o.compile || o.print || o.lint);
+ o.print = !!(o.print || (o.eval || o.stdio && o.compile));
+ return (sources = o.arguments);
+ };
+ compileOptions = function(fileName) {
+ return {
+ fileName: fileName,
+ bare: opts.bare
+ };
+ };
+ usage = function() {
+ puts(optionParser.help());
+ return process.exit(0);
+ };
+ version = function() {
+ puts("CoffeeScript version " + (CoffeeScript.VERSION));
+ return process.exit(0);
+ };
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/grammar.js b/node_modules/jade/support/coffee-script/lib/grammar.js
new file mode 100644
index 0000000..e038a74
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/grammar.js
@@ -0,0 +1,622 @@
+(function() {
+ var Parser, _i, _j, _len, _len2, _ref, _result, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;
+ var __hasProp = Object.prototype.hasOwnProperty;
+ Parser = require('jison').Parser;
+ unwrap = /function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/;
+ o = function(patternString, action, options) {
+ var match;
+ if (!action) {
+ return [patternString, '$$ = $1;', options];
+ }
+ action = (match = (action + '').match(unwrap)) ? match[1] : ("(" + action + "())");
+ action = action.replace(/\bnew (\w+)\b/g, 'new yy.$1').replace(/Expressions\.wrap/g, 'yy.Expressions.wrap');
+ return [patternString, ("$$ = " + action + ";"), options];
+ };
+ grammar = {
+ Root: [
+ o("", function() {
+ return new Expressions;
+ }), o("TERMINATOR", function() {
+ return new Expressions;
+ }), o("Body"), o("Block TERMINATOR")
+ ],
+ Body: [
+ o("Line", function() {
+ return Expressions.wrap([$1]);
+ }), o("Body TERMINATOR Line", function() {
+ return $1.push($3);
+ }), o("Body TERMINATOR")
+ ],
+ Line: [o("Expression"), o("Statement")],
+ Statement: [
+ o("Return"), o("Throw"), o("BREAK", function() {
+ return new Literal($1);
+ }), o("CONTINUE", function() {
+ return new Literal($1);
+ }), o("DEBUGGER", function() {
+ return new Literal($1);
+ })
+ ],
+ Expression: [o("Value"), o("Invocation"), o("Code"), o("Operation"), o("Assign"), o("If"), o("Try"), o("While"), o("For"), o("Switch"), o("Extends"), o("Class"), o("Existence"), o("Comment")],
+ Block: [
+ o("INDENT Body OUTDENT", function() {
+ return $2;
+ }), o("INDENT OUTDENT", function() {
+ return new Expressions;
+ }), o("TERMINATOR Comment", function() {
+ return Expressions.wrap([$2]);
+ })
+ ],
+ Identifier: [
+ o("IDENTIFIER", function() {
+ return new Literal($1);
+ })
+ ],
+ AlphaNumeric: [
+ o("NUMBER", function() {
+ return new Literal($1);
+ }), o("STRING", function() {
+ return new Literal($1);
+ })
+ ],
+ Literal: [
+ o("AlphaNumeric"), o("JS", function() {
+ return new Literal($1);
+ }), o("REGEX", function() {
+ return new Literal($1);
+ }), o("BOOL", function() {
+ return new Literal($1);
+ })
+ ],
+ Assign: [
+ o("Assignable = Expression", function() {
+ return new Assign($1, $3);
+ }), o("Assignable = INDENT Expression OUTDENT", function() {
+ return new Assign($1, $4);
+ })
+ ],
+ AssignObj: [
+ o("Identifier", function() {
+ return new Value($1);
+ }), o("AlphaNumeric"), o("ThisProperty"), o("Identifier : Expression", function() {
+ return new Assign(new Value($1), $3, 'object');
+ }), o("AlphaNumeric : Expression", function() {
+ return new Assign(new Value($1), $3, 'object');
+ }), o("Identifier : INDENT Expression OUTDENT", function() {
+ return new Assign(new Value($1), $4, 'object');
+ }), o("AlphaNumeric : INDENT Expression OUTDENT", function() {
+ return new Assign(new Value($1), $4, 'object');
+ }), o("Comment")
+ ],
+ Return: [
+ o("RETURN Expression", function() {
+ return new Return($2);
+ }), o("RETURN", function() {
+ return new Return;
+ })
+ ],
+ Comment: [
+ o("HERECOMMENT", function() {
+ return new Comment($1);
+ })
+ ],
+ Existence: [
+ o("Expression ?", function() {
+ return new Existence($1);
+ })
+ ],
+ Code: [
+ o("PARAM_START ParamList PARAM_END FuncGlyph Block", function() {
+ return new Code($2, $5, $4);
+ }), o("FuncGlyph Block", function() {
+ return new Code([], $2, $1);
+ })
+ ],
+ FuncGlyph: [
+ o("->", function() {
+ return 'func';
+ }), o("=>", function() {
+ return 'boundfunc';
+ })
+ ],
+ OptComma: [o(''), o(',')],
+ ParamList: [
+ o("", function() {
+ return [];
+ }), o("Param", function() {
+ return [$1];
+ }), o("ParamList , Param", function() {
+ return $1.concat($3);
+ })
+ ],
+ Param: [
+ o("PARAM", function() {
+ return new Literal($1);
+ }), o("@ PARAM", function() {
+ return new Param($2, true);
+ }), o("PARAM ...", function() {
+ return new Param($1, false, true);
+ }), o("@ PARAM ...", function() {
+ return new Param($2, true, true);
+ })
+ ],
+ Splat: [
+ o("Expression ...", function() {
+ return new Splat($1);
+ })
+ ],
+ SimpleAssignable: [
+ o("Identifier", function() {
+ return new Value($1);
+ }), o("Value Accessor", function() {
+ return $1.push($2);
+ }), o("Invocation Accessor", function() {
+ return new Value($1, [$2]);
+ }), o("ThisProperty")
+ ],
+ Assignable: [
+ o("SimpleAssignable"), o("Array", function() {
+ return new Value($1);
+ }), o("Object", function() {
+ return new Value($1);
+ })
+ ],
+ Value: [
+ o("Assignable"), o("Literal", function() {
+ return new Value($1);
+ }), o("Parenthetical", function() {
+ return new Value($1);
+ }), o("Range", function() {
+ return new Value($1);
+ }), o("This")
+ ],
+ Accessor: [
+ o("PROPERTY_ACCESS Identifier", function() {
+ return new Accessor($2);
+ }), o("PROTOTYPE_ACCESS Identifier", function() {
+ return new Accessor($2, 'prototype');
+ }), o("::", function() {
+ return new Accessor(new Literal('prototype'));
+ }), o("SOAK_ACCESS Identifier", function() {
+ return new Accessor($2, 'soak');
+ }), o("Index"), o("Slice", function() {
+ return new Slice($1);
+ })
+ ],
+ Index: [
+ o("INDEX_START Expression INDEX_END", function() {
+ return new Index($2);
+ }), o("INDEX_SOAK Index", function() {
+ $2.soakNode = true;
+ return $2;
+ }), o("INDEX_PROTO Index", function() {
+ $2.proto = true;
+ return $2;
+ })
+ ],
+ Object: [
+ o("{ AssignList OptComma }", function() {
+ return new ObjectLiteral($2);
+ })
+ ],
+ AssignList: [
+ o("", function() {
+ return [];
+ }), o("AssignObj", function() {
+ return [$1];
+ }), o("AssignList , AssignObj", function() {
+ return $1.concat($3);
+ }), o("AssignList OptComma TERMINATOR AssignObj", function() {
+ return $1.concat($4);
+ }), o("AssignList OptComma INDENT AssignList OptComma OUTDENT", function() {
+ return $1.concat($4);
+ })
+ ],
+ Class: [
+ o("CLASS SimpleAssignable", function() {
+ return new Class($2);
+ }), o("CLASS SimpleAssignable EXTENDS Value", function() {
+ return new Class($2, $4);
+ }), o("CLASS SimpleAssignable INDENT ClassBody OUTDENT", function() {
+ return new Class($2, null, $4);
+ }), o("CLASS SimpleAssignable EXTENDS Value INDENT ClassBody OUTDENT", function() {
+ return new Class($2, $4, $6);
+ }), o("CLASS INDENT ClassBody OUTDENT", function() {
+ return new Class('__temp__', null, $3);
+ }), o("CLASS", function() {
+ return new Class('__temp__', null, new Expressions);
+ }), o("CLASS EXTENDS Value", function() {
+ return new Class('__temp__', $3, new Expressions);
+ }), o("CLASS EXTENDS Value INDENT ClassBody OUTDENT", function() {
+ return new Class('__temp__', $3, $5);
+ })
+ ],
+ ClassAssign: [
+ o("AssignObj", function() {
+ return $1;
+ }), o("ThisProperty : Expression", function() {
+ return new Assign(new Value($1), $3, 'this');
+ }), o("ThisProperty : INDENT Expression OUTDENT", function() {
+ return new Assign(new Value($1), $4, 'this');
+ })
+ ],
+ ClassBody: [
+ o("", function() {
+ return [];
+ }), o("ClassAssign", function() {
+ return [$1];
+ }), o("ClassBody TERMINATOR ClassAssign", function() {
+ return $1.concat($3);
+ }), o("{ ClassBody }", function() {
+ return $2;
+ })
+ ],
+ Extends: [
+ o("SimpleAssignable EXTENDS Value", function() {
+ return new Extends($1, $3);
+ })
+ ],
+ Invocation: [
+ o("Value OptFuncExist Arguments", function() {
+ return new Call($1, $3, $2);
+ }), o("Invocation OptFuncExist Arguments", function() {
+ return new Call($1, $3, $2);
+ }), o("SUPER", function() {
+ return new Call('super', [new Splat(new Literal('arguments'))]);
+ }), o("SUPER Arguments", function() {
+ return new Call('super', $2);
+ })
+ ],
+ OptFuncExist: [
+ o("", function() {
+ return false;
+ }), o("FUNC_EXIST", function() {
+ return true;
+ })
+ ],
+ Arguments: [
+ o("CALL_START CALL_END", function() {
+ return [];
+ }), o("CALL_START ArgList OptComma CALL_END", function() {
+ return $2;
+ })
+ ],
+ This: [
+ o("THIS", function() {
+ return new Value(new Literal('this'));
+ }), o("@", function() {
+ return new Value(new Literal('this'));
+ })
+ ],
+ RangeDots: [
+ o("..", function() {
+ return 'inclusive';
+ }), o("...", function() {
+ return 'exclusive';
+ })
+ ],
+ ThisProperty: [
+ o("@ Identifier", function() {
+ return new Value(new Literal('this'), [new Accessor($2)], 'this');
+ })
+ ],
+ Range: [
+ o("[ Expression RangeDots Expression ]", function() {
+ return new Range($2, $4, $3);
+ })
+ ],
+ Slice: [
+ o("INDEX_START Expression RangeDots Expression INDEX_END", function() {
+ return new Range($2, $4, $3);
+ }), o("INDEX_START Expression RangeDots INDEX_END", function() {
+ return new Range($2, null, $3);
+ }), o("INDEX_START RangeDots Expression INDEX_END", function() {
+ return new Range(null, $3, $2);
+ })
+ ],
+ Array: [
+ o("[ ]", function() {
+ return new ArrayLiteral([]);
+ }), o("[ ArgList OptComma ]", function() {
+ return new ArrayLiteral($2);
+ })
+ ],
+ ArgList: [
+ o("Arg", function() {
+ return [$1];
+ }), o("ArgList , Arg", function() {
+ return $1.concat($3);
+ }), o("ArgList OptComma TERMINATOR Arg", function() {
+ return $1.concat($4);
+ }), o("INDENT ArgList OptComma OUTDENT", function() {
+ return $2;
+ }), o("ArgList OptComma INDENT ArgList OptComma OUTDENT", function() {
+ return $1.concat($4);
+ })
+ ],
+ Arg: [o("Expression"), o("Splat")],
+ SimpleArgs: [
+ o("Expression"), o("SimpleArgs , Expression", function() {
+ return [].concat($1, $3);
+ })
+ ],
+ Try: [
+ o("TRY Block", function() {
+ return new Try($2);
+ }), o("TRY Block Catch", function() {
+ return new Try($2, $3[0], $3[1]);
+ }), o("TRY Block FINALLY Block", function() {
+ return new Try($2, null, null, $4);
+ }), o("TRY Block Catch FINALLY Block", function() {
+ return new Try($2, $3[0], $3[1], $5);
+ })
+ ],
+ Catch: [
+ o("CATCH Identifier Block", function() {
+ return [$2, $3];
+ })
+ ],
+ Throw: [
+ o("THROW Expression", function() {
+ return new Throw($2);
+ })
+ ],
+ Parenthetical: [
+ o("( Expression )", function() {
+ return new Parens($2);
+ }), o("( )", function() {
+ return new Parens(new Literal(''));
+ })
+ ],
+ WhileSource: [
+ o("WHILE Expression", function() {
+ return new While($2);
+ }), o("WHILE Expression WHEN Expression", function() {
+ return new While($2, {
+ guard: $4
+ });
+ }), o("UNTIL Expression", function() {
+ return new While($2, {
+ invert: true
+ });
+ }), o("UNTIL Expression WHEN Expression", function() {
+ return new While($2, {
+ invert: true,
+ guard: $4
+ });
+ })
+ ],
+ While: [
+ o("WhileSource Block", function() {
+ return $1.addBody($2);
+ }), o("Statement WhileSource", function() {
+ return $2.addBody(Expressions.wrap([$1]));
+ }), o("Expression WhileSource", function() {
+ return $2.addBody(Expressions.wrap([$1]));
+ }), o("Loop", function() {
+ return $1;
+ })
+ ],
+ Loop: [
+ o("LOOP Block", function() {
+ return new While(new Literal('true')).addBody($2);
+ }), o("LOOP Expression", function() {
+ return new While(new Literal('true')).addBody(Expressions.wrap([$2]));
+ })
+ ],
+ For: [
+ o("Statement ForBody", function() {
+ return new For($1, $2, $2.vars[0], $2.vars[1]);
+ }), o("Expression ForBody", function() {
+ return new For($1, $2, $2.vars[0], $2.vars[1]);
+ }), o("ForBody Block", function() {
+ return new For($2, $1, $1.vars[0], $1.vars[1]);
+ })
+ ],
+ ForBody: [
+ o("FOR Range", function() {
+ return {
+ source: new Value($2),
+ vars: []
+ };
+ }), o("ForStart ForSource", function() {
+ $2.raw = $1.raw;
+ $2.vars = $1;
+ return $2;
+ })
+ ],
+ ForStart: [
+ o("FOR ForVariables", function() {
+ return $2;
+ }), o("FOR ALL ForVariables", function() {
+ $3.raw = true;
+ return $3;
+ })
+ ],
+ ForValue: [
+ o("Identifier"), o("Array", function() {
+ return new Value($1);
+ }), o("Object", function() {
+ return new Value($1);
+ })
+ ],
+ ForVariables: [
+ o("ForValue", function() {
+ return [$1];
+ }), o("ForValue , ForValue", function() {
+ return [$1, $3];
+ })
+ ],
+ ForSource: [
+ o("FORIN Expression", function() {
+ return {
+ source: $2
+ };
+ }), o("FOROF Expression", function() {
+ return {
+ source: $2,
+ object: true
+ };
+ }), o("FORIN Expression WHEN Expression", function() {
+ return {
+ source: $2,
+ guard: $4
+ };
+ }), o("FOROF Expression WHEN Expression", function() {
+ return {
+ source: $2,
+ guard: $4,
+ object: true
+ };
+ }), o("FORIN Expression BY Expression", function() {
+ return {
+ source: $2,
+ step: $4
+ };
+ }), o("FORIN Expression WHEN Expression BY Expression", function() {
+ return {
+ source: $2,
+ guard: $4,
+ step: $6
+ };
+ }), o("FORIN Expression BY Expression WHEN Expression", function() {
+ return {
+ source: $2,
+ step: $4,
+ guard: $6
+ };
+ })
+ ],
+ Switch: [
+ o("SWITCH Expression INDENT Whens OUTDENT", function() {
+ return new Switch($2, $4);
+ }), o("SWITCH Expression INDENT Whens ELSE Block OUTDENT", function() {
+ return new Switch($2, $4, $6);
+ }), o("SWITCH INDENT Whens OUTDENT", function() {
+ return new Switch(null, $3);
+ }), o("SWITCH INDENT Whens ELSE Block OUTDENT", function() {
+ return new Switch(null, $3, $5);
+ })
+ ],
+ Whens: [
+ o("When"), o("Whens When", function() {
+ return $1.concat($2);
+ })
+ ],
+ When: [
+ o("LEADING_WHEN SimpleArgs Block", function() {
+ return [[$2, $3]];
+ }), o("LEADING_WHEN SimpleArgs Block TERMINATOR", function() {
+ return [[$2, $3]];
+ })
+ ],
+ IfBlock: [
+ o("IF Expression Block", function() {
+ return new If($2, $3);
+ }), o("UNLESS Expression Block", function() {
+ return new If($2, $3, {
+ invert: true
+ });
+ }), o("IfBlock ELSE IF Expression Block", function() {
+ return $1.addElse(new If($4, $5));
+ }), o("IfBlock ELSE Block", function() {
+ return $1.addElse($3);
+ })
+ ],
+ If: [
+ o("IfBlock"), o("Statement POST_IF Expression", function() {
+ return new If($3, Expressions.wrap([$1]), {
+ statement: true
+ });
+ }), o("Expression POST_IF Expression", function() {
+ return new If($3, Expressions.wrap([$1]), {
+ statement: true
+ });
+ }), o("Statement POST_UNLESS Expression", function() {
+ return new If($3, Expressions.wrap([$1]), {
+ statement: true,
+ invert: true
+ });
+ }), o("Expression POST_UNLESS Expression", function() {
+ return new If($3, Expressions.wrap([$1]), {
+ statement: true,
+ invert: true
+ });
+ })
+ ],
+ Operation: [
+ o("UNARY Expression", function() {
+ return new Op($1, $2);
+ }), o("- Expression", function() {
+ return new Op('-', $2);
+ }, {
+ prec: 'UNARY'
+ }), o("+ Expression", function() {
+ return new Op('+', $2);
+ }, {
+ prec: 'UNARY'
+ }), o("-- SimpleAssignable", function() {
+ return new Op('--', $2);
+ }), o("++ SimpleAssignable", function() {
+ return new Op('++', $2);
+ }), o("SimpleAssignable --", function() {
+ return new Op('--', $1, null, true);
+ }), o("SimpleAssignable ++", function() {
+ return new Op('++', $1, null, true);
+ }), o("Expression + Expression", function() {
+ return new Op('+', $1, $3);
+ }), o("Expression - Expression", function() {
+ return new Op('-', $1, $3);
+ }), o("Expression == Expression", function() {
+ return new Op('==', $1, $3);
+ }), o("Expression != Expression", function() {
+ return new Op('!=', $1, $3);
+ }), o("Expression MATH Expression", function() {
+ return new Op($2, $1, $3);
+ }), o("Expression SHIFT Expression", function() {
+ return new Op($2, $1, $3);
+ }), o("Expression COMPARE Expression", function() {
+ return new Op($2, $1, $3);
+ }), o("Expression LOGIC Expression", function() {
+ return new Op($2, $1, $3);
+ }), o("SimpleAssignable COMPOUND_ASSIGN Expression", function() {
+ return new Op($2, $1, $3);
+ }), o("SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT", function() {
+ return new Op($2, $1, $4);
+ }), o("Expression RELATION Expression", function() {
+ return $2.charAt(0) === '!' ? ($2 === '!in' ? new Op('!', new In($1, $3)) : new Op('!', new Parens(new Op($2.slice(1), $1, $3)))) : ($2 === 'in' ? new In($1, $3) : new Op($2, $1, $3));
+ })
+ ]
+ };
+ operators = [["left", 'CALL_START', 'CALL_END'], ["nonassoc", '++', '--'], ["left", '?'], ["right", 'UNARY'], ["left", 'MATH'], ["left", '+', '-'], ["left", 'SHIFT'], ["left", 'COMPARE'], ["left", 'RELATION'], ["left", '==', '!='], ["left", 'LOGIC'], ["right", 'COMPOUND_ASSIGN'], ["left", '.'], ["nonassoc", 'INDENT', 'OUTDENT'], ["right", 'WHEN', 'LEADING_WHEN', 'FORIN', 'FOROF', 'BY', 'THROW'], ["right", 'IF', 'UNLESS', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'EXTENDS'], ["right", '=', ':', 'RETURN'], ["right", '->', '=>', 'UNLESS', 'POST_IF', 'POST_UNLESS']];
+ tokens = [];
+ for (name in grammar) {
+ if (!__hasProp.call(grammar, name)) continue;
+ alternatives = grammar[name];
+ grammar[name] = (function() {
+ _result = [];
+ for (_i = 0, _len = alternatives.length; _i < _len; _i++) {
+ alt = alternatives[_i];
+ _result.push((function() {
+ for (_j = 0, _len2 = (_ref = alt[0].split(' ')).length; _j < _len2; _j++) {
+ token = _ref[_j];
+ if (!grammar[token]) {
+ tokens.push(token);
+ }
+ }
+ if (name === 'Root') {
+ alt[1] = ("return " + (alt[1]));
+ }
+ return alt;
+ })());
+ }
+ return _result;
+ })();
+ }
+ exports.parser = new Parser({
+ tokens: tokens.join(' '),
+ bnf: grammar,
+ operators: operators.reverse(),
+ startSymbol: 'Root'
+ });
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/helpers.js b/node_modules/jade/support/coffee-script/lib/helpers.js
new file mode 100644
index 0000000..5983bf6
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/helpers.js
@@ -0,0 +1,78 @@
+(function() {
+ var extend, flatten, indexOf;
+ indexOf = (exports.indexOf = Array.indexOf || (Array.prototype.indexOf ? function(array, item, from) {
+ return array.indexOf(item, from);
+ } : function(array, item, from) {
+ var _len, index, other;
+ for (index = 0, _len = array.length; index < _len; index++) {
+ other = array[index];
+ if (other === item && (!from || (from <= index))) {
+ return index;
+ }
+ }
+ return -1;
+ }));
+ exports.include = function(list, value) {
+ return indexOf(list, value) >= 0;
+ };
+ exports.starts = function(string, literal, start) {
+ return literal === string.substr(start, literal.length);
+ };
+ exports.ends = function(string, literal, back) {
+ var len;
+ len = literal.length;
+ return literal === string.substr(string.length - len - (back || 0), len);
+ };
+ exports.compact = function(array) {
+ var _i, _len, _result, item;
+ _result = [];
+ for (_i = 0, _len = array.length; _i < _len; _i++) {
+ item = array[_i];
+ if (item) {
+ _result.push(item);
+ }
+ }
+ return _result;
+ };
+ exports.count = function(string, letter) {
+ var num, pos;
+ num = (pos = 0);
+ while (pos = 1 + string.indexOf(letter, pos)) {
+ num++;
+ }
+ return num;
+ };
+ exports.merge = function(options, overrides) {
+ return extend(extend({}, options), overrides);
+ };
+ extend = (exports.extend = function(object, properties) {
+ var key, val;
+ for (key in properties) {
+ val = properties[key];
+ object[key] = val;
+ }
+ return object;
+ });
+ exports.flatten = (flatten = function(array) {
+ var _i, _len, element, flattened;
+ flattened = [];
+ for (_i = 0, _len = array.length; _i < _len; _i++) {
+ element = array[_i];
+ if (element instanceof Array) {
+ flattened = flattened.concat(flatten(element));
+ } else {
+ flattened.push(element);
+ }
+ }
+ return flattened;
+ });
+ exports.del = function(obj, key) {
+ var val;
+ val = obj[key];
+ delete obj[key];
+ return val;
+ };
+ exports.last = function(array, back) {
+ return array[array.length - (back || 0) - 1];
+ };
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/index.js b/node_modules/jade/support/coffee-script/lib/index.js
new file mode 100644
index 0000000..dc5ab13
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/index.js
@@ -0,0 +1,9 @@
+(function() {
+ var _ref, key, val;
+ var __hasProp = Object.prototype.hasOwnProperty;
+ for (key in _ref = require('./coffee-script')) {
+ if (!__hasProp.call(_ref, key)) continue;
+ val = _ref[key];
+ (exports[key] = val);
+ }
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/lexer.js b/node_modules/jade/support/coffee-script/lib/lexer.js
new file mode 100644
index 0000000..ce25616
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/lexer.js
@@ -0,0 +1,638 @@
+(function() {
+ var ASSIGNED, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LEADING_SPACES, LINE_BREAK, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NEXT_CHARACTER, NEXT_ELLIPSIS, NOT_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, TRAILING_SPACES, UNARY, WHITESPACE, _ref, compact, count, include, last, op, starts;
+ Rewriter = require('./rewriter').Rewriter;
+ _ref = require('./helpers'), include = _ref.include, count = _ref.count, starts = _ref.starts, compact = _ref.compact, last = _ref.last;
+ exports.Lexer = (function() {
+ Lexer = (function() {
+ function Lexer() {
+ return this;
+ };
+ return Lexer;
+ })();
+ Lexer.prototype.tokenize = function(code, options) {
+ var o;
+ code = code.replace(/\r/g, '').replace(TRAILING_SPACES, '');
+ o = options || {};
+ this.code = code;
+ this.i = 0;
+ this.line = o.line || 0;
+ this.indent = 0;
+ this.indebt = 0;
+ this.outdebt = 0;
+ this.seenFor = false;
+ this.indents = [];
+ this.tokens = [];
+ while (this.chunk = code.slice(this.i)) {
+ this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken();
+ }
+ this.closeIndentation();
+ if (o.rewrite === false) {
+ return this.tokens;
+ }
+ return (new Rewriter).rewrite(this.tokens);
+ };
+ Lexer.prototype.identifierToken = function() {
+ var colon, forcedIdentifier, id, input, match, tag;
+ if (!(match = IDENTIFIER.exec(this.chunk))) {
+ return false;
+ }
+ input = match[0], id = match[1], colon = match[2];
+ this.i += input.length;
+ if (id === 'all' && this.tag() === 'FOR') {
+ this.token('ALL', id);
+ return true;
+ }
+ forcedIdentifier = colon || this.tagAccessor();
+ tag = 'IDENTIFIER';
+ if (include(JS_KEYWORDS, id) || !forcedIdentifier && include(COFFEE_KEYWORDS, id)) {
+ tag = id.toUpperCase();
+ if (tag === 'WHEN' && include(LINE_BREAK, this.tag())) {
+ tag = 'LEADING_WHEN';
+ } else if (tag === 'FOR') {
+ this.seenFor = true;
+ } else if (include(UNARY, tag)) {
+ tag = 'UNARY';
+ } else if (include(RELATION, tag)) {
+ if (tag !== 'INSTANCEOF' && this.seenFor) {
+ this.seenFor = false;
+ tag = 'FOR' + tag;
+ } else {
+ tag = 'RELATION';
+ if (this.value() === '!') {
+ this.tokens.pop();
+ id = '!' + id;
+ }
+ }
+ }
+ }
+ if (include(JS_FORBIDDEN, id)) {
+ if (forcedIdentifier) {
+ tag = 'IDENTIFIER';
+ id = new String(id);
+ id.reserved = true;
+ } else if (include(RESERVED, id)) {
+ this.identifierError(id);
+ }
+ }
+ if (!forcedIdentifier) {
+ if (COFFEE_ALIASES.hasOwnProperty(id)) {
+ tag = (id = COFFEE_ALIASES[id]);
+ }
+ if (id === '!') {
+ tag = 'UNARY';
+ } else if (include(LOGIC, id)) {
+ tag = 'LOGIC';
+ } else if (include(BOOL, tag)) {
+ id = tag.toLowerCase();
+ tag = 'BOOL';
+ }
+ }
+ this.token(tag, id);
+ if (colon) {
+ this.token(':', ':');
+ }
+ return true;
+ };
+ Lexer.prototype.numberToken = function() {
+ var match, number;
+ if (!(match = NUMBER.exec(this.chunk))) {
+ return false;
+ }
+ number = match[0];
+ if (this.tag() === '.' && number.charAt(0) === '.') {
+ return false;
+ }
+ this.i += number.length;
+ this.token('NUMBER', number);
+ return true;
+ };
+ Lexer.prototype.stringToken = function() {
+ var match, string;
+ switch (this.chunk.charAt(0)) {
+ case "'":
+ if (!(match = SIMPLESTR.exec(this.chunk))) {
+ return false;
+ }
+ this.token('STRING', (string = match[0]).replace(MULTILINER, '\\\n'));
+ break;
+ case '"':
+ if (!(string = this.balancedString(this.chunk, [['"', '"'], ['#{', '}']]))) {
+ return false;
+ }
+ if (0 < string.indexOf('#{', 1)) {
+ this.interpolateString(string.slice(1, -1));
+ } else {
+ this.token('STRING', this.escapeLines(string));
+ }
+ break;
+ default:
+ return false;
+ }
+ this.line += count(string, '\n');
+ this.i += string.length;
+ return true;
+ };
+ Lexer.prototype.heredocToken = function() {
+ var doc, heredoc, match, quote;
+ if (!(match = HEREDOC.exec(this.chunk))) {
+ return false;
+ }
+ heredoc = match[0];
+ quote = heredoc.charAt(0);
+ doc = this.sanitizeHeredoc(match[2], {
+ quote: quote,
+ indent: null
+ });
+ if (quote === '"' && (0 <= doc.indexOf('#{'))) {
+ this.interpolateString(doc, {
+ heredoc: true
+ });
+ } else {
+ this.token('STRING', this.makeString(doc, quote, true));
+ }
+ this.line += count(heredoc, '\n');
+ this.i += heredoc.length;
+ return true;
+ };
+ Lexer.prototype.commentToken = function() {
+ var comment, here, match;
+ if (!(match = this.chunk.match(COMMENT))) {
+ return false;
+ }
+ comment = match[0], here = match[1];
+ this.line += count(comment, '\n');
+ this.i += comment.length;
+ if (here) {
+ this.token('HERECOMMENT', this.sanitizeHeredoc(here, {
+ herecomment: true,
+ indent: Array(this.indent + 1).join(' ')
+ }));
+ this.token('TERMINATOR', '\n');
+ }
+ return true;
+ };
+ Lexer.prototype.jsToken = function() {
+ var match, script;
+ if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) {
+ return false;
+ }
+ this.token('JS', (script = match[0]).slice(1, -1));
+ this.i += script.length;
+ return true;
+ };
+ Lexer.prototype.regexToken = function() {
+ var match, regex;
+ if (this.chunk.charAt(0) !== '/') {
+ return false;
+ }
+ if (match = HEREGEX.exec(this.chunk)) {
+ return this.heregexToken(match);
+ }
+ if (include(NOT_REGEX, this.tag())) {
+ return false;
+ }
+ if (!(match = REGEX.exec(this.chunk))) {
+ return false;
+ }
+ regex = match[0];
+ this.token('REGEX', regex === '//' ? '/(?:)/' : regex);
+ this.i += regex.length;
+ return true;
+ };
+ Lexer.prototype.heregexToken = function(match) {
+ var _i, _len, _ref2, _ref3, _ref4, _this, body, flags, heregex, re, tag, tokens, value;
+ heregex = match[0], body = match[1], flags = match[2];
+ this.i += heregex.length;
+ if (0 > body.indexOf('#{')) {
+ re = body.replace(HEREGEX_OMIT, '').replace(/\//g, '\\/');
+ this.token('REGEX', "/" + (re || '(?:)') + "/" + flags);
+ return true;
+ }
+ this.token('IDENTIFIER', 'RegExp');
+ this.tokens.push(['CALL_START', '(']);
+ tokens = [];
+ for (_i = 0, _len = (_ref2 = this.interpolateString(body, {
+ regex: true
+ })).length; _i < _len; _i++) {
+ _ref3 = _ref2[_i], tag = _ref3[0], value = _ref3[1];
+ if (tag === 'TOKENS') {
+ tokens.push.apply(tokens, value);
+ } else {
+ if (!(value = value.replace(HEREGEX_OMIT, ''))) {
+ continue;
+ }
+ value = value.replace(/\\/g, '\\\\');
+ tokens.push(['STRING', this.makeString(value, '"', true)]);
+ }
+ tokens.push(['+', '+']);
+ }
+ tokens.pop();
+ if ((((_ref4 = tokens[0]) != null) ? _ref4[0] : undefined) !== 'STRING') {
+ this.tokens.push(['STRING', '""'], ['+', '+']);
+ }
+ (_this = this.tokens).push.apply(_this, tokens);
+ if (flags) {
+ this.tokens.push([',', ','], ['STRING', '"' + flags + '"']);
+ }
+ this.token(')', ')');
+ return true;
+ };
+ Lexer.prototype.lineToken = function() {
+ var diff, indent, match, nextCharacter, noNewlines, prev, size;
+ if (!(match = MULTI_DENT.exec(this.chunk))) {
+ return false;
+ }
+ indent = match[0];
+ this.line += count(indent, '\n');
+ this.i += indent.length;
+ prev = last(this.tokens, 1);
+ size = indent.length - 1 - indent.lastIndexOf('\n');
+ nextCharacter = NEXT_CHARACTER.exec(this.chunk)[1];
+ noNewlines = ((nextCharacter === '.' || nextCharacter === ',') && !NEXT_ELLIPSIS.test(this.chunk)) || this.unfinished();
+ if (size - this.indebt === this.indent) {
+ if (noNewlines) {
+ return this.suppressNewlines();
+ }
+ return this.newlineToken(indent);
+ } else if (size > this.indent) {
+ if (noNewlines) {
+ this.indebt = size - this.indent;
+ return this.suppressNewlines();
+ }
+ diff = size - this.indent + this.outdebt;
+ this.token('INDENT', diff);
+ this.indents.push(diff);
+ this.outdebt = (this.indebt = 0);
+ } else {
+ this.indebt = 0;
+ this.outdentToken(this.indent - size, noNewlines);
+ }
+ this.indent = size;
+ return true;
+ };
+ Lexer.prototype.outdentToken = function(moveOut, noNewlines, close) {
+ var dent, len;
+ while (moveOut > 0) {
+ len = this.indents.length - 1;
+ if (this.indents[len] === undefined) {
+ moveOut = 0;
+ } else if (this.indents[len] === this.outdebt) {
+ moveOut -= this.outdebt;
+ this.outdebt = 0;
+ } else if (this.indents[len] < this.outdebt) {
+ this.outdebt -= this.indents[len];
+ moveOut -= this.indents[len];
+ } else {
+ dent = this.indents.pop() - this.outdebt;
+ moveOut -= dent;
+ this.outdebt = 0;
+ this.token('OUTDENT', dent);
+ }
+ }
+ if (dent) {
+ this.outdebt -= moveOut;
+ }
+ if (!(this.tag() === 'TERMINATOR' || noNewlines)) {
+ this.token('TERMINATOR', '\n');
+ }
+ return true;
+ };
+ Lexer.prototype.whitespaceToken = function() {
+ var match, prev;
+ if (!(match = WHITESPACE.exec(this.chunk))) {
+ return false;
+ }
+ prev = last(this.tokens);
+ if (prev) {
+ prev.spaced = true;
+ }
+ this.i += match[0].length;
+ return true;
+ };
+ Lexer.prototype.newlineToken = function(newlines) {
+ if (this.tag() !== 'TERMINATOR') {
+ this.token('TERMINATOR', '\n');
+ }
+ return true;
+ };
+ Lexer.prototype.suppressNewlines = function() {
+ if (this.value() === '\\') {
+ this.tokens.pop();
+ }
+ return true;
+ };
+ Lexer.prototype.literalToken = function() {
+ var _ref2, match, prev, tag, value;
+ if (match = OPERATOR.exec(this.chunk)) {
+ value = match[0];
+ if (CODE.test(value)) {
+ this.tagParameters();
+ }
+ } else {
+ value = this.chunk.charAt(0);
+ }
+ this.i += value.length;
+ tag = value;
+ prev = last(this.tokens);
+ if (value === '=' && prev) {
+ if (!prev[1].reserved && include(JS_FORBIDDEN, prev[1])) {
+ this.assignmentError();
+ }
+ if (((_ref2 = prev[1]) === '||' || _ref2 === '&&')) {
+ prev[0] = 'COMPOUND_ASSIGN';
+ prev[1] += '=';
+ return true;
+ }
+ }
+ if (';' === value) {
+ tag = 'TERMINATOR';
+ } else if (include(LOGIC, value)) {
+ tag = 'LOGIC';
+ } else if (include(MATH, value)) {
+ tag = 'MATH';
+ } else if (include(COMPARE, value)) {
+ tag = 'COMPARE';
+ } else if (include(COMPOUND_ASSIGN, value)) {
+ tag = 'COMPOUND_ASSIGN';
+ } else if (include(UNARY, value)) {
+ tag = 'UNARY';
+ } else if (include(SHIFT, value)) {
+ tag = 'SHIFT';
+ } else if (value === '?' && ((prev != null) ? prev.spaced : undefined)) {
+ tag = 'LOGIC';
+ } else if (prev && !prev.spaced) {
+ if (value === '(' && include(CALLABLE, prev[0])) {
+ if (prev[0] === '?') {
+ prev[0] = 'FUNC_EXIST';
+ }
+ tag = 'CALL_START';
+ } else if (value === '[' && include(INDEXABLE, prev[0])) {
+ tag = 'INDEX_START';
+ switch (prev[0]) {
+ case '?':
+ prev[0] = 'INDEX_SOAK';
+ break;
+ case '::':
+ prev[0] = 'INDEX_PROTO';
+ break;
+ }
+ }
+ }
+ this.token(tag, value);
+ return true;
+ };
+ Lexer.prototype.tagAccessor = function() {
+ var prev;
+ if (!(prev = last(this.tokens)) || prev.spaced) {
+ return false;
+ }
+ if (prev[1] === '::') {
+ this.tag(0, 'PROTOTYPE_ACCESS');
+ } else if (prev[1] === '.' && this.value(1) !== '.') {
+ if (this.tag(1) === '?') {
+ this.tag(0, 'SOAK_ACCESS');
+ this.tokens.splice(-2, 1);
+ } else {
+ this.tag(0, 'PROPERTY_ACCESS');
+ }
+ } else {
+ return prev[0] === '@';
+ }
+ return true;
+ };
+ Lexer.prototype.sanitizeHeredoc = function(doc, options) {
+ var _ref2, attempt, herecomment, indent, match;
+ indent = options.indent, herecomment = options.herecomment;
+ if (herecomment && 0 > doc.indexOf('\n')) {
+ return doc;
+ }
+ if (!herecomment) {
+ while (match = HEREDOC_INDENT.exec(doc)) {
+ attempt = match[1];
+ if (indent === null || (0 < (_ref2 = attempt.length)) && (_ref2 < indent.length)) {
+ indent = attempt;
+ }
+ }
+ }
+ if (indent) {
+ doc = doc.replace(RegExp("\\n" + indent, "g"), '\n');
+ }
+ if (!herecomment) {
+ doc = doc.replace(/^\n/, '');
+ }
+ return doc;
+ };
+ Lexer.prototype.tagParameters = function() {
+ var i, tok;
+ if (this.tag() !== ')') {
+ return;
+ }
+ i = this.tokens.length;
+ while (tok = this.tokens[--i]) {
+ switch (tok[0]) {
+ case 'IDENTIFIER':
+ tok[0] = 'PARAM';
+ break;
+ case ')':
+ tok[0] = 'PARAM_END';
+ break;
+ case '(':
+ case 'CALL_START':
+ tok[0] = 'PARAM_START';
+ return true;
+ }
+ }
+ return true;
+ };
+ Lexer.prototype.closeIndentation = function() {
+ return this.outdentToken(this.indent);
+ };
+ Lexer.prototype.identifierError = function(word) {
+ throw SyntaxError("Reserved word \"" + word + "\" on line " + (this.line + 1));
+ };
+ Lexer.prototype.assignmentError = function() {
+ throw SyntaxError("Reserved word \"" + (this.value()) + "\" on line " + (this.line + 1) + " can't be assigned");
+ };
+ Lexer.prototype.balancedString = function(str, delimited, options) {
+ var _i, _len, close, i, levels, open, pair, slen;
+ options || (options = {});
+ levels = [];
+ i = 0;
+ slen = str.length;
+ while (i < slen) {
+ if (levels.length && str.charAt(i) === '\\') {
+ i += 1;
+ } else {
+ for (_i = 0, _len = delimited.length; _i < _len; _i++) {
+ pair = delimited[_i];
+ open = pair[0], close = pair[1];
+ if (levels.length && starts(str, close, i) && last(levels) === pair) {
+ levels.pop();
+ i += close.length - 1;
+ if (!levels.length) {
+ i += 1;
+ }
+ break;
+ }
+ if (starts(str, open, i)) {
+ levels.push(pair);
+ i += open.length - 1;
+ break;
+ }
+ }
+ }
+ if (!levels.length) {
+ break;
+ }
+ i += 1;
+ }
+ if (levels.length) {
+ throw SyntaxError("Unterminated " + (levels.pop()[0]) + " starting on line " + (this.line + 1));
+ }
+ return !i ? false : str.slice(0, i);
+ };
+ Lexer.prototype.interpolateString = function(str, options) {
+ var _len, _ref2, _ref3, _this, expr, heredoc, i, inner, interpolated, letter, nested, pi, regex, tag, tokens, value;
+ _ref2 = options || (options = {}), heredoc = _ref2.heredoc, regex = _ref2.regex;
+ tokens = [];
+ pi = 0;
+ i = -1;
+ while (letter = str.charAt(i += 1)) {
+ if (letter === '\\') {
+ i += 1;
+ continue;
+ }
+ if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = this.balancedString(str.slice(i + 1), [['{', '}']])))) {
+ continue;
+ }
+ if (pi < i) {
+ tokens.push(['TO_BE_STRING', str.slice(pi, i)]);
+ }
+ inner = expr.slice(1, -1).replace(LEADING_SPACES, '').replace(TRAILING_SPACES, '');
+ if (inner.length) {
+ nested = new Lexer().tokenize(inner, {
+ line: this.line,
+ rewrite: false
+ });
+ nested.pop();
+ if (nested.length > 1) {
+ nested.unshift(['(', '(']);
+ nested.push([')', ')']);
+ }
+ tokens.push(['TOKENS', nested]);
+ }
+ i += expr.length;
+ pi = i + 1;
+ }
+ if ((i > pi) && (pi < str.length)) {
+ tokens.push(['TO_BE_STRING', str.slice(pi)]);
+ }
+ if (regex) {
+ return tokens;
+ }
+ if (!tokens.length) {
+ return this.token('STRING', '""');
+ }
+ if (tokens[0][0] !== 'TO_BE_STRING') {
+ tokens.unshift(['', '']);
+ }
+ if (interpolated = tokens.length > 1) {
+ this.token('(', '(');
+ }
+ for (i = 0, _len = tokens.length; i < _len; i++) {
+ _ref3 = tokens[i], tag = _ref3[0], value = _ref3[1];
+ if (i) {
+ this.token('+', '+');
+ }
+ if (tag === 'TOKENS') {
+ (_this = this.tokens).push.apply(_this, value);
+ } else {
+ this.token('STRING', this.makeString(value, '"', heredoc));
+ }
+ }
+ if (interpolated) {
+ this.token(')', ')');
+ }
+ return tokens;
+ };
+ Lexer.prototype.token = function(tag, value) {
+ return this.tokens.push([tag, value, this.line]);
+ };
+ Lexer.prototype.tag = function(index, tag) {
+ var tok;
+ return (tok = last(this.tokens, index)) && ((tag != null) ? (tok[0] = tag) : tok[0]);
+ };
+ Lexer.prototype.value = function(index, val) {
+ var tok;
+ return (tok = last(this.tokens, index)) && ((val != null) ? (tok[1] = val) : tok[1]);
+ };
+ Lexer.prototype.unfinished = function() {
+ var prev, value;
+ return (prev = last(this.tokens, 1)) && prev[0] !== '.' && (value = this.value()) && !value.reserved && NO_NEWLINE.test(value) && !CODE.test(value) && !ASSIGNED.test(this.chunk);
+ };
+ Lexer.prototype.escapeLines = function(str, heredoc) {
+ return str.replace(MULTILINER, heredoc ? '\\n' : '');
+ };
+ Lexer.prototype.makeString = function(body, quote, heredoc) {
+ if (!body) {
+ return quote + quote;
+ }
+ body = body.replace(/\\([\s\S])/g, function(match, contents) {
+ return (contents === '\n' || contents === quote) ? contents : match;
+ });
+ body = body.replace(RegExp("" + quote, "g"), '\\$&');
+ return quote + this.escapeLines(body, heredoc) + quote;
+ };
+ return Lexer;
+ })();
+ JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'if', 'else', 'switch', 'for', 'while', 'try', 'catch', 'finally', 'class', 'extends', 'super'];
+ COFFEE_KEYWORDS = ['then', 'unless', 'until', 'loop', 'of', 'by', 'when'];
+ for (op in (COFFEE_ALIASES = {
+ and: '&&',
+ or: '||',
+ is: '==',
+ isnt: '!=',
+ not: '!',
+ yes: 'TRUE',
+ no: 'FALSE',
+ on: 'TRUE',
+ off: 'FALSE'
+ })) {
+ COFFEE_KEYWORDS.push(op);
+ }
+ RESERVED = ['case', 'default', 'do', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'export', 'import', 'native', '__hasProp', '__extends', '__slice'];
+ JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED);
+ IDENTIFIER = /^([$A-Za-z_][$\w]*)([^\n\S]*:(?!:))?/;
+ NUMBER = /^0x[\da-f]+|^(?:\d+(\.\d+)?|\.\d+)(?:e[+-]?\d+)?/i;
+ HEREDOC = /^("""|''')([\s\S]*?)(?:\n[ \t]*)?\1/;
+ OPERATOR = /^(?:-[-=>]?|\+[+=]?|\.\.\.?|[*&|\/%=<>^:!?]+)/;
+ WHITESPACE = /^[ \t]+/;
+ COMMENT = /^###([^#][\s\S]*?)(?:###[ \t]*\n|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/;
+ CODE = /^[-=]>/;
+ MULTI_DENT = /^(?:\n[ \t]*)+/;
+ SIMPLESTR = /^'[^\\']*(?:\\.[^\\']*)*'/;
+ JSTOKEN = /^`[^\\`]*(?:\\.[^\\`]*)*`/;
+ REGEX = /^\/(?!\s)[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/[imgy]{0,4}(?![A-Za-z])/;
+ HEREGEX = /^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?![A-Za-z])/;
+ HEREGEX_OMIT = /\s+(?:#.*)?/g;
+ MULTILINER = /\n/g;
+ HEREDOC_INDENT = /\n+([ \t]*)/g;
+ ASSIGNED = /^\s*@?[$A-Za-z_][$\w]*[ \t]*?[:=][^:=>]/;
+ NEXT_CHARACTER = /^\s*(\S?)/;
+ NEXT_ELLIPSIS = /^\s*\.\.\.?/;
+ LEADING_SPACES = /^\s+/;
+ TRAILING_SPACES = /\s+$/;
+ NO_NEWLINE = /^(?:[-+*&|\/%=<>!.\\][<>=&|]*|and|or|is(?:nt)?|n(?:ot|ew)|delete|typeof|instanceof)$/;
+ COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|='];
+ UNARY = ['UMINUS', 'UPLUS', '!', '!!', '~', 'NEW', 'TYPEOF', 'DELETE'];
+ LOGIC = ['&', '|', '^', '&&', '||'];
+ SHIFT = ['<<', '>>', '>>>'];
+ COMPARE = ['<=', '<', '>', '>='];
+ MATH = ['*', '/', '%'];
+ RELATION = ['IN', 'OF', 'INSTANCEOF'];
+ BOOL = ['TRUE', 'FALSE', 'NULL'];
+ NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', '++', '--', ']'];
+ CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER'];
+ INDEXABLE = CALLABLE.concat('NUMBER', 'BOOL');
+ LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR'];
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/nodes.js b/node_modules/jade/support/coffee-script/lib/nodes.js
new file mode 100644
index 0000000..93d8012
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/nodes.js
@@ -0,0 +1,1981 @@
+(function() {
+ var Accessor, ArrayLiteral, Assign, Base, Call, Class, Closure, Code, Comment, Existence, Expressions, Extends, For, IDENTIFIER, IS_STRING, If, In, Index, Literal, NO, NUMBER, ObjectLiteral, Op, Param, Parens, Push, Range, Return, SIMPLENUM, Scope, Slice, Splat, Switch, TAB, THIS, TRAILING_WHITESPACE, Throw, Try, UTILITIES, Value, While, YES, _ref, compact, del, ends, flatten, include, last, merge, starts, utility;
+ var __extends = function(child, parent) {
+ function ctor() { this.constructor = child; }
+ ctor.prototype = parent.prototype;
+ child.prototype = new ctor;
+ if (typeof parent.extended === "function") parent.extended(child);
+ child.__super__ = parent.prototype;
+ };
+ Scope = require('./scope').Scope;
+ _ref = require('./helpers'), compact = _ref.compact, flatten = _ref.flatten, merge = _ref.merge, del = _ref.del, include = _ref.include, starts = _ref.starts, ends = _ref.ends, last = _ref.last;
+ YES = function() {
+ return true;
+ };
+ NO = function() {
+ return false;
+ };
+ THIS = function() {
+ return this;
+ };
+ exports.Base = (function() {
+ Base = (function() {
+ function Base() {
+ this.tags = {};
+ return this;
+ };
+ return Base;
+ })();
+ Base.prototype.compile = function(o) {
+ var closure, code, top;
+ this.options = o ? merge(o) : {};
+ this.tab = o.indent;
+ top = this.topSensitive() ? this.options.top : del(this.options, 'top');
+ closure = this.isStatement(o) && !this.isPureStatement() && !top && !this.options.asStatement && !(this instanceof Comment);
+ code = closure ? this.compileClosure(this.options) : this.compileNode(this.options);
+ return code;
+ };
+ Base.prototype.compileClosure = function(o) {
+ o.sharedScope = o.scope;
+ if (this.containsPureStatement()) {
+ throw new Error('cannot include a pure statement in an expression.');
+ }
+ return Closure.wrap(this).compile(o);
+ };
+ Base.prototype.compileReference = function(o, options) {
+ var _len, compiled, i, node, pair, reference;
+ pair = (function() {
+ if (!this.isComplex()) {
+ return [this, this];
+ } else {
+ reference = new Literal(o.scope.freeVariable('ref'));
+ compiled = new Assign(reference, this);
+ return [compiled, reference];
+ }
+ }).call(this);
+ if (((options != null) ? options.precompile : undefined)) {
+ for (i = 0, _len = pair.length; i < _len; i++) {
+ node = pair[i];
+ (pair[i] = node.compile(o));
+ }
+ }
+ return pair;
+ };
+ Base.prototype.idt = function(tabs) {
+ var idt, num;
+ idt = this.tab || '';
+ num = (tabs || 0) + 1;
+ while (num -= 1) {
+ idt += TAB;
+ }
+ return idt;
+ };
+ Base.prototype.makeReturn = function() {
+ return new Return(this);
+ };
+ Base.prototype.contains = function(block) {
+ var contains;
+ contains = false;
+ this.traverseChildren(false, function(node) {
+ if (block(node)) {
+ contains = true;
+ return false;
+ }
+ });
+ return contains;
+ };
+ Base.prototype.containsType = function(type) {
+ return this instanceof type || this.contains(function(node) {
+ return node instanceof type;
+ });
+ };
+ Base.prototype.containsPureStatement = function() {
+ return this.isPureStatement() || this.contains(function(node) {
+ return node.isPureStatement();
+ });
+ };
+ Base.prototype.traverse = function(block) {
+ return this.traverseChildren(true, block);
+ };
+ Base.prototype.toString = function(idt, override) {
+ var _i, _len, _ref2, _result, child, children, klass;
+ idt || (idt = '');
+ children = (function() {
+ _result = [];
+ for (_i = 0, _len = (_ref2 = this.collectChildren()).length; _i < _len; _i++) {
+ child = _ref2[_i];
+ _result.push(child.toString(idt + TAB));
+ }
+ return _result;
+ }).call(this).join('');
+ klass = override || this.constructor.name + (this.soakNode ? '?' : '');
+ return '\n' + idt + klass + children;
+ };
+ Base.prototype.eachChild = function(func) {
+ var _i, _j, _len, _len2, _ref2, _ref3, _result, attr, child;
+ if (!this.children) {
+ return;
+ }
+ _result = [];
+ for (_i = 0, _len = (_ref2 = this.children).length; _i < _len; _i++) {
+ attr = _ref2[_i];
+ if (this[attr]) {
+ for (_j = 0, _len2 = (_ref3 = flatten([this[attr]])).length; _j < _len2; _j++) {
+ child = _ref3[_j];
+ if (func(child) === false) {
+ return;
+ }
+ }
+ }
+ }
+ return _result;
+ };
+ Base.prototype.collectChildren = function() {
+ var nodes;
+ nodes = [];
+ this.eachChild(function(node) {
+ return nodes.push(node);
+ });
+ return nodes;
+ };
+ Base.prototype.traverseChildren = function(crossScope, func) {
+ return this.eachChild(function(child) {
+ if (func(child) === false) {
+ return false;
+ }
+ return crossScope || !(child instanceof Code) ? child.traverseChildren(crossScope, func) : undefined;
+ });
+ };
+ Base.prototype.invert = function() {
+ return new Op('!', this);
+ };
+ Base.prototype.children = [];
+ Base.prototype.unwrap = THIS;
+ Base.prototype.isStatement = NO;
+ Base.prototype.isPureStatement = NO;
+ Base.prototype.isComplex = YES;
+ Base.prototype.topSensitive = NO;
+ Base.prototype.unfoldSoak = NO;
+ Base.prototype.assigns = NO;
+ return Base;
+ })();
+ exports.Expressions = (function() {
+ Expressions = (function() {
+ function Expressions(nodes) {
+ Expressions.__super__.constructor.call(this);
+ this.expressions = compact(flatten(nodes || []));
+ return this;
+ };
+ return Expressions;
+ })();
+ __extends(Expressions, Base);
+ Expressions.prototype.children = ['expressions'];
+ Expressions.prototype.isStatement = YES;
+ Expressions.prototype.push = function(node) {
+ this.expressions.push(node);
+ return this;
+ };
+ Expressions.prototype.unshift = function(node) {
+ this.expressions.unshift(node);
+ return this;
+ };
+ Expressions.prototype.unwrap = function() {
+ return this.expressions.length === 1 ? this.expressions[0] : this;
+ };
+ Expressions.prototype.empty = function() {
+ return this.expressions.length === 0;
+ };
+ Expressions.prototype.makeReturn = function() {
+ var end, idx;
+ end = this.expressions[(idx = this.expressions.length - 1)];
+ if (end instanceof Comment) {
+ end = this.expressions[idx -= 1];
+ }
+ if (end && !(end instanceof Return)) {
+ this.expressions[idx] = end.makeReturn();
+ }
+ return this;
+ };
+ Expressions.prototype.compile = function(o) {
+ o || (o = {});
+ return o.scope ? Expressions.__super__.compile.call(this, o) : this.compileRoot(o);
+ };
+ Expressions.prototype.compileNode = function(o) {
+ var _i, _len, _ref2, _result, node;
+ return (function() {
+ _result = [];
+ for (_i = 0, _len = (_ref2 = this.expressions).length; _i < _len; _i++) {
+ node = _ref2[_i];
+ _result.push(this.compileExpression(node, merge(o)));
+ }
+ return _result;
+ }).call(this).join('\n');
+ };
+ Expressions.prototype.compileRoot = function(o) {
+ var code;
+ o.indent = (this.tab = o.bare ? '' : TAB);
+ o.scope = new Scope(null, this, null);
+ code = this.compileWithDeclarations(o);
+ code = code.replace(TRAILING_WHITESPACE, '');
+ return o.bare ? code : ("(function() {\n" + code + "\n}).call(this);\n");
+ };
+ Expressions.prototype.compileWithDeclarations = function(o) {
+ var code;
+ code = this.compileNode(o);
+ if (o.scope.hasAssignments(this)) {
+ code = ("" + (this.tab) + "var " + (o.scope.compiledAssignments().replace(/\n/g, '$&' + this.tab)) + ";\n" + code);
+ }
+ if (!o.globals && o.scope.hasDeclarations(this)) {
+ code = ("" + (this.tab) + "var " + (o.scope.compiledDeclarations()) + ";\n" + code);
+ }
+ return code;
+ };
+ Expressions.prototype.compileExpression = function(node, o) {
+ var compiledNode;
+ this.tab = o.indent;
+ node.tags.front = true;
+ compiledNode = node.compile(merge(o, {
+ top: true
+ }));
+ return node.isStatement(o) ? compiledNode : ("" + (this.idt()) + compiledNode + ";");
+ };
+ return Expressions;
+ })();
+ Expressions.wrap = function(nodes) {
+ if (nodes.length === 1 && nodes[0] instanceof Expressions) {
+ return nodes[0];
+ }
+ return new Expressions(nodes);
+ };
+ exports.Literal = (function() {
+ Literal = (function() {
+ function Literal(_arg) {
+ this.value = _arg;
+ Literal.__super__.constructor.call(this);
+ return this;
+ };
+ return Literal;
+ })();
+ __extends(Literal, Base);
+ Literal.prototype.makeReturn = function() {
+ return this.isStatement() ? this : Literal.__super__.makeReturn.call(this);
+ };
+ Literal.prototype.isStatement = function() {
+ var _ref2;
+ return ((_ref2 = this.value) === 'break' || _ref2 === 'continue' || _ref2 === 'debugger');
+ };
+ Literal.prototype.isPureStatement = Literal.prototype.isStatement;
+ Literal.prototype.isComplex = NO;
+ Literal.prototype.isReserved = function() {
+ return !!this.value.reserved;
+ };
+ Literal.prototype.assigns = function(name) {
+ return name === this.value;
+ };
+ Literal.prototype.compileNode = function(o) {
+ var end, idt, val;
+ idt = this.isStatement(o) ? this.idt() : '';
+ end = this.isStatement(o) ? ';' : '';
+ val = this.isReserved() ? ("\"" + (this.value) + "\"") : this.value;
+ return idt + val + end;
+ };
+ Literal.prototype.toString = function() {
+ return ' "' + this.value + '"';
+ };
+ return Literal;
+ })();
+ exports.Return = (function() {
+ Return = (function() {
+ function Return(_arg) {
+ this.expression = _arg;
+ Return.__super__.constructor.call(this);
+ return this;
+ };
+ return Return;
+ })();
+ __extends(Return, Base);
+ Return.prototype.isStatement = YES;
+ Return.prototype.isPureStatement = YES;
+ Return.prototype.children = ['expression'];
+ Return.prototype.makeReturn = THIS;
+ Return.prototype.compile = function(o) {
+ var _ref2, expr;
+ expr = (((_ref2 = this.expression) != null) ? _ref2.makeReturn() : undefined);
+ if (expr && (!(expr instanceof Return))) {
+ return expr.compile(o);
+ }
+ return Return.__super__.compile.call(this, o);
+ };
+ Return.prototype.compileNode = function(o) {
+ var expr;
+ expr = '';
+ if (this.expression) {
+ if (this.expression.isStatement(o)) {
+ o.asStatement = true;
+ }
+ expr = ' ' + this.expression.compile(o);
+ }
+ return "" + (this.tab) + "return" + expr + ";";
+ };
+ return Return;
+ })();
+ exports.Value = (function() {
+ Value = (function() {
+ function Value(_arg, _arg2, tag) {
+ this.properties = _arg2;
+ this.base = _arg;
+ Value.__super__.constructor.call(this);
+ this.properties || (this.properties = []);
+ if (tag) {
+ this.tags[tag] = true;
+ }
+ return this;
+ };
+ return Value;
+ })();
+ __extends(Value, Base);
+ Value.prototype.children = ['base', 'properties'];
+ Value.prototype.push = function(prop) {
+ this.properties.push(prop);
+ return this;
+ };
+ Value.prototype.hasProperties = function() {
+ return !!this.properties.length;
+ };
+ Value.prototype.isArray = function() {
+ return this.base instanceof ArrayLiteral && !this.properties.length;
+ };
+ Value.prototype.isObject = function() {
+ return this.base instanceof ObjectLiteral && !this.properties.length;
+ };
+ Value.prototype.isSplice = function() {
+ return last(this.properties) instanceof Slice;
+ };
+ Value.prototype.isComplex = function() {
+ return this.base.isComplex() || this.hasProperties();
+ };
+ Value.prototype.assigns = function(name) {
+ return !this.properties.length && this.base.assigns(name);
+ };
+ Value.prototype.makeReturn = function() {
+ return this.properties.length ? Value.__super__.makeReturn.call(this) : this.base.makeReturn();
+ };
+ Value.prototype.unwrap = function() {
+ return this.properties.length ? this : this.base;
+ };
+ Value.prototype.isStatement = function(o) {
+ return this.base.isStatement(o) && !this.properties.length;
+ };
+ Value.prototype.isSimpleNumber = function() {
+ return this.base instanceof Literal && SIMPLENUM.test(this.base.value);
+ };
+ Value.prototype.cacheReference = function(o) {
+ var base, bref, name, nref;
+ name = last(this.properties);
+ if (!this.base.isComplex() && this.properties.length < 2 && !((name != null) ? name.isComplex() : undefined)) {
+ return [this, this];
+ }
+ base = new Value(this.base, this.properties.slice(0, -1));
+ if (base.isComplex()) {
+ bref = new Literal(o.scope.freeVariable('base'));
+ base = new Value(new Parens(new Assign(bref, base)));
+ }
+ if (!name) {
+ return [base, bref];
+ }
+ if (name.isComplex()) {
+ nref = new Literal(o.scope.freeVariable('name'));
+ name = new Index(new Assign(nref, name.index));
+ nref = new Index(nref);
+ }
+ return [base.push(name), new Value(bref || base.base, [nref || name])];
+ };
+ Value.prototype.compile = function(o) {
+ this.base.tags.front = this.tags.front;
+ return !o.top || this.properties.length ? Value.__super__.compile.call(this, o) : this.base.compile(o);
+ };
+ Value.prototype.compileNode = function(o) {
+ var _i, _len, code, ifn, prop, props;
+ if (ifn = this.unfoldSoak(o)) {
+ return ifn.compile(o);
+ }
+ props = this.properties;
+ if (this.parenthetical && !props.length) {
+ this.base.parenthetical = true;
+ }
+ code = this.base.compile(o);
+ if (props[0] instanceof Accessor && this.isSimpleNumber()) {
+ code = ("(" + code + ")");
+ }
+ for (_i = 0, _len = props.length; _i < _len; _i++) {
+ prop = props[_i];
+ (code += prop.compile(o));
+ }
+ return code;
+ };
+ Value.prototype.unfoldSoak = function(o) {
+ var _len, _ref2, fst, i, ifn, prop, ref, snd;
+ if (ifn = this.base.unfoldSoak(o)) {
+ Array.prototype.push.apply(ifn.body.properties, this.properties);
+ return ifn;
+ }
+ for (i = 0, _len = (_ref2 = this.properties).length; i < _len; i++) {
+ prop = _ref2[i];
+ if (prop.soakNode) {
+ prop.soakNode = false;
+ fst = new Value(this.base, this.properties.slice(0, i));
+ snd = new Value(this.base, this.properties.slice(i));
+ if (fst.isComplex()) {
+ ref = new Literal(o.scope.freeVariable('ref'));
+ fst = new Parens(new Assign(ref, fst));
+ snd.base = ref;
+ }
+ ifn = new If(new Existence(fst), snd, {
+ soak: true
+ });
+ return ifn;
+ }
+ }
+ return null;
+ };
+ return Value;
+ })();
+ exports.Comment = (function() {
+ Comment = (function() {
+ function Comment(_arg) {
+ this.comment = _arg;
+ Comment.__super__.constructor.call(this);
+ return this;
+ };
+ return Comment;
+ })();
+ __extends(Comment, Base);
+ Comment.prototype.isStatement = YES;
+ Comment.prototype.makeReturn = THIS;
+ Comment.prototype.compileNode = function(o) {
+ return this.tab + '/*' + this.comment.replace(/\n/g, '\n' + this.tab) + '*/';
+ };
+ return Comment;
+ })();
+ exports.Call = (function() {
+ Call = (function() {
+ function Call(variable, _arg, _arg2) {
+ this.soakNode = _arg2;
+ this.args = _arg;
+ Call.__super__.constructor.call(this);
+ this.isNew = false;
+ this.isSuper = variable === 'super';
+ this.variable = this.isSuper ? null : variable;
+ this.args || (this.args = []);
+ return this;
+ };
+ return Call;
+ })();
+ __extends(Call, Base);
+ Call.prototype.children = ['variable', 'args'];
+ Call.prototype.compileSplatArguments = function(o) {
+ return Splat.compileSplattedArray(this.args, o);
+ };
+ Call.prototype.newInstance = function() {
+ this.isNew = true;
+ return this;
+ };
+ Call.prototype.prefix = function() {
+ return this.isNew ? 'new ' : '';
+ };
+ Call.prototype.superReference = function(o) {
+ var method, name;
+ method = o.scope.method;
+ if (!method) {
+ throw Error("cannot call super outside of a function.");
+ }
+ name = method.name;
+ if (!name) {
+ throw Error("cannot call super on an anonymous function.");
+ }
+ return method.klass ? ("" + (method.klass) + ".__super__." + name) : ("" + name + ".__super__.constructor");
+ };
+ Call.prototype.unfoldSoak = function(o) {
+ var _i, _len, _ref2, _ref3, call, ifn, left, list, rite, val;
+ if (this.soakNode) {
+ if (val = this.variable) {
+ if (!(val instanceof Value)) {
+ val = new Value(val);
+ }
+ _ref2 = val.cacheReference(o), left = _ref2[0], rite = _ref2[1];
+ } else {
+ left = new Literal(this.superReference(o));
+ rite = new Value(left);
+ }
+ rite = new Call(rite, this.args);
+ rite.isNew = this.isNew;
+ left = new Literal("typeof " + (left.compile(o)) + " === \"function\"");
+ ifn = new If(left, new Value(rite), {
+ soak: true
+ });
+ return ifn;
+ }
+ call = this;
+ list = [];
+ while (true) {
+ if (call.variable instanceof Call) {
+ list.push(call);
+ call = call.variable;
+ continue;
+ }
+ if (!(call.variable instanceof Value)) {
+ break;
+ }
+ list.push(call);
+ if (!((call = call.variable.base) instanceof Call)) {
+ break;
+ }
+ }
+ for (_i = 0, _len = (_ref3 = list.reverse()).length; _i < _len; _i++) {
+ call = _ref3[_i];
+ if (ifn) {
+ if (call.variable instanceof Call) {
+ call.variable = ifn;
+ } else {
+ call.variable.base = ifn;
+ }
+ }
+ ifn = If.unfoldSoak(o, call, 'variable');
+ }
+ return ifn;
+ };
+ Call.prototype.compileNode = function(o) {
+ var _i, _j, _len, _len2, _ref2, _ref3, _ref4, _result, arg, args, ifn;
+ if (ifn = this.unfoldSoak(o)) {
+ return ifn.compile(o);
+ }
+ (((_ref2 = this.variable) != null) ? (_ref2.tags.front = this.tags.front) : undefined);
+ for (_i = 0, _len = (_ref3 = this.args).length; _i < _len; _i++) {
+ arg = _ref3[_i];
+ if (arg instanceof Splat) {
+ return this.compileSplat(o);
+ }
+ }
+ args = (function() {
+ _result = [];
+ for (_j = 0, _len2 = (_ref4 = this.args).length; _j < _len2; _j++) {
+ arg = _ref4[_j];
+ _result.push((arg.parenthetical = true) && arg.compile(o));
+ }
+ return _result;
+ }).call(this).join(', ');
+ return this.isSuper ? this.compileSuper(args, o) : ("" + (this.prefix()) + (this.variable.compile(o)) + "(" + args + ")");
+ };
+ Call.prototype.compileSuper = function(args, o) {
+ return "" + (this.superReference(o)) + ".call(this" + (args.length ? ', ' : '') + args + ")";
+ };
+ Call.prototype.compileSplat = function(o) {
+ var base, fun, idt, name, ref, splatargs;
+ splatargs = this.compileSplatArguments(o);
+ if (this.isSuper) {
+ return ("" + (this.superReference(o)) + ".apply(this, " + splatargs + ")");
+ }
+ if (!this.isNew) {
+ if (!((base = this.variable) instanceof Value)) {
+ base = new Value(base);
+ }
+ if ((name = base.properties.pop()) && base.isComplex()) {
+ ref = o.scope.freeVariable('this');
+ fun = ("(" + ref + " = " + (base.compile(o)) + ")" + (name.compile(o)));
+ } else {
+ fun = (ref = base.compile(o));
+ if (name) {
+ fun += name.compile(o);
+ }
+ }
+ return ("" + fun + ".apply(" + ref + ", " + splatargs + ")");
+ }
+ idt = this.idt(1);
+ return "(function(func, args, ctor) {\n" + idt + "ctor.prototype = func.prototype;\n" + idt + "var child = new ctor, result = func.apply(child, args);\n" + idt + "return typeof result === \"object\" ? result : child;\n" + (this.tab) + "})(" + (this.variable.compile(o)) + ", " + splatargs + ", function() {})";
+ };
+ return Call;
+ })();
+ exports.Extends = (function() {
+ Extends = (function() {
+ function Extends(_arg, _arg2) {
+ this.parent = _arg2;
+ this.child = _arg;
+ Extends.__super__.constructor.call(this);
+ return this;
+ };
+ return Extends;
+ })();
+ __extends(Extends, Base);
+ Extends.prototype.children = ['child', 'parent'];
+ Extends.prototype.compileNode = function(o) {
+ var ref;
+ ref = new Value(new Literal(utility('extends')));
+ return (new Call(ref, [this.child, this.parent])).compile(o);
+ };
+ return Extends;
+ })();
+ exports.Accessor = (function() {
+ Accessor = (function() {
+ function Accessor(_arg, tag) {
+ this.name = _arg;
+ Accessor.__super__.constructor.call(this);
+ this.prototype = tag === 'prototype' ? '.prototype' : '';
+ this.soakNode = tag === 'soak';
+ return this;
+ };
+ return Accessor;
+ })();
+ __extends(Accessor, Base);
+ Accessor.prototype.children = ['name'];
+ Accessor.prototype.compileNode = function(o) {
+ var name, namePart;
+ name = this.name.compile(o);
+ namePart = name.match(IS_STRING) ? ("[" + name + "]") : ("." + name);
+ return this.prototype + namePart;
+ };
+ Accessor.prototype.isComplex = NO;
+ return Accessor;
+ })();
+ exports.Index = (function() {
+ Index = (function() {
+ function Index(_arg) {
+ this.index = _arg;
+ Index.__super__.constructor.call(this);
+ return this;
+ };
+ return Index;
+ })();
+ __extends(Index, Base);
+ Index.prototype.children = ['index'];
+ Index.prototype.compileNode = function(o) {
+ var idx, prefix;
+ idx = this.index.compile(o);
+ prefix = this.proto ? '.prototype' : '';
+ return "" + prefix + "[" + idx + "]";
+ };
+ Index.prototype.isComplex = function() {
+ return this.index.isComplex();
+ };
+ return Index;
+ })();
+ exports.Range = (function() {
+ Range = (function() {
+ function Range(_arg, _arg2, tag) {
+ this.to = _arg2;
+ this.from = _arg;
+ Range.__super__.constructor.call(this);
+ this.exclusive = tag === 'exclusive';
+ this.equals = this.exclusive ? '' : '=';
+ return this;
+ };
+ return Range;
+ })();
+ __extends(Range, Base);
+ Range.prototype.children = ['from', 'to'];
+ Range.prototype.compileVariables = function(o) {
+ var _ref2, _ref3, _ref4, parts;
+ o = merge(o, {
+ top: true
+ });
+ _ref2 = this.from.compileReference(o, {
+ precompile: true
+ }), this.from = _ref2[0], this.fromVar = _ref2[1];
+ _ref3 = this.to.compileReference(o, {
+ precompile: true
+ }), this.to = _ref3[0], this.toVar = _ref3[1];
+ _ref4 = [this.fromVar.match(SIMPLENUM), this.toVar.match(SIMPLENUM)], this.fromNum = _ref4[0], this.toNum = _ref4[1];
+ parts = [];
+ if (this.from !== this.fromVar) {
+ parts.push(this.from);
+ }
+ return this.to !== this.toVar ? parts.push(this.to) : undefined;
+ };
+ Range.prototype.compileNode = function(o) {
+ var compare, idx, incr, intro, step, stepPart, vars;
+ this.compileVariables(o);
+ if (!o.index) {
+ return this.compileArray(o);
+ }
+ if (this.fromNum && this.toNum) {
+ return this.compileSimple(o);
+ }
+ idx = del(o, 'index');
+ step = del(o, 'step');
+ vars = ("" + idx + " = " + (this.from)) + (this.to !== this.toVar ? (", " + (this.to)) : '');
+ intro = ("(" + (this.fromVar) + " <= " + (this.toVar) + " ? " + idx);
+ compare = ("" + intro + " <" + (this.equals) + " " + (this.toVar) + " : " + idx + " >" + (this.equals) + " " + (this.toVar) + ")");
+ stepPart = step ? step.compile(o) : '1';
+ incr = step ? ("" + idx + " += " + stepPart) : ("" + intro + " += " + stepPart + " : " + idx + " -= " + stepPart + ")");
+ return "" + vars + "; " + compare + "; " + incr;
+ };
+ Range.prototype.compileSimple = function(o) {
+ var _ref2, from, idx, step, to;
+ _ref2 = [+this.fromNum, +this.toNum], from = _ref2[0], to = _ref2[1];
+ idx = del(o, 'index');
+ step = del(o, 'step');
+ step && (step = ("" + idx + " += " + (step.compile(o))));
+ return from <= to ? ("" + idx + " = " + from + "; " + idx + " <" + (this.equals) + " " + to + "; " + (step || ("" + idx + "++"))) : ("" + idx + " = " + from + "; " + idx + " >" + (this.equals) + " " + to + "; " + (step || ("" + idx + "--")));
+ };
+ Range.prototype.compileArray = function(o) {
+ var _i, _ref2, _ref3, _result, body, clause, i, idt, post, pre, range, result, vars;
+ if (this.fromNum && this.toNum && (Math.abs(this.fromNum - this.toNum) <= 20)) {
+ range = (function() {
+ _result = [];
+ for (var _i = _ref2 = +this.fromNum, _ref3 = +this.toNum; _ref2 <= _ref3 ? _i <= _ref3 : _i >= _ref3; _ref2 <= _ref3 ? _i += 1 : _i -= 1){ _result.push(_i); }
+ return _result;
+ }).call(this);
+ if (this.exclusive) {
+ range.pop();
+ }
+ return ("[" + (range.join(', ')) + "]");
+ }
+ idt = this.idt(1);
+ i = o.scope.freeVariable('i');
+ result = o.scope.freeVariable('result');
+ pre = ("\n" + idt + result + " = [];");
+ if (this.fromNum && this.toNum) {
+ o.index = i;
+ body = this.compileSimple(o);
+ } else {
+ vars = ("" + i + " = " + (this.from)) + (this.to !== this.toVar ? (", " + (this.to)) : '');
+ clause = ("" + (this.fromVar) + " <= " + (this.toVar) + " ?");
+ body = ("var " + vars + "; " + clause + " " + i + " <" + (this.equals) + " " + (this.toVar) + " : " + i + " >" + (this.equals) + " " + (this.toVar) + "; " + clause + " " + i + " += 1 : " + i + " -= 1");
+ }
+ post = ("{ " + result + ".push(" + i + "); }\n" + idt + "return " + result + ";\n" + (o.indent));
+ return "(function() {" + pre + "\n" + idt + "for (" + body + ")" + post + "}).call(this)";
+ };
+ return Range;
+ })();
+ exports.Slice = (function() {
+ Slice = (function() {
+ function Slice(_arg) {
+ this.range = _arg;
+ Slice.__super__.constructor.call(this);
+ return this;
+ };
+ return Slice;
+ })();
+ __extends(Slice, Base);
+ Slice.prototype.children = ['range'];
+ Slice.prototype.compileNode = function(o) {
+ var from, to;
+ from = this.range.from ? this.range.from.compile(o) : '0';
+ to = this.range.to ? this.range.to.compile(o) : '';
+ to += (!to || this.range.exclusive ? '' : ' + 1');
+ if (to) {
+ to = ', ' + to;
+ }
+ return ".slice(" + from + to + ")";
+ };
+ return Slice;
+ })();
+ exports.ObjectLiteral = (function() {
+ ObjectLiteral = (function() {
+ function ObjectLiteral(props) {
+ ObjectLiteral.__super__.constructor.call(this);
+ this.objects = (this.properties = props || []);
+ return this;
+ };
+ return ObjectLiteral;
+ })();
+ __extends(ObjectLiteral, Base);
+ ObjectLiteral.prototype.children = ['properties'];
+ ObjectLiteral.prototype.compileNode = function(o) {
+ var _i, _len, _ref2, _result, i, indent, join, lastNoncom, nonComments, obj, prop, props, top;
+ top = del(o, 'top');
+ o.indent = this.idt(1);
+ nonComments = (function() {
+ _result = [];
+ for (_i = 0, _len = (_ref2 = this.properties).length; _i < _len; _i++) {
+ prop = _ref2[_i];
+ if (!(prop instanceof Comment)) {
+ _result.push(prop);
+ }
+ }
+ return _result;
+ }).call(this);
+ lastNoncom = last(nonComments);
+ props = (function() {
+ _result = [];
+ for (i = 0, _len = (_ref2 = this.properties).length; i < _len; i++) {
+ prop = _ref2[i];
+ _result.push((function() {
+ join = i === this.properties.length - 1 ? '' : (prop === lastNoncom || prop instanceof Comment ? '\n' : ',\n');
+ indent = prop instanceof Comment ? '' : this.idt(1);
+ if (prop instanceof Value && prop.tags["this"]) {
+ prop = new Assign(prop.properties[0].name, prop, 'object');
+ } else if (!(prop instanceof Assign) && !(prop instanceof Comment)) {
+ prop = new Assign(prop, prop, 'object');
+ }
+ return indent + prop.compile(o) + join;
+ }).call(this));
+ }
+ return _result;
+ }).call(this);
+ props = props.join('');
+ obj = ("{" + (props ? '\n' + props + '\n' + this.idt() : '') + "}");
+ return this.tags.front ? ("(" + obj + ")") : obj;
+ };
+ ObjectLiteral.prototype.assigns = function(name) {
+ var _i, _len, _ref2, prop;
+ for (_i = 0, _len = (_ref2 = this.properties).length; _i < _len; _i++) {
+ prop = _ref2[_i];
+ if (prop.assigns(name)) {
+ return true;
+ }
+ }
+ return false;
+ };
+ return ObjectLiteral;
+ })();
+ exports.ArrayLiteral = (function() {
+ ArrayLiteral = (function() {
+ function ArrayLiteral(_arg) {
+ this.objects = _arg;
+ ArrayLiteral.__super__.constructor.call(this);
+ this.objects || (this.objects = []);
+ return this;
+ };
+ return ArrayLiteral;
+ })();
+ __extends(ArrayLiteral, Base);
+ ArrayLiteral.prototype.children = ['objects'];
+ ArrayLiteral.prototype.compileSplatLiteral = function(o) {
+ return Splat.compileSplattedArray(this.objects, o);
+ };
+ ArrayLiteral.prototype.compileNode = function(o) {
+ var _i, _len, _len2, _ref2, _ref3, code, i, obj, objects;
+ o.indent = this.idt(1);
+ for (_i = 0, _len = (_ref2 = this.objects).length; _i < _len; _i++) {
+ obj = _ref2[_i];
+ if (obj instanceof Splat) {
+ return this.compileSplatLiteral(o);
+ }
+ }
+ objects = [];
+ for (i = 0, _len2 = (_ref3 = this.objects).length; i < _len2; i++) {
+ obj = _ref3[i];
+ code = obj.compile(o);
+ objects.push(obj instanceof Comment ? ("\n" + code + "\n" + (o.indent)) : (i === this.objects.length - 1 ? code : code + ', '));
+ }
+ objects = objects.join('');
+ return 0 < objects.indexOf('\n') ? ("[\n" + (o.indent) + objects + "\n" + (this.tab) + "]") : ("[" + objects + "]");
+ };
+ ArrayLiteral.prototype.assigns = function(name) {
+ var _i, _len, _ref2, obj;
+ for (_i = 0, _len = (_ref2 = this.objects).length; _i < _len; _i++) {
+ obj = _ref2[_i];
+ if (obj.assigns(name)) {
+ return true;
+ }
+ }
+ return false;
+ };
+ return ArrayLiteral;
+ })();
+ exports.Class = (function() {
+ Class = (function() {
+ function Class(variable, _arg, _arg2) {
+ this.properties = _arg2;
+ this.parent = _arg;
+ Class.__super__.constructor.call(this);
+ this.variable = variable === '__temp__' ? new Literal(variable) : variable;
+ this.properties || (this.properties = []);
+ this.returns = false;
+ return this;
+ };
+ return Class;
+ })();
+ __extends(Class, Base);
+ Class.prototype.children = ['variable', 'parent', 'properties'];
+ Class.prototype.isStatement = YES;
+ Class.prototype.makeReturn = function() {
+ this.returns = true;
+ return this;
+ };
+ Class.prototype.compileNode = function(o) {
+ var _i, _len, _ref2, _ref3, _ref4, access, applied, apply, className, constScope, construct, constructor, extension, func, me, pname, prop, props, pvar, ref, returns, val, variable;
+ variable = this.variable;
+ if (variable.value === '__temp__') {
+ variable = new Literal(o.scope.freeVariable('ctor'));
+ }
+ extension = this.parent && new Extends(variable, this.parent);
+ props = new Expressions;
+ o.top = true;
+ me = null;
+ className = variable.compile(o);
+ constScope = null;
+ if (this.parent) {
+ applied = new Value(this.parent, [new Accessor(new Literal('apply'))]);
+ constructor = new Code([], new Expressions([new Call(applied, [new Literal('this'), new Literal('arguments')])]));
+ } else {
+ constructor = new Code([], new Expressions([new Return(new Literal('this'))]));
+ }
+ for (_i = 0, _len = (_ref2 = this.properties).length; _i < _len; _i++) {
+ prop = _ref2[_i];
+ _ref3 = [prop.variable, prop.value], pvar = _ref3[0], func = _ref3[1];
+ if (pvar && pvar.base.value === 'constructor') {
+ if (!(func instanceof Code)) {
+ _ref4 = func.compileReference(o), func = _ref4[0], ref = _ref4[1];
+ if (func !== ref) {
+ props.push(func);
+ }
+ apply = new Call(new Value(ref, [new Accessor(new Literal('apply'))]), [new Literal('this'), new Literal('arguments')]);
+ func = new Code([], new Expressions([apply]));
+ }
+ if (func.bound) {
+ throw new Error("cannot define a constructor as a bound function.");
+ }
+ func.name = className;
+ func.body.push(new Return(new Literal('this')));
+ variable = new Value(variable);
+ variable.namespaced = 0 < className.indexOf('.');
+ constructor = func;
+ if (props.expressions[props.expressions.length - 1] instanceof Comment) {
+ constructor.comment = props.expressions.pop();
+ }
+ continue;
+ }
+ if (func instanceof Code && func.bound) {
+ if (prop.context === 'this') {
+ func.context = className;
+ } else {
+ func.bound = false;
+ constScope || (constScope = new Scope(o.scope, constructor.body, constructor));
+ me || (me = constScope.freeVariable('this'));
+ pname = pvar.compile(o);
+ if (constructor.body.empty()) {
+ constructor.body.push(new Return(new Literal('this')));
+ }
+ constructor.body.unshift(new Literal("this." + pname + " = function(){ return " + className + ".prototype." + pname + ".apply(" + me + ", arguments); }"));
+ }
+ }
+ if (pvar) {
+ access = prop.context === 'this' ? pvar.base.properties[0] : new Accessor(pvar, 'prototype');
+ val = new Value(variable, [access]);
+ prop = new Assign(val, func);
+ }
+ props.push(prop);
+ }
+ constructor.className = className.match(/[\w\d\$_]+$/);
+ if (me) {
+ constructor.body.unshift(new Literal("" + me + " = this"));
+ }
+ construct = this.idt() + new Assign(variable, constructor).compile(merge(o, {
+ sharedScope: constScope
+ })) + ';';
+ props = !props.empty() ? '\n' + props.compile(o) : '';
+ extension = extension ? '\n' + this.idt() + extension.compile(o) + ';' : '';
+ returns = this.returns ? '\n' + new Return(variable).compile(o) : '';
+ return construct + extension + props + returns;
+ };
+ return Class;
+ })();
+ exports.Assign = (function() {
+ Assign = (function() {
+ function Assign(_arg, _arg2, _arg3) {
+ this.context = _arg3;
+ this.value = _arg2;
+ this.variable = _arg;
+ Assign.__super__.constructor.call(this);
+ return this;
+ };
+ return Assign;
+ })();
+ __extends(Assign, Base);
+ Assign.prototype.METHOD_DEF = /^(?:(\S+)\.prototype\.)?([$A-Za-z_][$\w]*)$/;
+ Assign.prototype.children = ['variable', 'value'];
+ Assign.prototype.topSensitive = YES;
+ Assign.prototype.isValue = function() {
+ return this.variable instanceof Value;
+ };
+ Assign.prototype.compileNode = function(o) {
+ var ifn, isValue, match, name, stmt, top, val;
+ if (isValue = this.isValue()) {
+ if (this.variable.isArray() || this.variable.isObject()) {
+ return this.compilePatternMatch(o);
+ }
+ if (this.variable.isSplice()) {
+ return this.compileSplice(o);
+ }
+ if (ifn = If.unfoldSoak(o, this, 'variable')) {
+ delete o.top;
+ return ifn.compile(o);
+ }
+ }
+ top = del(o, 'top');
+ stmt = del(o, 'asStatement');
+ name = this.variable.compile(o);
+ if (this.value instanceof Code && (match = this.METHOD_DEF.exec(name))) {
+ this.value.name = match[2];
+ this.value.klass = match[1];
+ }
+ val = this.value.compile(o);
+ if (this.context === 'object') {
+ return ("" + name + ": " + val);
+ }
+ if (!(isValue && (this.variable.hasProperties() || this.variable.namespaced))) {
+ o.scope.find(name);
+ }
+ val = ("" + name + " = " + val);
+ if (stmt) {
+ return ("" + (this.tab) + val + ";");
+ }
+ return top || this.parenthetical ? val : ("(" + val + ")");
+ };
+ Assign.prototype.compilePatternMatch = function(o) {
+ var _len, _ref2, _ref3, accessClass, assigns, code, i, idx, isObject, obj, objects, olength, otop, ref, splat, top, val, valVar, value;
+ if ((value = this.value).isStatement(o)) {
+ value = Closure.wrap(value);
+ }
+ objects = this.variable.base.objects;
+ if (!(olength = objects.length)) {
+ return value.compile(o);
+ }
+ isObject = this.variable.isObject();
+ if (o.top && olength === 1 && !((obj = objects[0]) instanceof Splat)) {
+ if (obj instanceof Assign) {
+ _ref2 = obj, idx = _ref2.variable.base, obj = _ref2.value;
+ } else {
+ idx = isObject ? (obj.tags["this"] ? obj.properties[0].name : obj) : new Literal(0);
+ }
+ if (!(value instanceof Value)) {
+ value = new Value(value);
+ }
+ accessClass = IDENTIFIER.test(idx.value) ? Accessor : Index;
+ value.properties.push(new accessClass(idx));
+ return new Assign(obj, value).compile(o);
+ }
+ top = del(o, 'top');
+ otop = merge(o, {
+ top: true
+ });
+ valVar = value.compile(o);
+ assigns = [];
+ splat = false;
+ if (!IDENTIFIER.test(valVar) || this.variable.assigns(valVar)) {
+ assigns.push("" + (ref = o.scope.freeVariable('ref')) + " = " + valVar);
+ valVar = ref;
+ }
+ for (i = 0, _len = objects.length; i < _len; i++) {
+ obj = objects[i];
+ idx = i;
+ if (isObject) {
+ if (obj instanceof Assign) {
+ _ref3 = obj, idx = _ref3.variable.base, obj = _ref3.value;
+ } else {
+ idx = obj.tags["this"] ? obj.properties[0].name : obj;
+ }
+ }
+ if (!(obj instanceof Value || obj instanceof Splat)) {
+ throw new Error('pattern matching must use only identifiers on the left-hand side.');
+ }
+ accessClass = isObject && IDENTIFIER.test(idx.value) ? Accessor : Index;
+ if (!splat && obj instanceof Splat) {
+ val = new Literal(obj.compileValue(o, valVar, i, olength - i - 1));
+ splat = true;
+ } else {
+ if (typeof idx !== 'object') {
+ idx = new Literal(splat ? ("" + valVar + ".length - " + (olength - idx)) : idx);
+ }
+ val = new Value(new Literal(valVar), [new accessClass(idx)]);
+ }
+ assigns.push(new Assign(obj, val).compile(otop));
+ }
+ if (!top) {
+ assigns.push(valVar);
+ }
+ code = assigns.join(', ');
+ return top || this.parenthetical ? code : ("(" + code + ")");
+ };
+ Assign.prototype.compileSplice = function(o) {
+ var from, name, plus, range, ref, to, val;
+ range = this.variable.properties.pop().range;
+ name = this.variable.compile(o);
+ plus = range.exclusive ? '' : ' + 1';
+ from = range.from ? range.from.compile(o) : '0';
+ to = range.to ? range.to.compile(o) + ' - ' + from + plus : ("" + name + ".length");
+ ref = o.scope.freeVariable('ref');
+ val = this.value.compile(o);
+ return "([].splice.apply(" + name + ", [" + from + ", " + to + "].concat(" + ref + " = " + val + ")), " + ref + ")";
+ };
+ Assign.prototype.assigns = function(name) {
+ return this[this.context === 'object' ? 'value' : 'variable'].assigns(name);
+ };
+ return Assign;
+ })();
+ exports.Code = (function() {
+ Code = (function() {
+ function Code(_arg, _arg2, tag) {
+ this.body = _arg2;
+ this.params = _arg;
+ Code.__super__.constructor.call(this);
+ this.params || (this.params = []);
+ this.body || (this.body = new Expressions);
+ this.bound = tag === 'boundfunc';
+ if (this.bound) {
+ this.context = 'this';
+ }
+ return this;
+ };
+ return Code;
+ })();
+ __extends(Code, Base);
+ Code.prototype.children = ['params', 'body'];
+ Code.prototype.compileNode = function(o) {
+ var _i, _len, _len2, _ref2, _ref3, _result, close, code, comm, empty, func, i, open, param, params, sharedScope, splat, top, value;
+ sharedScope = del(o, 'sharedScope');
+ top = del(o, 'top');
+ o.scope = sharedScope || new Scope(o.scope, this.body, this);
+ o.top = true;
+ o.indent = this.idt(1);
+ empty = this.body.expressions.length === 0;
+ delete o.bare;
+ delete o.globals;
+ splat = undefined;
+ params = [];
+ for (i = 0, _len = (_ref2 = this.params).length; i < _len; i++) {
+ param = _ref2[i];
+ if (splat) {
+ if (param.attach) {
+ param.assign = new Assign(new Value(new Literal('this'), [new Accessor(param.value)]));
+ this.body.expressions.splice(splat.index + 1, 0, param.assign);
+ }
+ splat.trailings.push(param);
+ } else {
+ if (param.attach) {
+ value = param.value;
+ _ref3 = [new Literal(o.scope.freeVariable('arg')), param.splat], param = _ref3[0], param.splat = _ref3[1];
+ this.body.unshift(new Assign(new Value(new Literal('this'), [new Accessor(value)]), param));
+ }
+ if (param.splat) {
+ splat = new Splat(param.value);
+ splat.index = i;
+ splat.trailings = [];
+ splat.arglength = this.params.length;
+ this.body.unshift(splat);
+ } else {
+ params.push(param);
+ }
+ }
+ }
+ o.scope.startLevel();
+ params = (function() {
+ _result = [];
+ for (_i = 0, _len2 = params.length; _i < _len2; _i++) {
+ param = params[_i];
+ _result.push(param.compile(o));
+ }
+ return _result;
+ })();
+ if (!(empty || this.noReturn)) {
+ this.body.makeReturn();
+ }
+ for (_i = 0, _len2 = params.length; _i < _len2; _i++) {
+ param = params[_i];
+ (o.scope.parameter(param));
+ }
+ comm = this.comment ? this.comment.compile(o) + '\n' : '';
+ if (this.className) {
+ o.indent = this.idt(2);
+ }
+ code = this.body.expressions.length ? ("\n" + (this.body.compileWithDeclarations(o)) + "\n") : '';
+ open = this.className ? ("(function() {\n" + comm + (this.idt(1)) + "function " + (this.className) + "(") : "function(";
+ close = this.className ? ("" + (code && this.idt(1)) + "};\n" + (this.idt(1)) + "return " + (this.className) + ";\n" + (this.tab) + "})()") : ("" + (code && this.tab) + "}");
+ func = ("" + open + (params.join(', ')) + ") {" + code + close);
+ o.scope.endLevel();
+ if (this.bound) {
+ return ("" + (utility('bind')) + "(" + func + ", " + (this.context) + ")");
+ }
+ return this.tags.front ? ("(" + func + ")") : func;
+ };
+ Code.prototype.traverseChildren = function(crossScope, func) {
+ return crossScope ? Code.__super__.traverseChildren.call(this, crossScope, func) : undefined;
+ };
+ return Code;
+ })();
+ exports.Param = (function() {
+ Param = (function() {
+ function Param(_arg, _arg2, _arg3) {
+ this.splat = _arg3;
+ this.attach = _arg2;
+ this.name = _arg;
+ Param.__super__.constructor.call(this);
+ this.value = new Literal(this.name);
+ return this;
+ };
+ return Param;
+ })();
+ __extends(Param, Base);
+ Param.prototype.children = ['name'];
+ Param.prototype.compileNode = function(o) {
+ return this.value.compile(o);
+ };
+ Param.prototype.toString = function() {
+ var name;
+ name = this.name;
+ if (this.attach) {
+ name = '@' + name;
+ }
+ if (this.splat) {
+ name += '...';
+ }
+ return new Literal(name).toString();
+ };
+ return Param;
+ })();
+ exports.Splat = (function() {
+ Splat = (function() {
+ function Splat(name) {
+ Splat.__super__.constructor.call(this);
+ this.name = name.compile ? name : new Literal(name);
+ return this;
+ };
+ return Splat;
+ })();
+ __extends(Splat, Base);
+ Splat.prototype.children = ['name'];
+ Splat.prototype.assigns = function(name) {
+ return this.name.assigns(name);
+ };
+ Splat.prototype.compileNode = function(o) {
+ return (this.index != null) ? this.compileParam(o) : this.name.compile(o);
+ };
+ Splat.prototype.compileParam = function(o) {
+ var _len, _ref2, assign, end, idx, len, name, pos, trailing, variadic;
+ name = this.name.compile(o);
+ o.scope.find(name);
+ end = '';
+ if (this.trailings.length) {
+ len = o.scope.freeVariable('len');
+ o.scope.assign(len, "arguments.length");
+ variadic = o.scope.freeVariable('result');
+ o.scope.assign(variadic, len + ' >= ' + this.arglength);
+ end = this.trailings.length ? (", " + len + " - " + (this.trailings.length)) : undefined;
+ for (idx = 0, _len = (_ref2 = this.trailings).length; idx < _len; idx++) {
+ trailing = _ref2[idx];
+ if (trailing.attach) {
+ assign = trailing.assign;
+ trailing = new Literal(o.scope.freeVariable('arg'));
+ assign.value = trailing;
+ }
+ pos = this.trailings.length - idx;
+ o.scope.assign(trailing.compile(o), "arguments[" + variadic + " ? " + len + " - " + pos + " : " + (this.index + idx) + "]");
+ }
+ }
+ return "" + name + " = " + (utility('slice')) + ".call(arguments, " + (this.index) + end + ")";
+ };
+ Splat.prototype.compileValue = function(o, name, index, trailings) {
+ var trail;
+ trail = trailings ? (", " + name + ".length - " + trailings) : '';
+ return "" + (utility('slice')) + ".call(" + name + ", " + index + trail + ")";
+ };
+ Splat.compileSplattedArray = function(list, o) {
+ var _len, arg, args, code, end, i, prev;
+ args = [];
+ end = -1;
+ for (i = 0, _len = list.length; i < _len; i++) {
+ arg = list[i];
+ code = arg.compile(o);
+ prev = args[end];
+ if (!(arg instanceof Splat)) {
+ if (prev && starts(prev, '[') && ends(prev, ']')) {
+ args[end] = ("" + (prev.slice(0, -1)) + ", " + code + "]");
+ continue;
+ }
+ if (prev && starts(prev, '.concat([') && ends(prev, '])')) {
+ args[end] = ("" + (prev.slice(0, -2)) + ", " + code + "])");
+ continue;
+ }
+ code = ("[" + code + "]");
+ }
+ args[++end] = i === 0 ? code : (".concat(" + code + ")");
+ }
+ return args.join('');
+ };
+ return Splat;
+ }).call(this);
+ exports.While = (function() {
+ While = (function() {
+ function While(condition, opts) {
+ While.__super__.constructor.call(this);
+ this.condition = ((opts != null) ? opts.invert : undefined) ? condition.invert() : condition;
+ this.guard = ((opts != null) ? opts.guard : undefined);
+ return this;
+ };
+ return While;
+ })();
+ __extends(While, Base);
+ While.prototype.children = ['condition', 'guard', 'body'];
+ While.prototype.isStatement = YES;
+ While.prototype.addBody = function(body) {
+ this.body = body;
+ return this;
+ };
+ While.prototype.makeReturn = function() {
+ this.returns = true;
+ return this;
+ };
+ While.prototype.topSensitive = YES;
+ While.prototype.compileNode = function(o) {
+ var cond, post, pre, rvar, set, top;
+ top = del(o, 'top') && !this.returns;
+ o.indent = this.idt(1);
+ this.condition.parenthetical = true;
+ cond = this.condition.compile(o);
+ o.top = true;
+ set = '';
+ if (!top) {
+ rvar = o.scope.freeVariable('result');
+ set = ("" + (this.tab) + rvar + " = [];\n");
+ if (this.body) {
+ this.body = Push.wrap(rvar, this.body);
+ }
+ }
+ pre = ("" + set + (this.tab) + "while (" + cond + ")");
+ if (this.guard) {
+ this.body = Expressions.wrap([new If(this.guard, this.body)]);
+ }
+ if (this.returns) {
+ post = '\n' + new Return(new Literal(rvar)).compile(merge(o, {
+ indent: this.idt()
+ }));
+ } else {
+ post = '';
+ }
+ return "" + pre + " {\n" + (this.body.compile(o)) + "\n" + (this.tab) + "}" + post;
+ };
+ return While;
+ })();
+ exports.Op = (function() {
+ Op = (function() {
+ function Op(op, first, second, flip) {
+ if (op === 'new') {
+ if (first instanceof Call) {
+ return first.newInstance();
+ }
+ if (first instanceof Code && first.bound) {
+ first = new Parens(first);
+ }
+ }
+ Op.__super__.constructor.call(this);
+ this.operator = this.CONVERSIONS[op] || op;
+ (this.first = first).tags.operation = true;
+ if (second) {
+ (this.second = second).tags.operation = true;
+ }
+ this.flip = !!flip;
+ return this;
+ };
+ return Op;
+ })();
+ __extends(Op, Base);
+ Op.prototype.CONVERSIONS = {
+ '==': '===',
+ '!=': '!==',
+ of: 'in'
+ };
+ Op.prototype.INVERSIONS = {
+ '!==': '===',
+ '===': '!=='
+ };
+ Op.prototype.CHAINABLE = ['<', '>', '>=', '<=', '===', '!=='];
+ Op.prototype.ASSIGNMENT = ['||=', '&&=', '?='];
+ Op.prototype.PREFIX_OPERATORS = ['new', 'typeof', 'delete'];
+ Op.prototype.children = ['first', 'second'];
+ Op.prototype.isUnary = function() {
+ return !this.second;
+ };
+ Op.prototype.isComplex = function() {
+ return this.operator !== '!' || this.first.isComplex();
+ };
+ Op.prototype.isMutator = function() {
+ var _ref2;
+ return ends(this.operator, '=') && !((_ref2 = this.operator) === '===' || _ref2 === '!==');
+ };
+ Op.prototype.isChainable = function() {
+ return include(this.CHAINABLE, this.operator);
+ };
+ Op.prototype.invert = function() {
+ var _ref2;
+ if (((_ref2 = this.operator) === '===' || _ref2 === '!==')) {
+ this.operator = this.INVERSIONS[this.operator];
+ return this;
+ } else return this.second ? new Parens(this).invert() : Op.__super__.invert.call(this);
+ };
+ Op.prototype.toString = function(idt) {
+ return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator);
+ };
+ Op.prototype.compileNode = function(o) {
+ if (this.second) {
+ this.first.tags.front = this.tags.front;
+ }
+ if (this.isChainable() && this.first.unwrap() instanceof Op && this.first.unwrap().isChainable()) {
+ return this.compileChain(o);
+ }
+ if (include(this.ASSIGNMENT, this.operator)) {
+ return this.compileAssignment(o);
+ }
+ if (this.isUnary()) {
+ return this.compileUnary(o);
+ }
+ if (this.operator === '?') {
+ return this.compileExistence(o);
+ }
+ if (this.first instanceof Op && this.first.isMutator()) {
+ this.first = new Parens(this.first);
+ }
+ if (this.second instanceof Op && this.second.isMutator()) {
+ this.second = new Parens(this.second);
+ }
+ return [this.first.compile(o), this.operator, this.second.compile(o)].join(' ');
+ };
+ Op.prototype.compileChain = function(o) {
+ var _ref2, _ref3, first, second, shared;
+ shared = this.first.unwrap().second;
+ _ref2 = shared.compileReference(o), this.first.second = _ref2[0], shared = _ref2[1];
+ _ref3 = [this.first.compile(o), this.second.compile(o), shared.compile(o)], first = _ref3[0], second = _ref3[1], shared = _ref3[2];
+ return "(" + first + ") && (" + shared + " " + (this.operator) + " " + second + ")";
+ };
+ Op.prototype.compileAssignment = function(o) {
+ var _ref2, left, rite;
+ _ref2 = this.first.cacheReference(o), left = _ref2[0], rite = _ref2[1];
+ rite = new Assign(rite, this.second);
+ return new Op(this.operator.slice(0, -1), left, rite).compile(o);
+ };
+ Op.prototype.compileExistence = function(o) {
+ var fst, ref;
+ if (this.first.isComplex()) {
+ ref = o.scope.freeVariable('ref');
+ fst = new Parens(new Assign(new Literal(ref), this.first));
+ } else {
+ fst = this.first;
+ ref = fst.compile(o);
+ }
+ return new Existence(fst).compile(o) + (" ? " + ref + " : " + (this.second.compile(o)));
+ };
+ Op.prototype.compileUnary = function(o) {
+ var parts, space;
+ space = include(this.PREFIX_OPERATORS, this.operator) ? ' ' : '';
+ parts = [this.operator, space, this.first.compile(o)];
+ return (this.flip ? parts.reverse() : parts).join('');
+ };
+ return Op;
+ })();
+ exports.In = (function() {
+ In = (function() {
+ function In(_arg, _arg2) {
+ this.array = _arg2;
+ this.object = _arg;
+ In.__super__.constructor.call(this);
+ return this;
+ };
+ return In;
+ })();
+ __extends(In, Base);
+ In.prototype.children = ['object', 'array'];
+ In.prototype.isArray = function() {
+ return this.array instanceof Value && this.array.isArray();
+ };
+ In.prototype.compileNode = function(o) {
+ return this.isArray() ? this.compileOrTest(o) : this.compileLoopTest(o);
+ };
+ In.prototype.compileOrTest = function(o) {
+ var _len, _ref2, _ref3, _result, i, item, obj1, obj2, tests;
+ _ref2 = this.object.compileReference(o, {
+ precompile: true
+ }), obj1 = _ref2[0], obj2 = _ref2[1];
+ tests = (function() {
+ _result = [];
+ for (i = 0, _len = (_ref3 = this.array.base.objects).length; i < _len; i++) {
+ item = _ref3[i];
+ _result.push("" + (i ? obj2 : obj1) + " === " + (item.compile(o)));
+ }
+ return _result;
+ }).call(this);
+ return "(" + (tests.join(' || ')) + ")";
+ };
+ In.prototype.compileLoopTest = function(o) {
+ return "" + (utility('inArray')) + "(" + (this.object.compile(o)) + ", " + (this.array.compile(o)) + ")";
+ };
+ return In;
+ })();
+ exports.Try = (function() {
+ Try = (function() {
+ function Try(_arg, _arg2, _arg3, _arg4) {
+ this.ensure = _arg4;
+ this.recovery = _arg3;
+ this.error = _arg2;
+ this.attempt = _arg;
+ Try.__super__.constructor.call(this);
+ return this;
+ };
+ return Try;
+ })();
+ __extends(Try, Base);
+ Try.prototype.children = ['attempt', 'recovery', 'ensure'];
+ Try.prototype.isStatement = YES;
+ Try.prototype.makeReturn = function() {
+ if (this.attempt) {
+ this.attempt = this.attempt.makeReturn();
+ }
+ if (this.recovery) {
+ this.recovery = this.recovery.makeReturn();
+ }
+ return this;
+ };
+ Try.prototype.compileNode = function(o) {
+ var attemptPart, catchPart, errorPart, finallyPart;
+ o.indent = this.idt(1);
+ o.top = true;
+ attemptPart = this.attempt.compile(o);
+ errorPart = this.error ? (" (" + (this.error.compile(o)) + ") ") : ' ';
+ catchPart = this.recovery ? (" catch" + errorPart + "{\n" + (this.recovery.compile(o)) + "\n" + (this.tab) + "}") : (!(this.ensure || this.recovery) ? ' catch (_e) {}' : '');
+ finallyPart = (this.ensure || '') && ' finally {\n' + this.ensure.compile(merge(o)) + ("\n" + (this.tab) + "}");
+ return "" + (this.tab) + "try {\n" + attemptPart + "\n" + (this.tab) + "}" + catchPart + finallyPart;
+ };
+ return Try;
+ })();
+ exports.Throw = (function() {
+ Throw = (function() {
+ function Throw(_arg) {
+ this.expression = _arg;
+ Throw.__super__.constructor.call(this);
+ return this;
+ };
+ return Throw;
+ })();
+ __extends(Throw, Base);
+ Throw.prototype.children = ['expression'];
+ Throw.prototype.isStatement = YES;
+ Throw.prototype.makeReturn = THIS;
+ Throw.prototype.compileNode = function(o) {
+ return "" + (this.tab) + "throw " + (this.expression.compile(o)) + ";";
+ };
+ return Throw;
+ })();
+ exports.Existence = (function() {
+ Existence = (function() {
+ function Existence(_arg) {
+ this.expression = _arg;
+ Existence.__super__.constructor.call(this);
+ return this;
+ };
+ return Existence;
+ })();
+ __extends(Existence, Base);
+ Existence.prototype.children = ['expression'];
+ Existence.prototype.compileNode = function(o) {
+ var code;
+ code = this.expression.compile(o);
+ code = IDENTIFIER.test(code) && !o.scope.check(code) ? ("typeof " + code + " !== \"undefined\" && " + code + " !== null") : ("" + code + " != null");
+ return this.parenthetical ? code : ("(" + code + ")");
+ };
+ return Existence;
+ })();
+ exports.Parens = (function() {
+ Parens = (function() {
+ function Parens(_arg) {
+ this.expression = _arg;
+ Parens.__super__.constructor.call(this);
+ return this;
+ };
+ return Parens;
+ })();
+ __extends(Parens, Base);
+ Parens.prototype.children = ['expression'];
+ Parens.prototype.isStatement = function(o) {
+ return this.expression.isStatement(o);
+ };
+ Parens.prototype.isComplex = function() {
+ return this.expression.isComplex();
+ };
+ Parens.prototype.topSensitive = YES;
+ Parens.prototype.makeReturn = function() {
+ return this.expression.makeReturn();
+ };
+ Parens.prototype.compileNode = function(o) {
+ var code, top;
+ top = del(o, 'top');
+ this.expression.parenthetical = true;
+ code = this.expression.compile(o);
+ if (top && this.expression.isPureStatement(o)) {
+ return code;
+ }
+ if (this.parenthetical || this.isStatement(o)) {
+ return top ? this.tab + code + ';' : code;
+ }
+ return "(" + code + ")";
+ };
+ return Parens;
+ })();
+ exports.For = (function() {
+ For = (function() {
+ function For(_arg, source, _arg2, _arg3) {
+ var _ref2;
+ this.index = _arg3;
+ this.name = _arg2;
+ this.body = _arg;
+ For.__super__.constructor.call(this);
+ this.source = source.source, this.guard = source.guard, this.step = source.step;
+ this.raw = !!source.raw;
+ this.object = !!source.object;
+ if (this.object) {
+ _ref2 = [this.index, this.name], this.name = _ref2[0], this.index = _ref2[1];
+ }
+ this.pattern = this.name instanceof Value;
+ if (this.index instanceof Value) {
+ throw new Error('index cannot be a pattern matching expression');
+ }
+ this.returns = false;
+ return this;
+ };
+ return For;
+ })();
+ __extends(For, Base);
+ For.prototype.children = ['body', 'source', 'guard'];
+ For.prototype.isStatement = YES;
+ For.prototype.topSensitive = YES;
+ For.prototype.makeReturn = function() {
+ this.returns = true;
+ return this;
+ };
+ For.prototype.compileReturnValue = function(val, o) {
+ if (this.returns) {
+ return '\n' + new Return(new Literal(val)).compile(o);
+ }
+ if (val) {
+ return '\n' + val;
+ }
+ return '';
+ };
+ For.prototype.compileNode = function(o) {
+ var body, codeInBody, forPart, guardPart, idt1, index, ivar, lastLine, lvar, name, namePart, nvar, range, ref, resultPart, returnResult, rvar, scope, source, sourcePart, stepPart, svar, topLevel, unstepPart, varPart, vars;
+ topLevel = del(o, 'top') && !this.returns;
+ range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length;
+ source = range ? this.source.base : this.source;
+ codeInBody = !this.body.containsPureStatement() && this.body.contains(function(node) {
+ return node instanceof Code;
+ });
+ scope = o.scope;
+ name = this.name && this.name.compile(o);
+ index = this.index && this.index.compile(o);
+ if (name && !this.pattern && (range || !codeInBody)) {
+ scope.find(name, {
+ immediate: true
+ });
+ }
+ if (index) {
+ scope.find(index, {
+ immediate: true
+ });
+ }
+ if (!topLevel) {
+ rvar = scope.freeVariable('result');
+ }
+ ivar = range ? name : index;
+ if (!ivar || codeInBody) {
+ ivar = scope.freeVariable('i');
+ }
+ if (name && !range && codeInBody) {
+ nvar = scope.freeVariable('i');
+ }
+ varPart = '';
+ guardPart = '';
+ unstepPart = '';
+ body = Expressions.wrap([this.body]);
+ idt1 = this.idt(1);
+ if (range) {
+ forPart = source.compile(merge(o, {
+ index: ivar,
+ step: this.step
+ }));
+ } else {
+ svar = (sourcePart = this.source.compile(o));
+ if ((name || !this.raw) && !(IDENTIFIER.test(svar) && scope.check(svar, {
+ immediate: true
+ }))) {
+ sourcePart = ("" + (ref = scope.freeVariable('ref')) + " = " + svar);
+ if (!this.object) {
+ sourcePart = ("(" + sourcePart + ")");
+ }
+ svar = ref;
+ }
+ namePart = this.pattern ? new Assign(this.name, new Literal("" + svar + "[" + ivar + "]")).compile(merge(o, {
+ top: true
+ })) : (name ? ("" + name + " = " + svar + "[" + ivar + "]") : undefined);
+ if (!this.object) {
+ lvar = scope.freeVariable('len');
+ stepPart = this.step ? ("" + ivar + " += " + (this.step.compile(o))) : ("" + ivar + "++");
+ forPart = ("" + ivar + " = 0, " + lvar + " = " + sourcePart + ".length; " + ivar + " < " + lvar + "; " + stepPart);
+ }
+ }
+ resultPart = rvar ? ("" + (this.tab) + rvar + " = [];\n") : '';
+ returnResult = this.compileReturnValue(rvar, o);
+ if (!topLevel) {
+ body = Push.wrap(rvar, body);
+ }
+ if (this.guard) {
+ body = Expressions.wrap([new If(this.guard, body)]);
+ }
+ if (codeInBody) {
+ if (range) {
+ body.unshift(new Literal("var " + name + " = " + ivar));
+ }
+ if (namePart) {
+ body.unshift(new Literal("var " + namePart));
+ }
+ if (index) {
+ body.unshift(new Literal("var " + index + " = " + ivar));
+ }
+ lastLine = body.expressions.pop();
+ if (index) {
+ body.push(new Assign(new Literal(ivar), new Literal(index)));
+ }
+ if (nvar) {
+ body.push(new Assign(new Literal(nvar), new Literal(name)));
+ }
+ body.push(lastLine);
+ o.indent = this.idt(1);
+ body = Expressions.wrap([new Literal(body.compile(o))]);
+ if (index) {
+ body.push(new Assign(new Literal(index), new Literal(ivar)));
+ }
+ if (name) {
+ body.push(new Assign(new Literal(name), new Literal(nvar || ivar)));
+ }
+ } else {
+ if (namePart) {
+ varPart = ("" + idt1 + namePart + ";\n");
+ }
+ if (forPart && name === ivar) {
+ unstepPart = this.step ? ("" + name + " -= " + (this.step.compile(o)) + ";") : ("" + name + "--;");
+ unstepPart = ("\n" + (this.tab)) + unstepPart;
+ }
+ }
+ if (this.object) {
+ forPart = ("" + ivar + " in " + sourcePart);
+ if (!this.raw) {
+ guardPart = ("\n" + idt1 + "if (!" + (utility('hasProp')) + ".call(" + svar + ", " + ivar + ")) continue;");
+ }
+ }
+ body = body.compile(merge(o, {
+ indent: idt1,
+ top: true
+ }));
+ vars = range ? name : ("" + name + ", " + ivar);
+ return "" + resultPart + (this.tab) + "for (" + forPart + ") {" + guardPart + "\n" + varPart + body + "\n" + (this.tab) + "}" + unstepPart + returnResult;
+ };
+ return For;
+ })();
+ exports.Switch = (function() {
+ Switch = (function() {
+ function Switch(_arg, _arg2, _arg3) {
+ this.otherwise = _arg3;
+ this.cases = _arg2;
+ this.subject = _arg;
+ Switch.__super__.constructor.call(this);
+ this.tags.subjectless = !this.subject;
+ this.subject || (this.subject = new Literal('true'));
+ return this;
+ };
+ return Switch;
+ })();
+ __extends(Switch, Base);
+ Switch.prototype.children = ['subject', 'cases', 'otherwise'];
+ Switch.prototype.isStatement = YES;
+ Switch.prototype.makeReturn = function() {
+ var _i, _len, _ref2, pair;
+ for (_i = 0, _len = (_ref2 = this.cases).length; _i < _len; _i++) {
+ pair = _ref2[_i];
+ pair[1].makeReturn();
+ }
+ if (this.otherwise) {
+ this.otherwise.makeReturn();
+ }
+ return this;
+ };
+ Switch.prototype.compileNode = function(o) {
+ var _i, _j, _len, _len2, _ref2, _ref3, block, code, condition, conditions, exprs, idt, pair;
+ idt = (o.indent = this.idt(2));
+ o.top = true;
+ code = ("" + (this.tab) + "switch (" + (this.subject.compile(o)) + ") {");
+ for (_i = 0, _len = (_ref2 = this.cases).length; _i < _len; _i++) {
+ pair = _ref2[_i];
+ conditions = pair[0], block = pair[1];
+ exprs = block.expressions;
+ for (_j = 0, _len2 = (_ref3 = flatten([conditions])).length; _j < _len2; _j++) {
+ condition = _ref3[_j];
+ if (this.tags.subjectless) {
+ condition = new Op('!!', new Parens(condition));
+ }
+ code += ("\n" + (this.idt(1)) + "case " + (condition.compile(o)) + ":");
+ }
+ code += ("\n" + (block.compile(o)));
+ if (!(last(exprs) instanceof Return)) {
+ code += ("\n" + idt + "break;");
+ }
+ }
+ if (this.otherwise) {
+ code += ("\n" + (this.idt(1)) + "default:\n" + (this.otherwise.compile(o)));
+ }
+ code += ("\n" + (this.tab) + "}");
+ return code;
+ };
+ return Switch;
+ })();
+ exports.If = (function() {
+ If = (function() {
+ function If(condition, _arg, tags) {
+ this.body = _arg;
+ this.tags = tags || (tags = {});
+ this.condition = tags.invert ? condition.invert() : condition;
+ this.soakNode = tags.soak;
+ this.elseBody = null;
+ this.isChain = false;
+ return this;
+ };
+ return If;
+ })();
+ __extends(If, Base);
+ If.prototype.children = ['condition', 'body', 'elseBody', 'assigner'];
+ If.prototype.topSensitive = YES;
+ If.prototype.bodyNode = function() {
+ var _ref2;
+ return (((_ref2 = this.body) != null) ? _ref2.unwrap() : undefined);
+ };
+ If.prototype.elseBodyNode = function() {
+ var _ref2;
+ return (((_ref2 = this.elseBody) != null) ? _ref2.unwrap() : undefined);
+ };
+ If.prototype.addElse = function(elseBody) {
+ if (this.isChain) {
+ this.elseBodyNode().addElse(elseBody);
+ } else {
+ this.isChain = elseBody instanceof If;
+ this.elseBody = this.ensureExpressions(elseBody);
+ }
+ return this;
+ };
+ If.prototype.isStatement = function(o) {
+ var _ref2;
+ return this.statement || (this.statement = ((o != null) ? o.top : undefined) || this.bodyNode().isStatement(o) || (((_ref2 = this.elseBodyNode()) != null) ? _ref2.isStatement(o) : undefined));
+ };
+ If.prototype.compileCondition = function(o) {
+ this.condition.parenthetical = true;
+ return this.condition.compile(o);
+ };
+ If.prototype.compileNode = function(o) {
+ return this.isStatement(o) ? this.compileStatement(o) : this.compileExpression(o);
+ };
+ If.prototype.makeReturn = function() {
+ if (this.isStatement()) {
+ this.body && (this.body = this.ensureExpressions(this.body.makeReturn()));
+ this.elseBody && (this.elseBody = this.ensureExpressions(this.elseBody.makeReturn()));
+ return this;
+ } else {
+ return new Return(this);
+ }
+ };
+ If.prototype.ensureExpressions = function(node) {
+ return node instanceof Expressions ? node : new Expressions([node]);
+ };
+ If.prototype.compileStatement = function(o) {
+ var child, condO, ifPart, top;
+ top = del(o, 'top');
+ child = del(o, 'chainChild');
+ condO = merge(o);
+ o.indent = this.idt(1);
+ o.top = true;
+ ifPart = ("if (" + (this.compileCondition(condO)) + ") {\n" + (this.body.compile(o)) + "\n" + (this.tab) + "}");
+ if (!child) {
+ ifPart = this.tab + ifPart;
+ }
+ if (!this.elseBody) {
+ return ifPart;
+ }
+ return ifPart + (this.isChain ? ' else ' + this.elseBodyNode().compile(merge(o, {
+ indent: this.tab,
+ chainChild: true
+ })) : (" else {\n" + (this.elseBody.compile(o)) + "\n" + (this.tab) + "}"));
+ };
+ If.prototype.compileExpression = function(o) {
+ var code, elsePart, ifPart;
+ this.bodyNode().tags.operation = (this.condition.tags.operation = true);
+ if (this.elseBody) {
+ this.elseBodyNode().tags.operation = true;
+ }
+ ifPart = this.condition.compile(o) + ' ? ' + this.bodyNode().compile(o);
+ elsePart = this.elseBody ? this.elseBodyNode().compile(o) : 'undefined';
+ code = ("" + ifPart + " : " + elsePart);
+ return this.tags.operation || this.soakNode ? ("(" + code + ")") : code;
+ };
+ If.prototype.unfoldSoak = function() {
+ return this.soakNode && this;
+ };
+ If.unfoldSoak = function(o, parent, name) {
+ var ifn;
+ if (!(ifn = parent[name].unfoldSoak(o))) {
+ return;
+ }
+ parent[name] = ifn.body;
+ ifn.body = new Value(parent);
+ return ifn;
+ };
+ return If;
+ }).call(this);
+ Push = {
+ wrap: function(name, expressions) {
+ if (expressions.empty() || expressions.containsPureStatement()) {
+ return expressions;
+ }
+ return Expressions.wrap([new Call(new Value(new Literal(name), [new Accessor(new Literal('push'))]), [expressions.unwrap()])]);
+ }
+ };
+ Closure = {
+ wrap: function(expressions, statement, noReturn) {
+ var args, call, func, mentionsArgs, meth;
+ if (expressions.containsPureStatement()) {
+ return expressions;
+ }
+ func = new Parens(new Code([], Expressions.wrap([expressions])));
+ args = [];
+ if ((mentionsArgs = expressions.contains(this.literalArgs)) || (expressions.contains(this.literalThis))) {
+ meth = new Literal(mentionsArgs ? 'apply' : 'call');
+ args = [new Literal('this')];
+ if (mentionsArgs) {
+ args.push(new Literal('arguments'));
+ }
+ func = new Value(func, [new Accessor(meth)]);
+ func.noReturn = noReturn;
+ }
+ call = new Call(func, args);
+ return statement ? Expressions.wrap([call]) : call;
+ },
+ literalArgs: function(node) {
+ return node instanceof Literal && node.value === 'arguments';
+ },
+ literalThis: function(node) {
+ return node instanceof Literal && node.value === 'this' || node instanceof Code && node.bound;
+ }
+ };
+ UTILITIES = {
+ "extends": 'function(child, parent) {\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor;\n if (typeof parent.extended === "function") parent.extended(child);\n child.__super__ = parent.prototype;\n}',
+ bind: 'function(func, context) {\n return function() { return func.apply(context, arguments); };\n}',
+ inArray: '(function() {\n var indexOf = Array.prototype.indexOf || function(item) {\n var i = this.length; while (i--) if (this[i] === item) return i;\n return -1;\n };\n return function(item, array) { return indexOf.call(array, item) > -1; };\n})();',
+ hasProp: 'Object.prototype.hasOwnProperty',
+ slice: 'Array.prototype.slice'
+ };
+ TAB = ' ';
+ TRAILING_WHITESPACE = /[ \t]+$/gm;
+ IDENTIFIER = /^[$A-Za-z_][$\w]*$/;
+ NUMBER = /^0x[\da-f]+|^(?:\d+(\.\d+)?|\.\d+)(?:e[+-]?\d+)?$/i;
+ SIMPLENUM = /^[+-]?\d+$/;
+ IS_STRING = /^['"]/;
+ utility = function(name) {
+ var ref;
+ ref = ("__" + name);
+ Scope.root.assign(ref, UTILITIES[name]);
+ return ref;
+ };
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/optparse.js b/node_modules/jade/support/coffee-script/lib/optparse.js
new file mode 100755
index 0000000..4a9ae28
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/optparse.js
@@ -0,0 +1,107 @@
+(function() {
+ var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments;
+ exports.OptionParser = (function() {
+ OptionParser = (function() {
+ function OptionParser(rules, banner) {
+ this.banner = banner;
+ this.rules = buildRules(rules);
+ return this;
+ };
+ return OptionParser;
+ })();
+ OptionParser.prototype.parse = function(args) {
+ var _i, _len, _len2, _ref, arg, i, isOption, matchedRule, options, rule, value;
+ options = {
+ arguments: []
+ };
+ args = normalizeArguments(args);
+ for (i = 0, _len = args.length; i < _len; i++) {
+ arg = args[i];
+ isOption = !!(arg.match(LONG_FLAG) || arg.match(SHORT_FLAG));
+ matchedRule = false;
+ for (_i = 0, _len2 = (_ref = this.rules).length; _i < _len2; _i++) {
+ rule = _ref[_i];
+ if (rule.shortFlag === arg || rule.longFlag === arg) {
+ value = rule.hasArgument ? args[i += 1] : true;
+ options[rule.name] = rule.isList ? (options[rule.name] || []).concat(value) : value;
+ matchedRule = true;
+ break;
+ }
+ }
+ if (isOption && !matchedRule) {
+ throw new Error("unrecognized option: " + arg);
+ }
+ if (!isOption) {
+ options.arguments = args.slice(i);
+ break;
+ }
+ }
+ return options;
+ };
+ OptionParser.prototype.help = function() {
+ var _i, _len, _ref, letPart, lines, rule, spaces;
+ lines = ['Available options:'];
+ if (this.banner) {
+ lines.unshift("" + (this.banner) + "\n");
+ }
+ for (_i = 0, _len = (_ref = this.rules).length; _i < _len; _i++) {
+ rule = _ref[_i];
+ spaces = 15 - rule.longFlag.length;
+ spaces = spaces > 0 ? Array(spaces + 1).join(' ') : '';
+ letPart = rule.shortFlag ? rule.shortFlag + ', ' : ' ';
+ lines.push(' ' + letPart + rule.longFlag + spaces + rule.description);
+ }
+ return "\n" + (lines.join('\n')) + "\n";
+ };
+ return OptionParser;
+ })();
+ LONG_FLAG = /^(--\w[\w\-]+)/;
+ SHORT_FLAG = /^(-\w)/;
+ MULTI_FLAG = /^-(\w{2,})/;
+ OPTIONAL = /\[(\w+(\*?))\]/;
+ buildRules = function(rules) {
+ var _i, _len, _result, tuple;
+ _result = [];
+ for (_i = 0, _len = rules.length; _i < _len; _i++) {
+ tuple = rules[_i];
+ _result.push((function() {
+ if (tuple.length < 3) {
+ tuple.unshift(null);
+ }
+ return buildRule.apply(buildRule, tuple);
+ })());
+ }
+ return _result;
+ };
+ buildRule = function(shortFlag, longFlag, description, options) {
+ var match;
+ match = longFlag.match(OPTIONAL);
+ longFlag = longFlag.match(LONG_FLAG)[1];
+ options || (options = {});
+ return {
+ name: longFlag.substr(2),
+ shortFlag: shortFlag,
+ longFlag: longFlag,
+ description: description,
+ hasArgument: !!(match && match[1]),
+ isList: !!(match && match[2])
+ };
+ };
+ normalizeArguments = function(args) {
+ var _i, _j, _len, _len2, _ref, arg, l, match, result;
+ args = args.slice(0);
+ result = [];
+ for (_i = 0, _len = args.length; _i < _len; _i++) {
+ arg = args[_i];
+ if (match = arg.match(MULTI_FLAG)) {
+ for (_j = 0, _len2 = (_ref = match[1].split('')).length; _j < _len2; _j++) {
+ l = _ref[_j];
+ result.push('-' + l);
+ }
+ } else {
+ result.push(arg);
+ }
+ }
+ return result;
+ };
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/parser.js b/node_modules/jade/support/coffee-script/lib/parser.js
new file mode 100755
index 0000000..e77d3bc
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/parser.js
@@ -0,0 +1,687 @@
+/* Jison generated parser */
+var parser = (function(){
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"Root":3,"TERMINATOR":4,"Body":5,"Block":6,"Line":7,"Expression":8,"Statement":9,"Return":10,"Throw":11,"BREAK":12,"CONTINUE":13,"DEBUGGER":14,"Value":15,"Invocation":16,"Code":17,"Operation":18,"Assign":19,"If":20,"Try":21,"While":22,"For":23,"Switch":24,"Extends":25,"Class":26,"Existence":27,"Comment":28,"INDENT":29,"OUTDENT":30,"Identifier":31,"IDENTIFIER":32,"AlphaNumeric":33,"NUMBER":34,"STRING":35,"Literal":36,"JS":37,"REGEX":38,"BOOL":39,"Assignable":40,"=":41,"AssignObj":42,"ThisProperty":43,":":44,"RETURN":45,"HERECOMMENT":46,"?":47,"PARAM_START":48,"ParamList":49,"PARAM_END":50,"FuncGlyph":51,"->":52,"=>":53,"OptComma":54,",":55,"Param":56,"PARAM":57,"@":58,"...":59,"Splat":60,"SimpleAssignable":61,"Accessor":62,"Array":63,"Object":64,"Parenthetical":65,"Range":66,"This":67,"PROPERTY_ACCESS":68,"PROTOTYPE_ACCESS":69,"::":70,"SOAK_ACCESS":71,"Index":72,"Slice":73,"INDEX_START":74,"INDEX_END":75,"INDEX_SOAK":76,"INDEX_PROTO":77,"{":78,"AssignList":79,"}":80,"CLASS":81,"EXTENDS":82,"ClassBody":83,"ClassAssign":84,"OptFuncExist":85,"Arguments":86,"SUPER":87,"FUNC_EXIST":88,"CALL_START":89,"CALL_END":90,"ArgList":91,"THIS":92,"RangeDots":93,"..":94,"[":95,"]":96,"Arg":97,"SimpleArgs":98,"TRY":99,"Catch":100,"FINALLY":101,"CATCH":102,"THROW":103,"(":104,")":105,"WhileSource":106,"WHILE":107,"WHEN":108,"UNTIL":109,"Loop":110,"LOOP":111,"ForBody":112,"FOR":113,"ForStart":114,"ForSource":115,"ForVariables":116,"ALL":117,"ForValue":118,"FORIN":119,"FOROF":120,"BY":121,"SWITCH":122,"Whens":123,"ELSE":124,"When":125,"LEADING_WHEN":126,"IfBlock":127,"IF":128,"UNLESS":129,"POST_IF":130,"POST_UNLESS":131,"UNARY":132,"-":133,"+":134,"--":135,"++":136,"==":137,"!=":138,"MATH":139,"SHIFT":140,"COMPARE":141,"LOGIC":142,"COMPOUND_ASSIGN":143,"RELATION":144,"$accept":0,"$end":1},
+terminals_: {"2":"error","4":"TERMINATOR","12":"BREAK","13":"CONTINUE","14":"DEBUGGER","29":"INDENT","30":"OUTDENT","32":"IDENTIFIER","34":"NUMBER","35":"STRING","37":"JS","38":"REGEX","39":"BOOL","41":"=","44":":","45":"RETURN","46":"HERECOMMENT","47":"?","48":"PARAM_START","50":"PARAM_END","52":"->","53":"=>","55":",","57":"PARAM","58":"@","59":"...","68":"PROPERTY_ACCESS","69":"PROTOTYPE_ACCESS","70":"::","71":"SOAK_ACCESS","74":"INDEX_START","75":"INDEX_END","76":"INDEX_SOAK","77":"INDEX_PROTO","78":"{","80":"}","81":"CLASS","82":"EXTENDS","87":"SUPER","88":"FUNC_EXIST","89":"CALL_START","90":"CALL_END","92":"THIS","94":"..","95":"[","96":"]","99":"TRY","101":"FINALLY","102":"CATCH","103":"THROW","104":"(","105":")","107":"WHILE","108":"WHEN","109":"UNTIL","111":"LOOP","113":"FOR","117":"ALL","119":"FORIN","120":"FOROF","121":"BY","122":"SWITCH","124":"ELSE","126":"LEADING_WHEN","128":"IF","129":"UNLESS","130":"POST_IF","131":"POST_UNLESS","132":"UNARY","133":"-","134":"+","135":"--","136":"++","137":"==","138":"!=","139":"MATH","140":"SHIFT","141":"COMPARE","142":"LOGIC","143":"COMPOUND_ASSIGN","144":"RELATION"},
+productions_: [0,[3,0],[3,1],[3,1],[3,2],[5,1],[5,3],[5,2],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[6,3],[6,2],[6,2],[31,1],[33,1],[33,1],[36,1],[36,1],[36,1],[36,1],[19,3],[19,5],[42,1],[42,1],[42,1],[42,3],[42,3],[42,5],[42,5],[42,1],[10,2],[10,1],[28,1],[27,2],[17,5],[17,2],[51,1],[51,1],[54,0],[54,1],[49,0],[49,1],[49,3],[56,1],[56,2],[56,2],[56,3],[60,2],[61,1],[61,2],[61,2],[61,1],[40,1],[40,1],[40,1],[15,1],[15,1],[15,1],[15,1],[15,1],[62,2],[62,2],[62,1],[62,2],[62,1],[62,1],[72,3],[72,2],[72,2],[64,4],[79,0],[79,1],[79,3],[79,4],[79,6],[26,2],[26,4],[26,5],[26,7],[26,4],[26,1],[26,3],[26,6],[84,1],[84,3],[84,5],[83,0],[83,1],[83,3],[83,3],[25,3],[16,3],[16,3],[16,1],[16,2],[85,0],[85,1],[86,2],[86,4],[67,1],[67,1],[93,1],[93,1],[43,2],[66,5],[73,5],[73,4],[73,4],[63,2],[63,4],[91,1],[91,3],[91,4],[91,4],[91,6],[97,1],[97,1],[98,1],[98,3],[21,2],[21,3],[21,4],[21,5],[100,3],[11,2],[65,3],[65,2],[106,2],[106,4],[106,2],[106,4],[22,2],[22,2],[22,2],[22,1],[110,2],[110,2],[23,2],[23,2],[23,2],[112,2],[112,2],[114,2],[114,3],[118,1],[118,1],[118,1],[116,1],[116,3],[115,2],[115,2],[115,4],[115,4],[115,4],[115,6],[115,6],[24,5],[24,7],[24,4],[24,6],[123,1],[123,2],[125,3],[125,4],[127,3],[127,3],[127,5],[127,3],[20,1],[20,3],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,3]],
+performAction: function anonymous(yytext,yyleng,yylineno,yy) {
+
+var $$ = arguments[5],$0=arguments[5].length;
+switch(arguments[4]) {
+case 1:return this.$ = new yy.Expressions;
+break;
+case 2:return this.$ = new yy.Expressions;
+break;
+case 3:return this.$ = $$[$0-1+1-1];
+break;
+case 4:return this.$ = $$[$0-2+1-1];
+break;
+case 5:this.$ = yy.Expressions.wrap([$$[$0-1+1-1]]);
+break;
+case 6:this.$ = $$[$0-3+1-1].push($$[$0-3+3-1]);
+break;
+case 7:this.$ = $$[$0-2+1-1];
+break;
+case 8:this.$ = $$[$0-1+1-1];
+break;
+case 9:this.$ = $$[$0-1+1-1];
+break;
+case 10:this.$ = $$[$0-1+1-1];
+break;
+case 11:this.$ = $$[$0-1+1-1];
+break;
+case 12:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 13:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 14:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 15:this.$ = $$[$0-1+1-1];
+break;
+case 16:this.$ = $$[$0-1+1-1];
+break;
+case 17:this.$ = $$[$0-1+1-1];
+break;
+case 18:this.$ = $$[$0-1+1-1];
+break;
+case 19:this.$ = $$[$0-1+1-1];
+break;
+case 20:this.$ = $$[$0-1+1-1];
+break;
+case 21:this.$ = $$[$0-1+1-1];
+break;
+case 22:this.$ = $$[$0-1+1-1];
+break;
+case 23:this.$ = $$[$0-1+1-1];
+break;
+case 24:this.$ = $$[$0-1+1-1];
+break;
+case 25:this.$ = $$[$0-1+1-1];
+break;
+case 26:this.$ = $$[$0-1+1-1];
+break;
+case 27:this.$ = $$[$0-1+1-1];
+break;
+case 28:this.$ = $$[$0-1+1-1];
+break;
+case 29:this.$ = $$[$0-3+2-1];
+break;
+case 30:this.$ = new yy.Expressions;
+break;
+case 31:this.$ = yy.Expressions.wrap([$$[$0-2+2-1]]);
+break;
+case 32:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 33:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 34:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 35:this.$ = $$[$0-1+1-1];
+break;
+case 36:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 37:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 38:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 39:this.$ = new yy.Assign($$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 40:this.$ = new yy.Assign($$[$0-5+1-1], $$[$0-5+4-1]);
+break;
+case 41:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 42:this.$ = $$[$0-1+1-1];
+break;
+case 43:this.$ = $$[$0-1+1-1];
+break;
+case 44:this.$ = new yy.Assign(new yy.Value($$[$0-3+1-1]), $$[$0-3+3-1], 'object');
+break;
+case 45:this.$ = new yy.Assign(new yy.Value($$[$0-3+1-1]), $$[$0-3+3-1], 'object');
+break;
+case 46:this.$ = new yy.Assign(new yy.Value($$[$0-5+1-1]), $$[$0-5+4-1], 'object');
+break;
+case 47:this.$ = new yy.Assign(new yy.Value($$[$0-5+1-1]), $$[$0-5+4-1], 'object');
+break;
+case 48:this.$ = $$[$0-1+1-1];
+break;
+case 49:this.$ = new yy.Return($$[$0-2+2-1]);
+break;
+case 50:this.$ = new yy.Return;
+break;
+case 51:this.$ = new yy.Comment($$[$0-1+1-1]);
+break;
+case 52:this.$ = new yy.Existence($$[$0-2+1-1]);
+break;
+case 53:this.$ = new yy.Code($$[$0-5+2-1], $$[$0-5+5-1], $$[$0-5+4-1]);
+break;
+case 54:this.$ = new yy.Code([], $$[$0-2+2-1], $$[$0-2+1-1]);
+break;
+case 55:this.$ = 'func';
+break;
+case 56:this.$ = 'boundfunc';
+break;
+case 57:this.$ = $$[$0-1+1-1];
+break;
+case 58:this.$ = $$[$0-1+1-1];
+break;
+case 59:this.$ = [];
+break;
+case 60:this.$ = [$$[$0-1+1-1]];
+break;
+case 61:this.$ = $$[$0-3+1-1].concat($$[$0-3+3-1]);
+break;
+case 62:this.$ = new yy.Literal($$[$0-1+1-1]);
+break;
+case 63:this.$ = new yy.Param($$[$0-2+2-1], true);
+break;
+case 64:this.$ = new yy.Param($$[$0-2+1-1], false, true);
+break;
+case 65:this.$ = new yy.Param($$[$0-3+2-1], true, true);
+break;
+case 66:this.$ = new yy.Splat($$[$0-2+1-1]);
+break;
+case 67:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 68:this.$ = $$[$0-2+1-1].push($$[$0-2+2-1]);
+break;
+case 69:this.$ = new yy.Value($$[$0-2+1-1], [$$[$0-2+2-1]]);
+break;
+case 70:this.$ = $$[$0-1+1-1];
+break;
+case 71:this.$ = $$[$0-1+1-1];
+break;
+case 72:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 73:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 74:this.$ = $$[$0-1+1-1];
+break;
+case 75:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 76:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 77:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 78:this.$ = $$[$0-1+1-1];
+break;
+case 79:this.$ = new yy.Accessor($$[$0-2+2-1]);
+break;
+case 80:this.$ = new yy.Accessor($$[$0-2+2-1], 'prototype');
+break;
+case 81:this.$ = new yy.Accessor(new yy.Literal('prototype'));
+break;
+case 82:this.$ = new yy.Accessor($$[$0-2+2-1], 'soak');
+break;
+case 83:this.$ = $$[$0-1+1-1];
+break;
+case 84:this.$ = new yy.Slice($$[$0-1+1-1]);
+break;
+case 85:this.$ = new yy.Index($$[$0-3+2-1]);
+break;
+case 86:this.$ = (function () {
+ $$[$0-2+2-1].soakNode = true;
+ return $$[$0-2+2-1];
+ }());
+break;
+case 87:this.$ = (function () {
+ $$[$0-2+2-1].proto = true;
+ return $$[$0-2+2-1];
+ }());
+break;
+case 88:this.$ = new yy.ObjectLiteral($$[$0-4+2-1]);
+break;
+case 89:this.$ = [];
+break;
+case 90:this.$ = [$$[$0-1+1-1]];
+break;
+case 91:this.$ = $$[$0-3+1-1].concat($$[$0-3+3-1]);
+break;
+case 92:this.$ = $$[$0-4+1-1].concat($$[$0-4+4-1]);
+break;
+case 93:this.$ = $$[$0-6+1-1].concat($$[$0-6+4-1]);
+break;
+case 94:this.$ = new yy.Class($$[$0-2+2-1]);
+break;
+case 95:this.$ = new yy.Class($$[$0-4+2-1], $$[$0-4+4-1]);
+break;
+case 96:this.$ = new yy.Class($$[$0-5+2-1], null, $$[$0-5+4-1]);
+break;
+case 97:this.$ = new yy.Class($$[$0-7+2-1], $$[$0-7+4-1], $$[$0-7+6-1]);
+break;
+case 98:this.$ = new yy.Class('__temp__', null, $$[$0-4+3-1]);
+break;
+case 99:this.$ = new yy.Class('__temp__', null, new yy.Expressions);
+break;
+case 100:this.$ = new yy.Class('__temp__', $$[$0-3+3-1], new yy.Expressions);
+break;
+case 101:this.$ = new yy.Class('__temp__', $$[$0-6+3-1], $$[$0-6+5-1]);
+break;
+case 102:this.$ = $$[$0-1+1-1];
+break;
+case 103:this.$ = new yy.Assign(new yy.Value($$[$0-3+1-1]), $$[$0-3+3-1], 'this');
+break;
+case 104:this.$ = new yy.Assign(new yy.Value($$[$0-5+1-1]), $$[$0-5+4-1], 'this');
+break;
+case 105:this.$ = [];
+break;
+case 106:this.$ = [$$[$0-1+1-1]];
+break;
+case 107:this.$ = $$[$0-3+1-1].concat($$[$0-3+3-1]);
+break;
+case 108:this.$ = $$[$0-3+2-1];
+break;
+case 109:this.$ = new yy.Extends($$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 110:this.$ = new yy.Call($$[$0-3+1-1], $$[$0-3+3-1], $$[$0-3+2-1]);
+break;
+case 111:this.$ = new yy.Call($$[$0-3+1-1], $$[$0-3+3-1], $$[$0-3+2-1]);
+break;
+case 112:this.$ = new yy.Call('super', [new yy.Splat(new yy.Literal('arguments'))]);
+break;
+case 113:this.$ = new yy.Call('super', $$[$0-2+2-1]);
+break;
+case 114:this.$ = false;
+break;
+case 115:this.$ = true;
+break;
+case 116:this.$ = [];
+break;
+case 117:this.$ = $$[$0-4+2-1];
+break;
+case 118:this.$ = new yy.Value(new yy.Literal('this'));
+break;
+case 119:this.$ = new yy.Value(new yy.Literal('this'));
+break;
+case 120:this.$ = 'inclusive';
+break;
+case 121:this.$ = 'exclusive';
+break;
+case 122:this.$ = new yy.Value(new yy.Literal('this'), [new yy.Accessor($$[$0-2+2-1])], 'this');
+break;
+case 123:this.$ = new yy.Range($$[$0-5+2-1], $$[$0-5+4-1], $$[$0-5+3-1]);
+break;
+case 124:this.$ = new yy.Range($$[$0-5+2-1], $$[$0-5+4-1], $$[$0-5+3-1]);
+break;
+case 125:this.$ = new yy.Range($$[$0-4+2-1], null, $$[$0-4+3-1]);
+break;
+case 126:this.$ = new yy.Range(null, $$[$0-4+3-1], $$[$0-4+2-1]);
+break;
+case 127:this.$ = new yy.ArrayLiteral([]);
+break;
+case 128:this.$ = new yy.ArrayLiteral($$[$0-4+2-1]);
+break;
+case 129:this.$ = [$$[$0-1+1-1]];
+break;
+case 130:this.$ = $$[$0-3+1-1].concat($$[$0-3+3-1]);
+break;
+case 131:this.$ = $$[$0-4+1-1].concat($$[$0-4+4-1]);
+break;
+case 132:this.$ = $$[$0-4+2-1];
+break;
+case 133:this.$ = $$[$0-6+1-1].concat($$[$0-6+4-1]);
+break;
+case 134:this.$ = $$[$0-1+1-1];
+break;
+case 135:this.$ = $$[$0-1+1-1];
+break;
+case 136:this.$ = $$[$0-1+1-1];
+break;
+case 137:this.$ = [].concat($$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 138:this.$ = new yy.Try($$[$0-2+2-1]);
+break;
+case 139:this.$ = new yy.Try($$[$0-3+2-1], $$[$0-3+3-1][0], $$[$0-3+3-1][1]);
+break;
+case 140:this.$ = new yy.Try($$[$0-4+2-1], null, null, $$[$0-4+4-1]);
+break;
+case 141:this.$ = new yy.Try($$[$0-5+2-1], $$[$0-5+3-1][0], $$[$0-5+3-1][1], $$[$0-5+5-1]);
+break;
+case 142:this.$ = [$$[$0-3+2-1], $$[$0-3+3-1]];
+break;
+case 143:this.$ = new yy.Throw($$[$0-2+2-1]);
+break;
+case 144:this.$ = new yy.Parens($$[$0-3+2-1]);
+break;
+case 145:this.$ = new yy.Parens(new yy.Literal(''));
+break;
+case 146:this.$ = new yy.While($$[$0-2+2-1]);
+break;
+case 147:this.$ = new yy.While($$[$0-4+2-1], {
+ guard: $$[$0-4+4-1]
+ });
+break;
+case 148:this.$ = new yy.While($$[$0-2+2-1], {
+ invert: true
+ });
+break;
+case 149:this.$ = new yy.While($$[$0-4+2-1], {
+ invert: true,
+ guard: $$[$0-4+4-1]
+ });
+break;
+case 150:this.$ = $$[$0-2+1-1].addBody($$[$0-2+2-1]);
+break;
+case 151:this.$ = $$[$0-2+2-1].addBody(yy.Expressions.wrap([$$[$0-2+1-1]]));
+break;
+case 152:this.$ = $$[$0-2+2-1].addBody(yy.Expressions.wrap([$$[$0-2+1-1]]));
+break;
+case 153:this.$ = $$[$0-1+1-1];
+break;
+case 154:this.$ = new yy.While(new yy.Literal('true')).addBody($$[$0-2+2-1]);
+break;
+case 155:this.$ = new yy.While(new yy.Literal('true')).addBody(yy.Expressions.wrap([$$[$0-2+2-1]]));
+break;
+case 156:this.$ = new yy.For($$[$0-2+1-1], $$[$0-2+2-1], $$[$0-2+2-1].vars[0], $$[$0-2+2-1].vars[1]);
+break;
+case 157:this.$ = new yy.For($$[$0-2+1-1], $$[$0-2+2-1], $$[$0-2+2-1].vars[0], $$[$0-2+2-1].vars[1]);
+break;
+case 158:this.$ = new yy.For($$[$0-2+2-1], $$[$0-2+1-1], $$[$0-2+1-1].vars[0], $$[$0-2+1-1].vars[1]);
+break;
+case 159:this.$ = {
+ source: new yy.Value($$[$0-2+2-1]),
+ vars: []
+ };
+break;
+case 160:this.$ = (function () {
+ $$[$0-2+2-1].raw = $$[$0-2+1-1].raw;
+ $$[$0-2+2-1].vars = $$[$0-2+1-1];
+ return $$[$0-2+2-1];
+ }());
+break;
+case 161:this.$ = $$[$0-2+2-1];
+break;
+case 162:this.$ = (function () {
+ $$[$0-3+3-1].raw = true;
+ return $$[$0-3+3-1];
+ }());
+break;
+case 163:this.$ = $$[$0-1+1-1];
+break;
+case 164:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 165:this.$ = new yy.Value($$[$0-1+1-1]);
+break;
+case 166:this.$ = [$$[$0-1+1-1]];
+break;
+case 167:this.$ = [$$[$0-3+1-1], $$[$0-3+3-1]];
+break;
+case 168:this.$ = {
+ source: $$[$0-2+2-1]
+ };
+break;
+case 169:this.$ = {
+ source: $$[$0-2+2-1],
+ object: true
+ };
+break;
+case 170:this.$ = {
+ source: $$[$0-4+2-1],
+ guard: $$[$0-4+4-1]
+ };
+break;
+case 171:this.$ = {
+ source: $$[$0-4+2-1],
+ guard: $$[$0-4+4-1],
+ object: true
+ };
+break;
+case 172:this.$ = {
+ source: $$[$0-4+2-1],
+ step: $$[$0-4+4-1]
+ };
+break;
+case 173:this.$ = {
+ source: $$[$0-6+2-1],
+ guard: $$[$0-6+4-1],
+ step: $$[$0-6+6-1]
+ };
+break;
+case 174:this.$ = {
+ source: $$[$0-6+2-1],
+ step: $$[$0-6+4-1],
+ guard: $$[$0-6+6-1]
+ };
+break;
+case 175:this.$ = new yy.Switch($$[$0-5+2-1], $$[$0-5+4-1]);
+break;
+case 176:this.$ = new yy.Switch($$[$0-7+2-1], $$[$0-7+4-1], $$[$0-7+6-1]);
+break;
+case 177:this.$ = new yy.Switch(null, $$[$0-4+3-1]);
+break;
+case 178:this.$ = new yy.Switch(null, $$[$0-6+3-1], $$[$0-6+5-1]);
+break;
+case 179:this.$ = $$[$0-1+1-1];
+break;
+case 180:this.$ = $$[$0-2+1-1].concat($$[$0-2+2-1]);
+break;
+case 181:this.$ = [[$$[$0-3+2-1], $$[$0-3+3-1]]];
+break;
+case 182:this.$ = [[$$[$0-4+2-1], $$[$0-4+3-1]]];
+break;
+case 183:this.$ = new yy.If($$[$0-3+2-1], $$[$0-3+3-1]);
+break;
+case 184:this.$ = new yy.If($$[$0-3+2-1], $$[$0-3+3-1], {
+ invert: true
+ });
+break;
+case 185:this.$ = $$[$0-5+1-1].addElse(new yy.If($$[$0-5+4-1], $$[$0-5+5-1]));
+break;
+case 186:this.$ = $$[$0-3+1-1].addElse($$[$0-3+3-1]);
+break;
+case 187:this.$ = $$[$0-1+1-1];
+break;
+case 188:this.$ = new yy.If($$[$0-3+3-1], yy.Expressions.wrap([$$[$0-3+1-1]]), {
+ statement: true
+ });
+break;
+case 189:this.$ = new yy.If($$[$0-3+3-1], yy.Expressions.wrap([$$[$0-3+1-1]]), {
+ statement: true
+ });
+break;
+case 190:this.$ = new yy.If($$[$0-3+3-1], yy.Expressions.wrap([$$[$0-3+1-1]]), {
+ statement: true,
+ invert: true
+ });
+break;
+case 191:this.$ = new yy.If($$[$0-3+3-1], yy.Expressions.wrap([$$[$0-3+1-1]]), {
+ statement: true,
+ invert: true
+ });
+break;
+case 192:this.$ = new yy.Op($$[$0-2+1-1], $$[$0-2+2-1]);
+break;
+case 193:this.$ = new yy.Op('-', $$[$0-2+2-1]);
+break;
+case 194:this.$ = new yy.Op('+', $$[$0-2+2-1]);
+break;
+case 195:this.$ = new yy.Op('--', $$[$0-2+2-1]);
+break;
+case 196:this.$ = new yy.Op('++', $$[$0-2+2-1]);
+break;
+case 197:this.$ = new yy.Op('--', $$[$0-2+1-1], null, true);
+break;
+case 198:this.$ = new yy.Op('++', $$[$0-2+1-1], null, true);
+break;
+case 199:this.$ = new yy.Op('+', $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 200:this.$ = new yy.Op('-', $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 201:this.$ = new yy.Op('==', $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 202:this.$ = new yy.Op('!=', $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 203:this.$ = new yy.Op($$[$0-3+2-1], $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 204:this.$ = new yy.Op($$[$0-3+2-1], $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 205:this.$ = new yy.Op($$[$0-3+2-1], $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 206:this.$ = new yy.Op($$[$0-3+2-1], $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 207:this.$ = new yy.Op($$[$0-3+2-1], $$[$0-3+1-1], $$[$0-3+3-1]);
+break;
+case 208:this.$ = new yy.Op($$[$0-5+2-1], $$[$0-5+1-1], $$[$0-5+4-1]);
+break;
+case 209:this.$ = $$[$0-3+2-1].charAt(0) === '!' ? ($$[$0-3+2-1] === '!in' ? new yy.Op('!', new yy.In($$[$0-3+1-1], $$[$0-3+3-1])) : new yy.Op('!', new yy.Parens(new yy.Op($$[$0-3+2-1].slice(1), $$[$0-3+1-1], $$[$0-3+3-1])))) : ($$[$0-3+2-1] === 'in' ? new yy.In($$[$0-3+1-1], $$[$0-3+3-1]) : new yy.Op($$[$0-3+2-1], $$[$0-3+1-1], $$[$0-3+3-1]));
+break;
+}
+},
+table: [{"1":[2,1],"3":1,"4":[1,2],"5":3,"6":4,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[3]},{"1":[2,2],"28":77,"46":[1,49]},{"1":[2,3],"4":[1,78]},{"4":[1,79]},{"1":[2,5],"4":[2,5],"30":[2,5]},{"5":80,"7":5,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[1,81],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,8],"4":[2,8],"30":[2,8],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,9],"4":[2,9],"30":[2,9],"106":98,"107":[1,68],"109":[1,69],"112":99,"113":[1,71],"114":72,"130":[1,96],"131":[1,97]},{"1":[2,15],"4":[2,15],"29":[2,15],"30":[2,15],"47":[2,15],"55":[2,15],"59":[2,15],"62":101,"68":[1,103],"69":[1,104],"70":[1,105],"71":[1,106],"72":107,"73":108,"74":[1,109],"75":[2,15],"76":[1,110],"77":[1,111],"80":[2,15],"85":100,"88":[1,102],"89":[2,114],"90":[2,15],"94":[2,15],"96":[2,15],"105":[2,15],"107":[2,15],"108":[2,15],"109":[2,15],"113":[2,15],"121":[2,15],"130":[2,15],"131":[2,15],"133":[2,15],"134":[2,15],"137":[2,15],"138":[2,15],"139":[2,15],"140":[2,15],"141":[2,15],"142":[2,15],"144":[2,15]},{"1":[2,16],"4":[2,16],"29":[2,16],"30":[2,16],"47":[2,16],"55":[2,16],"59":[2,16],"62":113,"68":[1,103],"69":[1,104],"70":[1,105],"71":[1,106],"72":107,"73":108,"74":[1,109],"75":[2,16],"76":[1,110],"77":[1,111],"80":[2,16],"85":112,"88":[1,102],"89":[2,114],"90":[2,16],"94":[2,16],"96":[2,16],"105":[2,16],"107":[2,16],"108":[2,16],"109":[2,16],"113":[2,16],"121":[2,16],"130":[2,16],"131":[2,16],"133":[2,16],"134":[2,16],"137":[2,16],"138":[2,16],"139":[2,16],"140":[2,16],"141":[2,16],"142":[2,16],"144":[2,16]},{"1":[2,17],"4":[2,17],"29":[2,17],"30":[2,17],"47":[2,17],"55":[2,17],"59":[2,17],"75":[2,17],"80":[2,17],"90":[2,17],"94":[2,17],"96":[2,17],"105":[2,17],"107":[2,17],"108":[2,17],"109":[2,17],"113":[2,17],"121":[2,17],"130":[2,17],"131":[2,17],"133":[2,17],"134":[2,17],"137":[2,17],"138":[2,17],"139":[2,17],"140":[2,17],"141":[2,17],"142":[2,17],"144":[2,17]},{"1":[2,18],"4":[2,18],"29":[2,18],"30":[2,18],"47":[2,18],"55":[2,18],"59":[2,18],"75":[2,18],"80":[2,18],"90":[2,18],"94":[2,18],"96":[2,18],"105":[2,18],"107":[2,18],"108":[2,18],"109":[2,18],"113":[2,18],"121":[2,18],"130":[2,18],"131":[2,18],"133":[2,18],"134":[2,18],"137":[2,18],"138":[2,18],"139":[2,18],"140":[2,18],"141":[2,18],"142":[2,18],"144":[2,18]},{"1":[2,19],"4":[2,19],"29":[2,19],"30":[2,19],"47":[2,19],"55":[2,19],"59":[2,19],"75":[2,19],"80":[2,19],"90":[2,19],"94":[2,19],"96":[2,19],"105":[2,19],"107":[2,19],"108":[2,19],"109":[2,19],"113":[2,19],"121":[2,19],"130":[2,19],"131":[2,19],"133":[2,19],"134":[2,19],"137":[2,19],"138":[2,19],"139":[2,19],"140":[2,19],"141":[2,19],"142":[2,19],"144":[2,19]},{"1":[2,20],"4":[2,20],"29":[2,20],"30":[2,20],"47":[2,20],"55":[2,20],"59":[2,20],"75":[2,20],"80":[2,20],"90":[2,20],"94":[2,20],"96":[2,20],"105":[2,20],"107":[2,20],"108":[2,20],"109":[2,20],"113":[2,20],"121":[2,20],"130":[2,20],"131":[2,20],"133":[2,20],"134":[2,20],"137":[2,20],"138":[2,20],"139":[2,20],"140":[2,20],"141":[2,20],"142":[2,20],"144":[2,20]},{"1":[2,21],"4":[2,21],"29":[2,21],"30":[2,21],"47":[2,21],"55":[2,21],"59":[2,21],"75":[2,21],"80":[2,21],"90":[2,21],"94":[2,21],"96":[2,21],"105":[2,21],"107":[2,21],"108":[2,21],"109":[2,21],"113":[2,21],"121":[2,21],"130":[2,21],"131":[2,21],"133":[2,21],"134":[2,21],"137":[2,21],"138":[2,21],"139":[2,21],"140":[2,21],"141":[2,21],"142":[2,21],"144":[2,21]},{"1":[2,22],"4":[2,22],"29":[2,22],"30":[2,22],"47":[2,22],"55":[2,22],"59":[2,22],"75":[2,22],"80":[2,22],"90":[2,22],"94":[2,22],"96":[2,22],"105":[2,22],"107":[2,22],"108":[2,22],"109":[2,22],"113":[2,22],"121":[2,22],"130":[2,22],"131":[2,22],"133":[2,22],"134":[2,22],"137":[2,22],"138":[2,22],"139":[2,22],"140":[2,22],"141":[2,22],"142":[2,22],"144":[2,22]},{"1":[2,23],"4":[2,23],"29":[2,23],"30":[2,23],"47":[2,23],"55":[2,23],"59":[2,23],"75":[2,23],"80":[2,23],"90":[2,23],"94":[2,23],"96":[2,23],"105":[2,23],"107":[2,23],"108":[2,23],"109":[2,23],"113":[2,23],"121":[2,23],"130":[2,23],"131":[2,23],"133":[2,23],"134":[2,23],"137":[2,23],"138":[2,23],"139":[2,23],"140":[2,23],"141":[2,23],"142":[2,23],"144":[2,23]},{"1":[2,24],"4":[2,24],"29":[2,24],"30":[2,24],"47":[2,24],"55":[2,24],"59":[2,24],"75":[2,24],"80":[2,24],"90":[2,24],"94":[2,24],"96":[2,24],"105":[2,24],"107":[2,24],"108":[2,24],"109":[2,24],"113":[2,24],"121":[2,24],"130":[2,24],"131":[2,24],"133":[2,24],"134":[2,24],"137":[2,24],"138":[2,24],"139":[2,24],"140":[2,24],"141":[2,24],"142":[2,24],"144":[2,24]},{"1":[2,25],"4":[2,25],"29":[2,25],"30":[2,25],"47":[2,25],"55":[2,25],"59":[2,25],"75":[2,25],"80":[2,25],"90":[2,25],"94":[2,25],"96":[2,25],"105":[2,25],"107":[2,25],"108":[2,25],"109":[2,25],"113":[2,25],"121":[2,25],"130":[2,25],"131":[2,25],"133":[2,25],"134":[2,25],"137":[2,25],"138":[2,25],"139":[2,25],"140":[2,25],"141":[2,25],"142":[2,25],"144":[2,25]},{"1":[2,26],"4":[2,26],"29":[2,26],"30":[2,26],"47":[2,26],"55":[2,26],"59":[2,26],"75":[2,26],"80":[2,26],"90":[2,26],"94":[2,26],"96":[2,26],"105":[2,26],"107":[2,26],"108":[2,26],"109":[2,26],"113":[2,26],"121":[2,26],"130":[2,26],"131":[2,26],"133":[2,26],"134":[2,26],"137":[2,26],"138":[2,26],"139":[2,26],"140":[2,26],"141":[2,26],"142":[2,26],"144":[2,26]},{"1":[2,27],"4":[2,27],"29":[2,27],"30":[2,27],"47":[2,27],"55":[2,27],"59":[2,27],"75":[2,27],"80":[2,27],"90":[2,27],"94":[2,27],"96":[2,27],"105":[2,27],"107":[2,27],"108":[2,27],"109":[2,27],"113":[2,27],"121":[2,27],"130":[2,27],"131":[2,27],"133":[2,27],"134":[2,27],"137":[2,27],"138":[2,27],"139":[2,27],"140":[2,27],"141":[2,27],"142":[2,27],"144":[2,27]},{"1":[2,28],"4":[2,28],"29":[2,28],"30":[2,28],"47":[2,28],"55":[2,28],"59":[2,28],"75":[2,28],"80":[2,28],"90":[2,28],"94":[2,28],"96":[2,28],"105":[2,28],"107":[2,28],"108":[2,28],"109":[2,28],"113":[2,28],"121":[2,28],"130":[2,28],"131":[2,28],"133":[2,28],"134":[2,28],"137":[2,28],"138":[2,28],"139":[2,28],"140":[2,28],"141":[2,28],"142":[2,28],"144":[2,28]},{"1":[2,10],"4":[2,10],"30":[2,10],"107":[2,10],"109":[2,10],"113":[2,10],"130":[2,10],"131":[2,10]},{"1":[2,11],"4":[2,11],"30":[2,11],"107":[2,11],"109":[2,11],"113":[2,11],"130":[2,11],"131":[2,11]},{"1":[2,12],"4":[2,12],"30":[2,12],"107":[2,12],"109":[2,12],"113":[2,12],"130":[2,12],"131":[2,12]},{"1":[2,13],"4":[2,13],"30":[2,13],"107":[2,13],"109":[2,13],"113":[2,13],"130":[2,13],"131":[2,13]},{"1":[2,14],"4":[2,14],"30":[2,14],"107":[2,14],"109":[2,14],"113":[2,14],"130":[2,14],"131":[2,14]},{"1":[2,74],"4":[2,74],"29":[2,74],"30":[2,74],"41":[1,114],"47":[2,74],"55":[2,74],"59":[2,74],"68":[2,74],"69":[2,74],"70":[2,74],"71":[2,74],"74":[2,74],"75":[2,74],"76":[2,74],"77":[2,74],"80":[2,74],"88":[2,74],"89":[2,74],"90":[2,74],"94":[2,74],"96":[2,74],"105":[2,74],"107":[2,74],"108":[2,74],"109":[2,74],"113":[2,74],"121":[2,74],"130":[2,74],"131":[2,74],"133":[2,74],"134":[2,74],"137":[2,74],"138":[2,74],"139":[2,74],"140":[2,74],"141":[2,74],"142":[2,74],"144":[2,74]},{"1":[2,75],"4":[2,75],"29":[2,75],"30":[2,75],"47":[2,75],"55":[2,75],"59":[2,75],"68":[2,75],"69":[2,75],"70":[2,75],"71":[2,75],"74":[2,75],"75":[2,75],"76":[2,75],"77":[2,75],"80":[2,75],"88":[2,75],"89":[2,75],"90":[2,75],"94":[2,75],"96":[2,75],"105":[2,75],"107":[2,75],"108":[2,75],"109":[2,75],"113":[2,75],"121":[2,75],"130":[2,75],"131":[2,75],"133":[2,75],"134":[2,75],"137":[2,75],"138":[2,75],"139":[2,75],"140":[2,75],"141":[2,75],"142":[2,75],"144":[2,75]},{"1":[2,76],"4":[2,76],"29":[2,76],"30":[2,76],"47":[2,76],"55":[2,76],"59":[2,76],"68":[2,76],"69":[2,76],"70":[2,76],"71":[2,76],"74":[2,76],"75":[2,76],"76":[2,76],"77":[2,76],"80":[2,76],"88":[2,76],"89":[2,76],"90":[2,76],"94":[2,76],"96":[2,76],"105":[2,76],"107":[2,76],"108":[2,76],"109":[2,76],"113":[2,76],"121":[2,76],"130":[2,76],"131":[2,76],"133":[2,76],"134":[2,76],"137":[2,76],"138":[2,76],"139":[2,76],"140":[2,76],"141":[2,76],"142":[2,76],"144":[2,76]},{"1":[2,77],"4":[2,77],"29":[2,77],"30":[2,77],"47":[2,77],"55":[2,77],"59":[2,77],"68":[2,77],"69":[2,77],"70":[2,77],"71":[2,77],"74":[2,77],"75":[2,77],"76":[2,77],"77":[2,77],"80":[2,77],"88":[2,77],"89":[2,77],"90":[2,77],"94":[2,77],"96":[2,77],"105":[2,77],"107":[2,77],"108":[2,77],"109":[2,77],"113":[2,77],"121":[2,77],"130":[2,77],"131":[2,77],"133":[2,77],"134":[2,77],"137":[2,77],"138":[2,77],"139":[2,77],"140":[2,77],"141":[2,77],"142":[2,77],"144":[2,77]},{"1":[2,78],"4":[2,78],"29":[2,78],"30":[2,78],"47":[2,78],"55":[2,78],"59":[2,78],"68":[2,78],"69":[2,78],"70":[2,78],"71":[2,78],"74":[2,78],"75":[2,78],"76":[2,78],"77":[2,78],"80":[2,78],"88":[2,78],"89":[2,78],"90":[2,78],"94":[2,78],"96":[2,78],"105":[2,78],"107":[2,78],"108":[2,78],"109":[2,78],"113":[2,78],"121":[2,78],"130":[2,78],"131":[2,78],"133":[2,78],"134":[2,78],"137":[2,78],"138":[2,78],"139":[2,78],"140":[2,78],"141":[2,78],"142":[2,78],"144":[2,78]},{"1":[2,112],"4":[2,112],"29":[2,112],"30":[2,112],"47":[2,112],"55":[2,112],"59":[2,112],"68":[2,112],"69":[2,112],"70":[2,112],"71":[2,112],"74":[2,112],"75":[2,112],"76":[2,112],"77":[2,112],"80":[2,112],"86":115,"88":[2,112],"89":[1,116],"90":[2,112],"94":[2,112],"96":[2,112],"105":[2,112],"107":[2,112],"108":[2,112],"109":[2,112],"113":[2,112],"121":[2,112],"130":[2,112],"131":[2,112],"133":[2,112],"134":[2,112],"137":[2,112],"138":[2,112],"139":[2,112],"140":[2,112],"141":[2,112],"142":[2,112],"144":[2,112]},{"49":117,"50":[2,59],"55":[2,59],"56":118,"57":[1,119],"58":[1,120]},{"4":[1,122],"6":121,"29":[1,6]},{"8":123,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":125,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":126,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"15":128,"16":129,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":130,"43":65,"58":[1,61],"61":127,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"87":[1,33],"92":[1,60],"95":[1,59],"104":[1,58]},{"15":128,"16":129,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":130,"43":65,"58":[1,61],"61":131,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"87":[1,33],"92":[1,60],"95":[1,59],"104":[1,58]},{"1":[2,71],"4":[2,71],"29":[2,71],"30":[2,71],"41":[2,71],"47":[2,71],"55":[2,71],"59":[2,71],"68":[2,71],"69":[2,71],"70":[2,71],"71":[2,71],"74":[2,71],"75":[2,71],"76":[2,71],"77":[2,71],"80":[2,71],"82":[1,135],"88":[2,71],"89":[2,71],"90":[2,71],"94":[2,71],"96":[2,71],"105":[2,71],"107":[2,71],"108":[2,71],"109":[2,71],"113":[2,71],"121":[2,71],"130":[2,71],"131":[2,71],"133":[2,71],"134":[2,71],"135":[1,132],"136":[1,133],"137":[2,71],"138":[2,71],"139":[2,71],"140":[2,71],"141":[2,71],"142":[2,71],"143":[1,134],"144":[2,71]},{"1":[2,187],"4":[2,187],"29":[2,187],"30":[2,187],"47":[2,187],"55":[2,187],"59":[2,187],"75":[2,187],"80":[2,187],"90":[2,187],"94":[2,187],"96":[2,187],"105":[2,187],"107":[2,187],"108":[2,187],"109":[2,187],"113":[2,187],"121":[2,187],"124":[1,136],"130":[2,187],"131":[2,187],"133":[2,187],"134":[2,187],"137":[2,187],"138":[2,187],"139":[2,187],"140":[2,187],"141":[2,187],"142":[2,187],"144":[2,187]},{"4":[1,122],"6":137,"29":[1,6]},{"4":[1,122],"6":138,"29":[1,6]},{"1":[2,153],"4":[2,153],"29":[2,153],"30":[2,153],"47":[2,153],"55":[2,153],"59":[2,153],"75":[2,153],"80":[2,153],"90":[2,153],"94":[2,153],"96":[2,153],"105":[2,153],"107":[2,153],"108":[2,153],"109":[2,153],"113":[2,153],"121":[2,153],"130":[2,153],"131":[2,153],"133":[2,153],"134":[2,153],"137":[2,153],"138":[2,153],"139":[2,153],"140":[2,153],"141":[2,153],"142":[2,153],"144":[2,153]},{"4":[1,122],"6":139,"29":[1,6]},{"8":140,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,141],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,99],"4":[2,99],"15":128,"16":129,"29":[1,143],"30":[2,99],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":130,"43":65,"47":[2,99],"55":[2,99],"58":[1,61],"59":[2,99],"61":142,"63":52,"64":53,"65":30,"66":31,"67":32,"75":[2,99],"78":[1,73],"80":[2,99],"82":[1,144],"87":[1,33],"90":[2,99],"92":[1,60],"94":[2,99],"95":[1,59],"96":[2,99],"104":[1,58],"105":[2,99],"107":[2,99],"108":[2,99],"109":[2,99],"113":[2,99],"121":[2,99],"130":[2,99],"131":[2,99],"133":[2,99],"134":[2,99],"137":[2,99],"138":[2,99],"139":[2,99],"140":[2,99],"141":[2,99],"142":[2,99],"144":[2,99]},{"1":[2,51],"4":[2,51],"29":[2,51],"30":[2,51],"47":[2,51],"55":[2,51],"59":[2,51],"75":[2,51],"80":[2,51],"90":[2,51],"94":[2,51],"96":[2,51],"101":[2,51],"102":[2,51],"105":[2,51],"107":[2,51],"108":[2,51],"109":[2,51],"113":[2,51],"121":[2,51],"124":[2,51],"126":[2,51],"130":[2,51],"131":[2,51],"133":[2,51],"134":[2,51],"137":[2,51],"138":[2,51],"139":[2,51],"140":[2,51],"141":[2,51],"142":[2,51],"144":[2,51]},{"1":[2,50],"4":[2,50],"8":145,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[2,50],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"130":[2,50],"131":[2,50],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":146,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,72],"4":[2,72],"29":[2,72],"30":[2,72],"41":[2,72],"47":[2,72],"55":[2,72],"59":[2,72],"68":[2,72],"69":[2,72],"70":[2,72],"71":[2,72],"74":[2,72],"75":[2,72],"76":[2,72],"77":[2,72],"80":[2,72],"88":[2,72],"89":[2,72],"90":[2,72],"94":[2,72],"96":[2,72],"105":[2,72],"107":[2,72],"108":[2,72],"109":[2,72],"113":[2,72],"121":[2,72],"130":[2,72],"131":[2,72],"133":[2,72],"134":[2,72],"137":[2,72],"138":[2,72],"139":[2,72],"140":[2,72],"141":[2,72],"142":[2,72],"144":[2,72]},{"1":[2,73],"4":[2,73],"29":[2,73],"30":[2,73],"41":[2,73],"47":[2,73],"55":[2,73],"59":[2,73],"68":[2,73],"69":[2,73],"70":[2,73],"71":[2,73],"74":[2,73],"75":[2,73],"76":[2,73],"77":[2,73],"80":[2,73],"88":[2,73],"89":[2,73],"90":[2,73],"94":[2,73],"96":[2,73],"105":[2,73],"107":[2,73],"108":[2,73],"109":[2,73],"113":[2,73],"121":[2,73],"130":[2,73],"131":[2,73],"133":[2,73],"134":[2,73],"137":[2,73],"138":[2,73],"139":[2,73],"140":[2,73],"141":[2,73],"142":[2,73],"144":[2,73]},{"1":[2,35],"4":[2,35],"29":[2,35],"30":[2,35],"47":[2,35],"55":[2,35],"59":[2,35],"68":[2,35],"69":[2,35],"70":[2,35],"71":[2,35],"74":[2,35],"75":[2,35],"76":[2,35],"77":[2,35],"80":[2,35],"88":[2,35],"89":[2,35],"90":[2,35],"94":[2,35],"96":[2,35],"105":[2,35],"107":[2,35],"108":[2,35],"109":[2,35],"113":[2,35],"121":[2,35],"130":[2,35],"131":[2,35],"133":[2,35],"134":[2,35],"137":[2,35],"138":[2,35],"139":[2,35],"140":[2,35],"141":[2,35],"142":[2,35],"144":[2,35]},{"1":[2,36],"4":[2,36],"29":[2,36],"30":[2,36],"47":[2,36],"55":[2,36],"59":[2,36],"68":[2,36],"69":[2,36],"70":[2,36],"71":[2,36],"74":[2,36],"75":[2,36],"76":[2,36],"77":[2,36],"80":[2,36],"88":[2,36],"89":[2,36],"90":[2,36],"94":[2,36],"96":[2,36],"105":[2,36],"107":[2,36],"108":[2,36],"109":[2,36],"113":[2,36],"121":[2,36],"130":[2,36],"131":[2,36],"133":[2,36],"134":[2,36],"137":[2,36],"138":[2,36],"139":[2,36],"140":[2,36],"141":[2,36],"142":[2,36],"144":[2,36]},{"1":[2,37],"4":[2,37],"29":[2,37],"30":[2,37],"47":[2,37],"55":[2,37],"59":[2,37],"68":[2,37],"69":[2,37],"70":[2,37],"71":[2,37],"74":[2,37],"75":[2,37],"76":[2,37],"77":[2,37],"80":[2,37],"88":[2,37],"89":[2,37],"90":[2,37],"94":[2,37],"96":[2,37],"105":[2,37],"107":[2,37],"108":[2,37],"109":[2,37],"113":[2,37],"121":[2,37],"130":[2,37],"131":[2,37],"133":[2,37],"134":[2,37],"137":[2,37],"138":[2,37],"139":[2,37],"140":[2,37],"141":[2,37],"142":[2,37],"144":[2,37]},{"1":[2,38],"4":[2,38],"29":[2,38],"30":[2,38],"47":[2,38],"55":[2,38],"59":[2,38],"68":[2,38],"69":[2,38],"70":[2,38],"71":[2,38],"74":[2,38],"75":[2,38],"76":[2,38],"77":[2,38],"80":[2,38],"88":[2,38],"89":[2,38],"90":[2,38],"94":[2,38],"96":[2,38],"105":[2,38],"107":[2,38],"108":[2,38],"109":[2,38],"113":[2,38],"121":[2,38],"130":[2,38],"131":[2,38],"133":[2,38],"134":[2,38],"137":[2,38],"138":[2,38],"139":[2,38],"140":[2,38],"141":[2,38],"142":[2,38],"144":[2,38]},{"8":147,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"105":[1,148],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":149,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"91":151,"92":[1,60],"95":[1,59],"96":[1,150],"97":152,"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,118],"4":[2,118],"29":[2,118],"30":[2,118],"47":[2,118],"55":[2,118],"59":[2,118],"68":[2,118],"69":[2,118],"70":[2,118],"71":[2,118],"74":[2,118],"75":[2,118],"76":[2,118],"77":[2,118],"80":[2,118],"88":[2,118],"89":[2,118],"90":[2,118],"94":[2,118],"96":[2,118],"105":[2,118],"107":[2,118],"108":[2,118],"109":[2,118],"113":[2,118],"121":[2,118],"130":[2,118],"131":[2,118],"133":[2,118],"134":[2,118],"137":[2,118],"138":[2,118],"139":[2,118],"140":[2,118],"141":[2,118],"142":[2,118],"144":[2,118]},{"1":[2,119],"4":[2,119],"29":[2,119],"30":[2,119],"31":155,"32":[1,76],"47":[2,119],"55":[2,119],"59":[2,119],"68":[2,119],"69":[2,119],"70":[2,119],"71":[2,119],"74":[2,119],"75":[2,119],"76":[2,119],"77":[2,119],"80":[2,119],"88":[2,119],"89":[2,119],"90":[2,119],"94":[2,119],"96":[2,119],"105":[2,119],"107":[2,119],"108":[2,119],"109":[2,119],"113":[2,119],"121":[2,119],"130":[2,119],"131":[2,119],"133":[2,119],"134":[2,119],"137":[2,119],"138":[2,119],"139":[2,119],"140":[2,119],"141":[2,119],"142":[2,119],"144":[2,119]},{"4":[2,55],"29":[2,55]},{"4":[2,56],"29":[2,56]},{"1":[2,67],"4":[2,67],"29":[2,67],"30":[2,67],"41":[2,67],"47":[2,67],"55":[2,67],"59":[2,67],"68":[2,67],"69":[2,67],"70":[2,67],"71":[2,67],"74":[2,67],"75":[2,67],"76":[2,67],"77":[2,67],"80":[2,67],"82":[2,67],"88":[2,67],"89":[2,67],"90":[2,67],"94":[2,67],"96":[2,67],"105":[2,67],"107":[2,67],"108":[2,67],"109":[2,67],"113":[2,67],"121":[2,67],"130":[2,67],"131":[2,67],"133":[2,67],"134":[2,67],"135":[2,67],"136":[2,67],"137":[2,67],"138":[2,67],"139":[2,67],"140":[2,67],"141":[2,67],"142":[2,67],"143":[2,67],"144":[2,67]},{"1":[2,70],"4":[2,70],"29":[2,70],"30":[2,70],"41":[2,70],"47":[2,70],"55":[2,70],"59":[2,70],"68":[2,70],"69":[2,70],"70":[2,70],"71":[2,70],"74":[2,70],"75":[2,70],"76":[2,70],"77":[2,70],"80":[2,70],"82":[2,70],"88":[2,70],"89":[2,70],"90":[2,70],"94":[2,70],"96":[2,70],"105":[2,70],"107":[2,70],"108":[2,70],"109":[2,70],"113":[2,70],"121":[2,70],"130":[2,70],"131":[2,70],"133":[2,70],"134":[2,70],"135":[2,70],"136":[2,70],"137":[2,70],"138":[2,70],"139":[2,70],"140":[2,70],"141":[2,70],"142":[2,70],"143":[2,70],"144":[2,70]},{"8":156,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":157,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":158,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":159,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[1,122],"6":160,"8":161,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,6],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"31":166,"32":[1,76],"63":167,"64":168,"66":162,"78":[1,73],"95":[1,59],"116":163,"117":[1,164],"118":165},{"115":169,"119":[1,170],"120":[1,171]},{"4":[2,89],"28":177,"29":[2,89],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":173,"43":176,"46":[1,49],"55":[2,89],"58":[1,178],"79":172,"80":[2,89]},{"1":[2,33],"4":[2,33],"29":[2,33],"30":[2,33],"44":[2,33],"47":[2,33],"55":[2,33],"59":[2,33],"68":[2,33],"69":[2,33],"70":[2,33],"71":[2,33],"74":[2,33],"75":[2,33],"76":[2,33],"77":[2,33],"80":[2,33],"88":[2,33],"89":[2,33],"90":[2,33],"94":[2,33],"96":[2,33],"105":[2,33],"107":[2,33],"108":[2,33],"109":[2,33],"113":[2,33],"121":[2,33],"130":[2,33],"131":[2,33],"133":[2,33],"134":[2,33],"137":[2,33],"138":[2,33],"139":[2,33],"140":[2,33],"141":[2,33],"142":[2,33],"144":[2,33]},{"1":[2,34],"4":[2,34],"29":[2,34],"30":[2,34],"44":[2,34],"47":[2,34],"55":[2,34],"59":[2,34],"68":[2,34],"69":[2,34],"70":[2,34],"71":[2,34],"74":[2,34],"75":[2,34],"76":[2,34],"77":[2,34],"80":[2,34],"88":[2,34],"89":[2,34],"90":[2,34],"94":[2,34],"96":[2,34],"105":[2,34],"107":[2,34],"108":[2,34],"109":[2,34],"113":[2,34],"121":[2,34],"130":[2,34],"131":[2,34],"133":[2,34],"134":[2,34],"137":[2,34],"138":[2,34],"139":[2,34],"140":[2,34],"141":[2,34],"142":[2,34],"144":[2,34]},{"1":[2,32],"4":[2,32],"29":[2,32],"30":[2,32],"41":[2,32],"44":[2,32],"47":[2,32],"55":[2,32],"59":[2,32],"68":[2,32],"69":[2,32],"70":[2,32],"71":[2,32],"74":[2,32],"75":[2,32],"76":[2,32],"77":[2,32],"80":[2,32],"82":[2,32],"88":[2,32],"89":[2,32],"90":[2,32],"94":[2,32],"96":[2,32],"105":[2,32],"107":[2,32],"108":[2,32],"109":[2,32],"113":[2,32],"119":[2,32],"120":[2,32],"121":[2,32],"130":[2,32],"131":[2,32],"133":[2,32],"134":[2,32],"135":[2,32],"136":[2,32],"137":[2,32],"138":[2,32],"139":[2,32],"140":[2,32],"141":[2,32],"142":[2,32],"143":[2,32],"144":[2,32]},{"1":[2,31],"4":[2,31],"29":[2,31],"30":[2,31],"47":[2,31],"55":[2,31],"59":[2,31],"75":[2,31],"80":[2,31],"90":[2,31],"94":[2,31],"96":[2,31],"101":[2,31],"102":[2,31],"105":[2,31],"107":[2,31],"108":[2,31],"109":[2,31],"113":[2,31],"121":[2,31],"124":[2,31],"126":[2,31],"130":[2,31],"131":[2,31],"133":[2,31],"134":[2,31],"137":[2,31],"138":[2,31],"139":[2,31],"140":[2,31],"141":[2,31],"142":[2,31],"144":[2,31]},{"1":[2,7],"4":[2,7],"7":179,"8":7,"9":8,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"30":[2,7],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,4]},{"4":[1,78],"30":[1,180]},{"1":[2,30],"4":[2,30],"29":[2,30],"30":[2,30],"47":[2,30],"55":[2,30],"59":[2,30],"75":[2,30],"80":[2,30],"90":[2,30],"94":[2,30],"96":[2,30],"101":[2,30],"102":[2,30],"105":[2,30],"107":[2,30],"108":[2,30],"109":[2,30],"113":[2,30],"121":[2,30],"124":[2,30],"126":[2,30],"130":[2,30],"131":[2,30],"133":[2,30],"134":[2,30],"137":[2,30],"138":[2,30],"139":[2,30],"140":[2,30],"141":[2,30],"142":[2,30],"144":[2,30]},{"8":181,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":182,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":183,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":184,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":185,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":186,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":187,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":188,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":189,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":190,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":191,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,152],"4":[2,152],"29":[2,152],"30":[2,152],"47":[2,152],"55":[2,152],"59":[2,152],"75":[2,152],"80":[2,152],"90":[2,152],"94":[2,152],"96":[2,152],"105":[2,152],"107":[2,152],"108":[2,152],"109":[2,152],"113":[2,152],"121":[2,152],"130":[2,152],"131":[2,152],"133":[2,152],"134":[2,152],"137":[2,152],"138":[2,152],"139":[2,152],"140":[2,152],"141":[2,152],"142":[2,152],"144":[2,152]},{"1":[2,157],"4":[2,157],"29":[2,157],"30":[2,157],"47":[2,157],"55":[2,157],"59":[2,157],"75":[2,157],"80":[2,157],"90":[2,157],"94":[2,157],"96":[2,157],"105":[2,157],"107":[2,157],"108":[2,157],"109":[2,157],"113":[2,157],"121":[2,157],"130":[2,157],"131":[2,157],"133":[2,157],"134":[2,157],"137":[2,157],"138":[2,157],"139":[2,157],"140":[2,157],"141":[2,157],"142":[2,157],"144":[2,157]},{"1":[2,52],"4":[2,52],"29":[2,52],"30":[2,52],"47":[2,52],"55":[2,52],"59":[2,52],"75":[2,52],"80":[2,52],"90":[2,52],"94":[2,52],"96":[2,52],"105":[2,52],"107":[2,52],"108":[2,52],"109":[2,52],"113":[2,52],"121":[2,52],"130":[2,52],"131":[2,52],"133":[2,52],"134":[2,52],"137":[2,52],"138":[2,52],"139":[2,52],"140":[2,52],"141":[2,52],"142":[2,52],"144":[2,52]},{"8":192,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":193,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,151],"4":[2,151],"29":[2,151],"30":[2,151],"47":[2,151],"55":[2,151],"59":[2,151],"75":[2,151],"80":[2,151],"90":[2,151],"94":[2,151],"96":[2,151],"105":[2,151],"107":[2,151],"108":[2,151],"109":[2,151],"113":[2,151],"121":[2,151],"130":[2,151],"131":[2,151],"133":[2,151],"134":[2,151],"137":[2,151],"138":[2,151],"139":[2,151],"140":[2,151],"141":[2,151],"142":[2,151],"144":[2,151]},{"1":[2,156],"4":[2,156],"29":[2,156],"30":[2,156],"47":[2,156],"55":[2,156],"59":[2,156],"75":[2,156],"80":[2,156],"90":[2,156],"94":[2,156],"96":[2,156],"105":[2,156],"107":[2,156],"108":[2,156],"109":[2,156],"113":[2,156],"121":[2,156],"130":[2,156],"131":[2,156],"133":[2,156],"134":[2,156],"137":[2,156],"138":[2,156],"139":[2,156],"140":[2,156],"141":[2,156],"142":[2,156],"144":[2,156]},{"86":194,"89":[1,116]},{"1":[2,68],"4":[2,68],"29":[2,68],"30":[2,68],"41":[2,68],"47":[2,68],"55":[2,68],"59":[2,68],"68":[2,68],"69":[2,68],"70":[2,68],"71":[2,68],"74":[2,68],"75":[2,68],"76":[2,68],"77":[2,68],"80":[2,68],"82":[2,68],"88":[2,68],"89":[2,68],"90":[2,68],"94":[2,68],"96":[2,68],"105":[2,68],"107":[2,68],"108":[2,68],"109":[2,68],"113":[2,68],"121":[2,68],"130":[2,68],"131":[2,68],"133":[2,68],"134":[2,68],"135":[2,68],"136":[2,68],"137":[2,68],"138":[2,68],"139":[2,68],"140":[2,68],"141":[2,68],"142":[2,68],"143":[2,68],"144":[2,68]},{"89":[2,115]},{"31":195,"32":[1,76]},{"31":196,"32":[1,76]},{"1":[2,81],"4":[2,81],"29":[2,81],"30":[2,81],"41":[2,81],"47":[2,81],"55":[2,81],"59":[2,81],"68":[2,81],"69":[2,81],"70":[2,81],"71":[2,81],"74":[2,81],"75":[2,81],"76":[2,81],"77":[2,81],"80":[2,81],"82":[2,81],"88":[2,81],"89":[2,81],"90":[2,81],"94":[2,81],"96":[2,81],"105":[2,81],"107":[2,81],"108":[2,81],"109":[2,81],"113":[2,81],"121":[2,81],"130":[2,81],"131":[2,81],"133":[2,81],"134":[2,81],"135":[2,81],"136":[2,81],"137":[2,81],"138":[2,81],"139":[2,81],"140":[2,81],"141":[2,81],"142":[2,81],"143":[2,81],"144":[2,81]},{"31":197,"32":[1,76]},{"1":[2,83],"4":[2,83],"29":[2,83],"30":[2,83],"41":[2,83],"47":[2,83],"55":[2,83],"59":[2,83],"68":[2,83],"69":[2,83],"70":[2,83],"71":[2,83],"74":[2,83],"75":[2,83],"76":[2,83],"77":[2,83],"80":[2,83],"82":[2,83],"88":[2,83],"89":[2,83],"90":[2,83],"94":[2,83],"96":[2,83],"105":[2,83],"107":[2,83],"108":[2,83],"109":[2,83],"113":[2,83],"121":[2,83],"130":[2,83],"131":[2,83],"133":[2,83],"134":[2,83],"135":[2,83],"136":[2,83],"137":[2,83],"138":[2,83],"139":[2,83],"140":[2,83],"141":[2,83],"142":[2,83],"143":[2,83],"144":[2,83]},{"1":[2,84],"4":[2,84],"29":[2,84],"30":[2,84],"41":[2,84],"47":[2,84],"55":[2,84],"59":[2,84],"68":[2,84],"69":[2,84],"70":[2,84],"71":[2,84],"74":[2,84],"75":[2,84],"76":[2,84],"77":[2,84],"80":[2,84],"82":[2,84],"88":[2,84],"89":[2,84],"90":[2,84],"94":[2,84],"96":[2,84],"105":[2,84],"107":[2,84],"108":[2,84],"109":[2,84],"113":[2,84],"121":[2,84],"130":[2,84],"131":[2,84],"133":[2,84],"134":[2,84],"135":[2,84],"136":[2,84],"137":[2,84],"138":[2,84],"139":[2,84],"140":[2,84],"141":[2,84],"142":[2,84],"143":[2,84],"144":[2,84]},{"8":198,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"59":[1,201],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"93":199,"94":[1,200],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"72":202,"74":[1,203],"76":[1,110],"77":[1,111]},{"72":204,"74":[1,203],"76":[1,110],"77":[1,111]},{"86":205,"89":[1,116]},{"1":[2,69],"4":[2,69],"29":[2,69],"30":[2,69],"41":[2,69],"47":[2,69],"55":[2,69],"59":[2,69],"68":[2,69],"69":[2,69],"70":[2,69],"71":[2,69],"74":[2,69],"75":[2,69],"76":[2,69],"77":[2,69],"80":[2,69],"82":[2,69],"88":[2,69],"89":[2,69],"90":[2,69],"94":[2,69],"96":[2,69],"105":[2,69],"107":[2,69],"108":[2,69],"109":[2,69],"113":[2,69],"121":[2,69],"130":[2,69],"131":[2,69],"133":[2,69],"134":[2,69],"135":[2,69],"136":[2,69],"137":[2,69],"138":[2,69],"139":[2,69],"140":[2,69],"141":[2,69],"142":[2,69],"143":[2,69],"144":[2,69]},{"8":206,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,207],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,113],"4":[2,113],"29":[2,113],"30":[2,113],"47":[2,113],"55":[2,113],"59":[2,113],"68":[2,113],"69":[2,113],"70":[2,113],"71":[2,113],"74":[2,113],"75":[2,113],"76":[2,113],"77":[2,113],"80":[2,113],"88":[2,113],"89":[2,113],"90":[2,113],"94":[2,113],"96":[2,113],"105":[2,113],"107":[2,113],"108":[2,113],"109":[2,113],"113":[2,113],"121":[2,113],"130":[2,113],"131":[2,113],"133":[2,113],"134":[2,113],"137":[2,113],"138":[2,113],"139":[2,113],"140":[2,113],"141":[2,113],"142":[2,113],"144":[2,113]},{"8":210,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"90":[1,208],"91":209,"92":[1,60],"95":[1,59],"97":152,"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"50":[1,211],"55":[1,212]},{"50":[2,60],"55":[2,60]},{"50":[2,62],"55":[2,62],"59":[1,213]},{"57":[1,214]},{"1":[2,54],"4":[2,54],"29":[2,54],"30":[2,54],"47":[2,54],"55":[2,54],"59":[2,54],"75":[2,54],"80":[2,54],"90":[2,54],"94":[2,54],"96":[2,54],"105":[2,54],"107":[2,54],"108":[2,54],"109":[2,54],"113":[2,54],"121":[2,54],"130":[2,54],"131":[2,54],"133":[2,54],"134":[2,54],"137":[2,54],"138":[2,54],"139":[2,54],"140":[2,54],"141":[2,54],"142":[2,54],"144":[2,54]},{"28":77,"46":[1,49]},{"1":[2,192],"4":[2,192],"29":[2,192],"30":[2,192],"47":[1,95],"55":[2,192],"59":[2,192],"75":[2,192],"80":[2,192],"90":[2,192],"94":[2,192],"96":[2,192],"105":[2,192],"106":93,"107":[2,192],"108":[2,192],"109":[2,192],"112":94,"113":[2,192],"114":72,"121":[2,192],"130":[2,192],"131":[2,192],"133":[2,192],"134":[2,192],"137":[2,192],"138":[2,192],"139":[2,192],"140":[2,192],"141":[2,192],"142":[2,192],"144":[2,192]},{"106":98,"107":[1,68],"109":[1,69],"112":99,"113":[1,71],"114":72,"130":[1,96],"131":[1,97]},{"1":[2,193],"4":[2,193],"29":[2,193],"30":[2,193],"47":[1,95],"55":[2,193],"59":[2,193],"75":[2,193],"80":[2,193],"90":[2,193],"94":[2,193],"96":[2,193],"105":[2,193],"106":93,"107":[2,193],"108":[2,193],"109":[2,193],"112":94,"113":[2,193],"114":72,"121":[2,193],"130":[2,193],"131":[2,193],"133":[2,193],"134":[2,193],"137":[2,193],"138":[2,193],"139":[2,193],"140":[2,193],"141":[2,193],"142":[2,193],"144":[2,193]},{"1":[2,194],"4":[2,194],"29":[2,194],"30":[2,194],"47":[1,95],"55":[2,194],"59":[2,194],"75":[2,194],"80":[2,194],"90":[2,194],"94":[2,194],"96":[2,194],"105":[2,194],"106":93,"107":[2,194],"108":[2,194],"109":[2,194],"112":94,"113":[2,194],"114":72,"121":[2,194],"130":[2,194],"131":[2,194],"133":[2,194],"134":[2,194],"137":[2,194],"138":[2,194],"139":[2,194],"140":[2,194],"141":[2,194],"142":[2,194],"144":[2,194]},{"1":[2,195],"4":[2,195],"29":[2,195],"30":[2,195],"47":[2,195],"55":[2,195],"59":[2,195],"68":[2,71],"69":[2,71],"70":[2,71],"71":[2,71],"74":[2,71],"75":[2,195],"76":[2,71],"77":[2,71],"80":[2,195],"88":[2,71],"89":[2,71],"90":[2,195],"94":[2,195],"96":[2,195],"105":[2,195],"107":[2,195],"108":[2,195],"109":[2,195],"113":[2,195],"121":[2,195],"130":[2,195],"131":[2,195],"133":[2,195],"134":[2,195],"137":[2,195],"138":[2,195],"139":[2,195],"140":[2,195],"141":[2,195],"142":[2,195],"144":[2,195]},{"62":101,"68":[1,103],"69":[1,104],"70":[1,105],"71":[1,106],"72":107,"73":108,"74":[1,109],"76":[1,110],"77":[1,111],"85":100,"88":[1,102],"89":[2,114]},{"62":113,"68":[1,103],"69":[1,104],"70":[1,105],"71":[1,106],"72":107,"73":108,"74":[1,109],"76":[1,110],"77":[1,111],"85":112,"88":[1,102],"89":[2,114]},{"1":[2,74],"4":[2,74],"29":[2,74],"30":[2,74],"47":[2,74],"55":[2,74],"59":[2,74],"68":[2,74],"69":[2,74],"70":[2,74],"71":[2,74],"74":[2,74],"75":[2,74],"76":[2,74],"77":[2,74],"80":[2,74],"88":[2,74],"89":[2,74],"90":[2,74],"94":[2,74],"96":[2,74],"105":[2,74],"107":[2,74],"108":[2,74],"109":[2,74],"113":[2,74],"121":[2,74],"130":[2,74],"131":[2,74],"133":[2,74],"134":[2,74],"137":[2,74],"138":[2,74],"139":[2,74],"140":[2,74],"141":[2,74],"142":[2,74],"144":[2,74]},{"1":[2,196],"4":[2,196],"29":[2,196],"30":[2,196],"47":[2,196],"55":[2,196],"59":[2,196],"68":[2,71],"69":[2,71],"70":[2,71],"71":[2,71],"74":[2,71],"75":[2,196],"76":[2,71],"77":[2,71],"80":[2,196],"88":[2,71],"89":[2,71],"90":[2,196],"94":[2,196],"96":[2,196],"105":[2,196],"107":[2,196],"108":[2,196],"109":[2,196],"113":[2,196],"121":[2,196],"130":[2,196],"131":[2,196],"133":[2,196],"134":[2,196],"137":[2,196],"138":[2,196],"139":[2,196],"140":[2,196],"141":[2,196],"142":[2,196],"144":[2,196]},{"1":[2,197],"4":[2,197],"29":[2,197],"30":[2,197],"47":[2,197],"55":[2,197],"59":[2,197],"75":[2,197],"80":[2,197],"90":[2,197],"94":[2,197],"96":[2,197],"105":[2,197],"107":[2,197],"108":[2,197],"109":[2,197],"113":[2,197],"121":[2,197],"130":[2,197],"131":[2,197],"133":[2,197],"134":[2,197],"137":[2,197],"138":[2,197],"139":[2,197],"140":[2,197],"141":[2,197],"142":[2,197],"144":[2,197]},{"1":[2,198],"4":[2,198],"29":[2,198],"30":[2,198],"47":[2,198],"55":[2,198],"59":[2,198],"75":[2,198],"80":[2,198],"90":[2,198],"94":[2,198],"96":[2,198],"105":[2,198],"107":[2,198],"108":[2,198],"109":[2,198],"113":[2,198],"121":[2,198],"130":[2,198],"131":[2,198],"133":[2,198],"134":[2,198],"137":[2,198],"138":[2,198],"139":[2,198],"140":[2,198],"141":[2,198],"142":[2,198],"144":[2,198]},{"8":215,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,216],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"15":217,"16":129,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":130,"43":65,"58":[1,61],"61":218,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"87":[1,33],"92":[1,60],"95":[1,59],"104":[1,58]},{"4":[1,122],"6":220,"29":[1,6],"128":[1,219]},{"1":[2,138],"4":[2,138],"29":[2,138],"30":[2,138],"47":[2,138],"55":[2,138],"59":[2,138],"75":[2,138],"80":[2,138],"90":[2,138],"94":[2,138],"96":[2,138],"100":221,"101":[1,222],"102":[1,223],"105":[2,138],"107":[2,138],"108":[2,138],"109":[2,138],"113":[2,138],"121":[2,138],"130":[2,138],"131":[2,138],"133":[2,138],"134":[2,138],"137":[2,138],"138":[2,138],"139":[2,138],"140":[2,138],"141":[2,138],"142":[2,138],"144":[2,138]},{"1":[2,150],"4":[2,150],"29":[2,150],"30":[2,150],"47":[2,150],"55":[2,150],"59":[2,150],"75":[2,150],"80":[2,150],"90":[2,150],"94":[2,150],"96":[2,150],"105":[2,150],"107":[2,150],"108":[2,150],"109":[2,150],"113":[2,150],"121":[2,150],"130":[2,150],"131":[2,150],"133":[2,150],"134":[2,150],"137":[2,150],"138":[2,150],"139":[2,150],"140":[2,150],"141":[2,150],"142":[2,150],"144":[2,150]},{"1":[2,158],"4":[2,158],"29":[2,158],"30":[2,158],"47":[2,158],"55":[2,158],"59":[2,158],"75":[2,158],"80":[2,158],"90":[2,158],"94":[2,158],"96":[2,158],"105":[2,158],"107":[2,158],"108":[2,158],"109":[2,158],"113":[2,158],"121":[2,158],"130":[2,158],"131":[2,158],"133":[2,158],"134":[2,158],"137":[2,158],"138":[2,158],"139":[2,158],"140":[2,158],"141":[2,158],"142":[2,158],"144":[2,158]},{"29":[1,224],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"123":225,"125":226,"126":[1,227]},{"1":[2,94],"4":[2,94],"29":[1,229],"30":[2,94],"47":[2,94],"55":[2,94],"59":[2,94],"68":[2,71],"69":[2,71],"70":[2,71],"71":[2,71],"74":[2,71],"75":[2,94],"76":[2,71],"77":[2,71],"80":[2,94],"82":[1,228],"88":[2,71],"89":[2,71],"90":[2,94],"94":[2,94],"96":[2,94],"105":[2,94],"107":[2,94],"108":[2,94],"109":[2,94],"113":[2,94],"121":[2,94],"130":[2,94],"131":[2,94],"133":[2,94],"134":[2,94],"137":[2,94],"138":[2,94],"139":[2,94],"140":[2,94],"141":[2,94],"142":[2,94],"144":[2,94]},{"4":[2,105],"28":177,"30":[2,105],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"83":230,"84":231},{"15":235,"16":129,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":130,"43":65,"58":[1,61],"61":218,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"87":[1,33],"92":[1,60],"95":[1,59],"104":[1,58]},{"1":[2,49],"4":[2,49],"30":[2,49],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[2,49],"131":[2,49],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,143],"4":[2,143],"30":[2,143],"47":[1,95],"106":93,"107":[2,143],"109":[2,143],"112":94,"113":[2,143],"114":72,"130":[2,143],"131":[2,143],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"47":[1,95],"105":[1,236],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,145],"4":[2,145],"29":[2,145],"30":[2,145],"47":[2,145],"55":[2,145],"59":[2,145],"68":[2,145],"69":[2,145],"70":[2,145],"71":[2,145],"74":[2,145],"75":[2,145],"76":[2,145],"77":[2,145],"80":[2,145],"88":[2,145],"89":[2,145],"90":[2,145],"94":[2,145],"96":[2,145],"105":[2,145],"107":[2,145],"108":[2,145],"109":[2,145],"113":[2,145],"121":[2,145],"130":[2,145],"131":[2,145],"133":[2,145],"134":[2,145],"137":[2,145],"138":[2,145],"139":[2,145],"140":[2,145],"141":[2,145],"142":[2,145],"144":[2,145]},{"4":[2,134],"29":[2,134],"47":[1,95],"55":[2,134],"59":[1,238],"93":237,"94":[1,200],"96":[2,134],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,127],"4":[2,127],"29":[2,127],"30":[2,127],"41":[2,127],"47":[2,127],"55":[2,127],"59":[2,127],"68":[2,127],"69":[2,127],"70":[2,127],"71":[2,127],"74":[2,127],"75":[2,127],"76":[2,127],"77":[2,127],"80":[2,127],"88":[2,127],"89":[2,127],"90":[2,127],"94":[2,127],"96":[2,127],"105":[2,127],"107":[2,127],"108":[2,127],"109":[2,127],"113":[2,127],"119":[2,127],"120":[2,127],"121":[2,127],"130":[2,127],"131":[2,127],"133":[2,127],"134":[2,127],"137":[2,127],"138":[2,127],"139":[2,127],"140":[2,127],"141":[2,127],"142":[2,127],"144":[2,127]},{"4":[2,57],"29":[2,57],"54":239,"55":[1,240],"96":[2,57]},{"4":[2,129],"29":[2,129],"30":[2,129],"55":[2,129],"90":[2,129],"96":[2,129]},{"8":210,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"91":241,"92":[1,60],"95":[1,59],"97":152,"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,135],"29":[2,135],"30":[2,135],"55":[2,135],"90":[2,135],"96":[2,135]},{"1":[2,122],"4":[2,122],"29":[2,122],"30":[2,122],"41":[2,122],"44":[2,122],"47":[2,122],"55":[2,122],"59":[2,122],"68":[2,122],"69":[2,122],"70":[2,122],"71":[2,122],"74":[2,122],"75":[2,122],"76":[2,122],"77":[2,122],"80":[2,122],"82":[2,122],"88":[2,122],"89":[2,122],"90":[2,122],"94":[2,122],"96":[2,122],"105":[2,122],"107":[2,122],"108":[2,122],"109":[2,122],"113":[2,122],"121":[2,122],"130":[2,122],"131":[2,122],"133":[2,122],"134":[2,122],"135":[2,122],"136":[2,122],"137":[2,122],"138":[2,122],"139":[2,122],"140":[2,122],"141":[2,122],"142":[2,122],"143":[2,122],"144":[2,122]},{"4":[1,122],"6":242,"29":[1,6],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"4":[1,122],"6":243,"29":[1,6],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,146],"4":[2,146],"29":[2,146],"30":[2,146],"47":[1,95],"55":[2,146],"59":[2,146],"75":[2,146],"80":[2,146],"90":[2,146],"94":[2,146],"96":[2,146],"105":[2,146],"106":93,"107":[1,68],"108":[1,244],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,146],"130":[2,146],"131":[2,146],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,148],"4":[2,148],"29":[2,148],"30":[2,148],"47":[1,95],"55":[2,148],"59":[2,148],"75":[2,148],"80":[2,148],"90":[2,148],"94":[2,148],"96":[2,148],"105":[2,148],"106":93,"107":[1,68],"108":[1,245],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,148],"130":[2,148],"131":[2,148],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,154],"4":[2,154],"29":[2,154],"30":[2,154],"47":[2,154],"55":[2,154],"59":[2,154],"75":[2,154],"80":[2,154],"90":[2,154],"94":[2,154],"96":[2,154],"105":[2,154],"107":[2,154],"108":[2,154],"109":[2,154],"113":[2,154],"121":[2,154],"130":[2,154],"131":[2,154],"133":[2,154],"134":[2,154],"137":[2,154],"138":[2,154],"139":[2,154],"140":[2,154],"141":[2,154],"142":[2,154],"144":[2,154]},{"1":[2,155],"4":[2,155],"29":[2,155],"30":[2,155],"47":[1,95],"55":[2,155],"59":[2,155],"75":[2,155],"80":[2,155],"90":[2,155],"94":[2,155],"96":[2,155],"105":[2,155],"106":93,"107":[1,68],"108":[2,155],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,155],"130":[2,155],"131":[2,155],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,159],"4":[2,159],"29":[2,159],"30":[2,159],"47":[2,159],"55":[2,159],"59":[2,159],"75":[2,159],"80":[2,159],"90":[2,159],"94":[2,159],"96":[2,159],"105":[2,159],"107":[2,159],"108":[2,159],"109":[2,159],"113":[2,159],"121":[2,159],"130":[2,159],"131":[2,159],"133":[2,159],"134":[2,159],"137":[2,159],"138":[2,159],"139":[2,159],"140":[2,159],"141":[2,159],"142":[2,159],"144":[2,159]},{"119":[2,161],"120":[2,161]},{"31":166,"32":[1,76],"63":167,"64":168,"78":[1,73],"95":[1,247],"116":246,"118":165},{"55":[1,248],"119":[2,166],"120":[2,166]},{"55":[2,163],"119":[2,163],"120":[2,163]},{"55":[2,164],"119":[2,164],"120":[2,164]},{"55":[2,165],"119":[2,165],"120":[2,165]},{"1":[2,160],"4":[2,160],"29":[2,160],"30":[2,160],"47":[2,160],"55":[2,160],"59":[2,160],"75":[2,160],"80":[2,160],"90":[2,160],"94":[2,160],"96":[2,160],"105":[2,160],"107":[2,160],"108":[2,160],"109":[2,160],"113":[2,160],"121":[2,160],"130":[2,160],"131":[2,160],"133":[2,160],"134":[2,160],"137":[2,160],"138":[2,160],"139":[2,160],"140":[2,160],"141":[2,160],"142":[2,160],"144":[2,160]},{"8":249,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":250,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,57],"29":[2,57],"54":251,"55":[1,252],"80":[2,57]},{"4":[2,90],"29":[2,90],"30":[2,90],"55":[2,90],"80":[2,90]},{"4":[2,41],"29":[2,41],"30":[2,41],"44":[1,253],"55":[2,41],"80":[2,41]},{"4":[2,42],"29":[2,42],"30":[2,42],"44":[1,254],"55":[2,42],"80":[2,42]},{"4":[2,43],"29":[2,43],"30":[2,43],"55":[2,43],"80":[2,43]},{"4":[2,48],"29":[2,48],"30":[2,48],"55":[2,48],"80":[2,48]},{"31":155,"32":[1,76]},{"1":[2,6],"4":[2,6],"30":[2,6]},{"1":[2,29],"4":[2,29],"29":[2,29],"30":[2,29],"47":[2,29],"55":[2,29],"59":[2,29],"75":[2,29],"80":[2,29],"90":[2,29],"94":[2,29],"96":[2,29],"101":[2,29],"102":[2,29],"105":[2,29],"107":[2,29],"108":[2,29],"109":[2,29],"113":[2,29],"121":[2,29],"124":[2,29],"126":[2,29],"130":[2,29],"131":[2,29],"133":[2,29],"134":[2,29],"137":[2,29],"138":[2,29],"139":[2,29],"140":[2,29],"141":[2,29],"142":[2,29],"144":[2,29]},{"1":[2,199],"4":[2,199],"29":[2,199],"30":[2,199],"47":[1,95],"55":[2,199],"59":[2,199],"75":[2,199],"80":[2,199],"90":[2,199],"94":[2,199],"96":[2,199],"105":[2,199],"106":93,"107":[2,199],"108":[2,199],"109":[2,199],"112":94,"113":[2,199],"114":72,"121":[2,199],"130":[2,199],"131":[2,199],"133":[2,199],"134":[2,199],"137":[2,199],"138":[2,199],"139":[1,86],"140":[2,199],"141":[2,199],"142":[2,199],"144":[2,199]},{"1":[2,200],"4":[2,200],"29":[2,200],"30":[2,200],"47":[1,95],"55":[2,200],"59":[2,200],"75":[2,200],"80":[2,200],"90":[2,200],"94":[2,200],"96":[2,200],"105":[2,200],"106":93,"107":[2,200],"108":[2,200],"109":[2,200],"112":94,"113":[2,200],"114":72,"121":[2,200],"130":[2,200],"131":[2,200],"133":[2,200],"134":[2,200],"137":[2,200],"138":[2,200],"139":[1,86],"140":[2,200],"141":[2,200],"142":[2,200],"144":[2,200]},{"1":[2,201],"4":[2,201],"29":[2,201],"30":[2,201],"47":[1,95],"55":[2,201],"59":[2,201],"75":[2,201],"80":[2,201],"90":[2,201],"94":[2,201],"96":[2,201],"105":[2,201],"106":93,"107":[2,201],"108":[2,201],"109":[2,201],"112":94,"113":[2,201],"114":72,"121":[2,201],"130":[2,201],"131":[2,201],"133":[1,83],"134":[1,82],"137":[2,201],"138":[2,201],"139":[1,86],"140":[1,87],"141":[1,88],"142":[2,201],"144":[1,90]},{"1":[2,202],"4":[2,202],"29":[2,202],"30":[2,202],"47":[1,95],"55":[2,202],"59":[2,202],"75":[2,202],"80":[2,202],"90":[2,202],"94":[2,202],"96":[2,202],"105":[2,202],"106":93,"107":[2,202],"108":[2,202],"109":[2,202],"112":94,"113":[2,202],"114":72,"121":[2,202],"130":[2,202],"131":[2,202],"133":[1,83],"134":[1,82],"137":[2,202],"138":[2,202],"139":[1,86],"140":[1,87],"141":[1,88],"142":[2,202],"144":[1,90]},{"1":[2,203],"4":[2,203],"29":[2,203],"30":[2,203],"47":[1,95],"55":[2,203],"59":[2,203],"75":[2,203],"80":[2,203],"90":[2,203],"94":[2,203],"96":[2,203],"105":[2,203],"106":93,"107":[2,203],"108":[2,203],"109":[2,203],"112":94,"113":[2,203],"114":72,"121":[2,203],"130":[2,203],"131":[2,203],"133":[2,203],"134":[2,203],"137":[2,203],"138":[2,203],"139":[2,203],"140":[2,203],"141":[2,203],"142":[2,203],"144":[2,203]},{"1":[2,204],"4":[2,204],"29":[2,204],"30":[2,204],"47":[1,95],"55":[2,204],"59":[2,204],"75":[2,204],"80":[2,204],"90":[2,204],"94":[2,204],"96":[2,204],"105":[2,204],"106":93,"107":[2,204],"108":[2,204],"109":[2,204],"112":94,"113":[2,204],"114":72,"121":[2,204],"130":[2,204],"131":[2,204],"133":[1,83],"134":[1,82],"137":[2,204],"138":[2,204],"139":[1,86],"140":[2,204],"141":[2,204],"142":[2,204],"144":[2,204]},{"1":[2,205],"4":[2,205],"29":[2,205],"30":[2,205],"47":[1,95],"55":[2,205],"59":[2,205],"75":[2,205],"80":[2,205],"90":[2,205],"94":[2,205],"96":[2,205],"105":[2,205],"106":93,"107":[2,205],"108":[2,205],"109":[2,205],"112":94,"113":[2,205],"114":72,"121":[2,205],"130":[2,205],"131":[2,205],"133":[1,83],"134":[1,82],"137":[2,205],"138":[2,205],"139":[1,86],"140":[1,87],"141":[2,205],"142":[2,205],"144":[2,205]},{"1":[2,206],"4":[2,206],"29":[2,206],"30":[2,206],"47":[1,95],"55":[2,206],"59":[2,206],"75":[2,206],"80":[2,206],"90":[2,206],"94":[2,206],"96":[2,206],"105":[2,206],"106":93,"107":[2,206],"108":[2,206],"109":[2,206],"112":94,"113":[2,206],"114":72,"121":[2,206],"130":[2,206],"131":[2,206],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[2,206],"144":[1,90]},{"1":[2,209],"4":[2,209],"29":[2,209],"30":[2,209],"47":[1,95],"55":[2,209],"59":[2,209],"75":[2,209],"80":[2,209],"90":[2,209],"94":[2,209],"96":[2,209],"105":[2,209],"106":93,"107":[2,209],"108":[2,209],"109":[2,209],"112":94,"113":[2,209],"114":72,"121":[2,209],"130":[2,209],"131":[2,209],"133":[1,83],"134":[1,82],"137":[2,209],"138":[2,209],"139":[1,86],"140":[1,87],"141":[1,88],"142":[2,209],"144":[2,209]},{"1":[2,189],"4":[2,189],"29":[2,189],"30":[2,189],"47":[1,95],"55":[2,189],"59":[2,189],"75":[2,189],"80":[2,189],"90":[2,189],"94":[2,189],"96":[2,189],"105":[2,189],"106":93,"107":[1,68],"108":[2,189],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,189],"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,191],"4":[2,191],"29":[2,191],"30":[2,191],"47":[1,95],"55":[2,191],"59":[2,191],"75":[2,191],"80":[2,191],"90":[2,191],"94":[2,191],"96":[2,191],"105":[2,191],"106":93,"107":[1,68],"108":[2,191],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,191],"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,188],"4":[2,188],"29":[2,188],"30":[2,188],"47":[1,95],"55":[2,188],"59":[2,188],"75":[2,188],"80":[2,188],"90":[2,188],"94":[2,188],"96":[2,188],"105":[2,188],"106":93,"107":[1,68],"108":[2,188],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,188],"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,190],"4":[2,190],"29":[2,190],"30":[2,190],"47":[1,95],"55":[2,190],"59":[2,190],"75":[2,190],"80":[2,190],"90":[2,190],"94":[2,190],"96":[2,190],"105":[2,190],"106":93,"107":[1,68],"108":[2,190],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,190],"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,110],"4":[2,110],"29":[2,110],"30":[2,110],"47":[2,110],"55":[2,110],"59":[2,110],"68":[2,110],"69":[2,110],"70":[2,110],"71":[2,110],"74":[2,110],"75":[2,110],"76":[2,110],"77":[2,110],"80":[2,110],"88":[2,110],"89":[2,110],"90":[2,110],"94":[2,110],"96":[2,110],"105":[2,110],"107":[2,110],"108":[2,110],"109":[2,110],"113":[2,110],"121":[2,110],"130":[2,110],"131":[2,110],"133":[2,110],"134":[2,110],"137":[2,110],"138":[2,110],"139":[2,110],"140":[2,110],"141":[2,110],"142":[2,110],"144":[2,110]},{"1":[2,79],"4":[2,79],"29":[2,79],"30":[2,79],"41":[2,79],"47":[2,79],"55":[2,79],"59":[2,79],"68":[2,79],"69":[2,79],"70":[2,79],"71":[2,79],"74":[2,79],"75":[2,79],"76":[2,79],"77":[2,79],"80":[2,79],"82":[2,79],"88":[2,79],"89":[2,79],"90":[2,79],"94":[2,79],"96":[2,79],"105":[2,79],"107":[2,79],"108":[2,79],"109":[2,79],"113":[2,79],"121":[2,79],"130":[2,79],"131":[2,79],"133":[2,79],"134":[2,79],"135":[2,79],"136":[2,79],"137":[2,79],"138":[2,79],"139":[2,79],"140":[2,79],"141":[2,79],"142":[2,79],"143":[2,79],"144":[2,79]},{"1":[2,80],"4":[2,80],"29":[2,80],"30":[2,80],"41":[2,80],"47":[2,80],"55":[2,80],"59":[2,80],"68":[2,80],"69":[2,80],"70":[2,80],"71":[2,80],"74":[2,80],"75":[2,80],"76":[2,80],"77":[2,80],"80":[2,80],"82":[2,80],"88":[2,80],"89":[2,80],"90":[2,80],"94":[2,80],"96":[2,80],"105":[2,80],"107":[2,80],"108":[2,80],"109":[2,80],"113":[2,80],"121":[2,80],"130":[2,80],"131":[2,80],"133":[2,80],"134":[2,80],"135":[2,80],"136":[2,80],"137":[2,80],"138":[2,80],"139":[2,80],"140":[2,80],"141":[2,80],"142":[2,80],"143":[2,80],"144":[2,80]},{"1":[2,82],"4":[2,82],"29":[2,82],"30":[2,82],"41":[2,82],"47":[2,82],"55":[2,82],"59":[2,82],"68":[2,82],"69":[2,82],"70":[2,82],"71":[2,82],"74":[2,82],"75":[2,82],"76":[2,82],"77":[2,82],"80":[2,82],"82":[2,82],"88":[2,82],"89":[2,82],"90":[2,82],"94":[2,82],"96":[2,82],"105":[2,82],"107":[2,82],"108":[2,82],"109":[2,82],"113":[2,82],"121":[2,82],"130":[2,82],"131":[2,82],"133":[2,82],"134":[2,82],"135":[2,82],"136":[2,82],"137":[2,82],"138":[2,82],"139":[2,82],"140":[2,82],"141":[2,82],"142":[2,82],"143":[2,82],"144":[2,82]},{"47":[1,95],"59":[1,201],"75":[1,255],"93":256,"94":[1,200],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"8":257,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"12":[2,120],"13":[2,120],"14":[2,120],"32":[2,120],"34":[2,120],"35":[2,120],"37":[2,120],"38":[2,120],"39":[2,120],"45":[2,120],"46":[2,120],"48":[2,120],"52":[2,120],"53":[2,120],"58":[2,120],"75":[2,120],"78":[2,120],"81":[2,120],"87":[2,120],"92":[2,120],"95":[2,120],"99":[2,120],"103":[2,120],"104":[2,120],"107":[2,120],"109":[2,120],"111":[2,120],"113":[2,120],"122":[2,120],"128":[2,120],"129":[2,120],"132":[2,120],"133":[2,120],"134":[2,120],"135":[2,120],"136":[2,120]},{"12":[2,121],"13":[2,121],"14":[2,121],"32":[2,121],"34":[2,121],"35":[2,121],"37":[2,121],"38":[2,121],"39":[2,121],"45":[2,121],"46":[2,121],"48":[2,121],"52":[2,121],"53":[2,121],"58":[2,121],"75":[2,121],"78":[2,121],"81":[2,121],"87":[2,121],"92":[2,121],"95":[2,121],"99":[2,121],"103":[2,121],"104":[2,121],"107":[2,121],"109":[2,121],"111":[2,121],"113":[2,121],"122":[2,121],"128":[2,121],"129":[2,121],"132":[2,121],"133":[2,121],"134":[2,121],"135":[2,121],"136":[2,121]},{"1":[2,86],"4":[2,86],"29":[2,86],"30":[2,86],"41":[2,86],"47":[2,86],"55":[2,86],"59":[2,86],"68":[2,86],"69":[2,86],"70":[2,86],"71":[2,86],"74":[2,86],"75":[2,86],"76":[2,86],"77":[2,86],"80":[2,86],"82":[2,86],"88":[2,86],"89":[2,86],"90":[2,86],"94":[2,86],"96":[2,86],"105":[2,86],"107":[2,86],"108":[2,86],"109":[2,86],"113":[2,86],"121":[2,86],"130":[2,86],"131":[2,86],"133":[2,86],"134":[2,86],"135":[2,86],"136":[2,86],"137":[2,86],"138":[2,86],"139":[2,86],"140":[2,86],"141":[2,86],"142":[2,86],"143":[2,86],"144":[2,86]},{"8":258,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,87],"4":[2,87],"29":[2,87],"30":[2,87],"41":[2,87],"47":[2,87],"55":[2,87],"59":[2,87],"68":[2,87],"69":[2,87],"70":[2,87],"71":[2,87],"74":[2,87],"75":[2,87],"76":[2,87],"77":[2,87],"80":[2,87],"82":[2,87],"88":[2,87],"89":[2,87],"90":[2,87],"94":[2,87],"96":[2,87],"105":[2,87],"107":[2,87],"108":[2,87],"109":[2,87],"113":[2,87],"121":[2,87],"130":[2,87],"131":[2,87],"133":[2,87],"134":[2,87],"135":[2,87],"136":[2,87],"137":[2,87],"138":[2,87],"139":[2,87],"140":[2,87],"141":[2,87],"142":[2,87],"143":[2,87],"144":[2,87]},{"1":[2,111],"4":[2,111],"29":[2,111],"30":[2,111],"47":[2,111],"55":[2,111],"59":[2,111],"68":[2,111],"69":[2,111],"70":[2,111],"71":[2,111],"74":[2,111],"75":[2,111],"76":[2,111],"77":[2,111],"80":[2,111],"88":[2,111],"89":[2,111],"90":[2,111],"94":[2,111],"96":[2,111],"105":[2,111],"107":[2,111],"108":[2,111],"109":[2,111],"113":[2,111],"121":[2,111],"130":[2,111],"131":[2,111],"133":[2,111],"134":[2,111],"137":[2,111],"138":[2,111],"139":[2,111],"140":[2,111],"141":[2,111],"142":[2,111],"144":[2,111]},{"1":[2,39],"4":[2,39],"29":[2,39],"30":[2,39],"47":[1,95],"55":[2,39],"59":[2,39],"75":[2,39],"80":[2,39],"90":[2,39],"94":[2,39],"96":[2,39],"105":[2,39],"106":93,"107":[1,68],"108":[2,39],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,39],"130":[2,39],"131":[2,39],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"8":259,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,116],"4":[2,116],"29":[2,116],"30":[2,116],"47":[2,116],"55":[2,116],"59":[2,116],"68":[2,116],"69":[2,116],"70":[2,116],"71":[2,116],"74":[2,116],"75":[2,116],"76":[2,116],"77":[2,116],"80":[2,116],"88":[2,116],"89":[2,116],"90":[2,116],"94":[2,116],"96":[2,116],"105":[2,116],"107":[2,116],"108":[2,116],"109":[2,116],"113":[2,116],"121":[2,116],"130":[2,116],"131":[2,116],"133":[2,116],"134":[2,116],"137":[2,116],"138":[2,116],"139":[2,116],"140":[2,116],"141":[2,116],"142":[2,116],"144":[2,116]},{"4":[2,57],"29":[2,57],"54":260,"55":[1,240],"90":[2,57]},{"4":[2,134],"29":[2,134],"30":[2,134],"47":[1,95],"55":[2,134],"59":[1,261],"90":[2,134],"96":[2,134],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"51":262,"52":[1,62],"53":[1,63]},{"56":263,"57":[1,119],"58":[1,120]},{"50":[2,64],"55":[2,64]},{"50":[2,63],"55":[2,63],"59":[1,264]},{"1":[2,207],"4":[2,207],"29":[2,207],"30":[2,207],"47":[1,95],"55":[2,207],"59":[2,207],"75":[2,207],"80":[2,207],"90":[2,207],"94":[2,207],"96":[2,207],"105":[2,207],"106":93,"107":[2,207],"108":[2,207],"109":[2,207],"112":94,"113":[2,207],"114":72,"121":[2,207],"130":[2,207],"131":[2,207],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"8":265,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,109],"4":[2,109],"29":[2,109],"30":[2,109],"47":[2,109],"55":[2,109],"59":[2,109],"62":101,"68":[1,103],"69":[1,104],"70":[1,105],"71":[1,106],"72":107,"73":108,"74":[1,109],"75":[2,109],"76":[1,110],"77":[1,111],"80":[2,109],"85":100,"88":[1,102],"89":[2,114],"90":[2,109],"94":[2,109],"96":[2,109],"105":[2,109],"107":[2,109],"108":[2,109],"109":[2,109],"113":[2,109],"121":[2,109],"130":[2,109],"131":[2,109],"133":[2,109],"134":[2,109],"137":[2,109],"138":[2,109],"139":[2,109],"140":[2,109],"141":[2,109],"142":[2,109],"144":[2,109]},{"1":[2,71],"4":[2,71],"29":[2,71],"30":[2,71],"47":[2,71],"55":[2,71],"59":[2,71],"68":[2,71],"69":[2,71],"70":[2,71],"71":[2,71],"74":[2,71],"75":[2,71],"76":[2,71],"77":[2,71],"80":[2,71],"88":[2,71],"89":[2,71],"90":[2,71],"94":[2,71],"96":[2,71],"105":[2,71],"107":[2,71],"108":[2,71],"109":[2,71],"113":[2,71],"121":[2,71],"130":[2,71],"131":[2,71],"133":[2,71],"134":[2,71],"137":[2,71],"138":[2,71],"139":[2,71],"140":[2,71],"141":[2,71],"142":[2,71],"144":[2,71]},{"8":266,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,186],"4":[2,186],"29":[2,186],"30":[2,186],"47":[2,186],"55":[2,186],"59":[2,186],"75":[2,186],"80":[2,186],"90":[2,186],"94":[2,186],"96":[2,186],"105":[2,186],"107":[2,186],"108":[2,186],"109":[2,186],"113":[2,186],"121":[2,186],"124":[2,186],"130":[2,186],"131":[2,186],"133":[2,186],"134":[2,186],"137":[2,186],"138":[2,186],"139":[2,186],"140":[2,186],"141":[2,186],"142":[2,186],"144":[2,186]},{"1":[2,139],"4":[2,139],"29":[2,139],"30":[2,139],"47":[2,139],"55":[2,139],"59":[2,139],"75":[2,139],"80":[2,139],"90":[2,139],"94":[2,139],"96":[2,139],"101":[1,267],"105":[2,139],"107":[2,139],"108":[2,139],"109":[2,139],"113":[2,139],"121":[2,139],"130":[2,139],"131":[2,139],"133":[2,139],"134":[2,139],"137":[2,139],"138":[2,139],"139":[2,139],"140":[2,139],"141":[2,139],"142":[2,139],"144":[2,139]},{"4":[1,122],"6":268,"29":[1,6]},{"31":269,"32":[1,76]},{"123":270,"125":226,"126":[1,227]},{"30":[1,271],"124":[1,272],"125":273,"126":[1,227]},{"30":[2,179],"124":[2,179],"126":[2,179]},{"8":275,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"98":274,"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"15":276,"16":129,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":130,"43":65,"58":[1,61],"61":218,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"87":[1,33],"92":[1,60],"95":[1,59],"104":[1,58]},{"4":[2,105],"28":177,"30":[2,105],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"83":277,"84":231},{"4":[1,279],"30":[1,278]},{"4":[2,106],"30":[2,106],"80":[2,106]},{"4":[2,105],"28":177,"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"80":[2,105],"83":280,"84":231},{"4":[2,102],"30":[2,102],"80":[2,102]},{"4":[2,43],"30":[2,43],"44":[1,281],"80":[2,43]},{"1":[2,100],"4":[2,100],"29":[1,282],"30":[2,100],"47":[2,100],"55":[2,100],"59":[2,100],"62":101,"68":[1,103],"69":[1,104],"70":[1,105],"71":[1,106],"72":107,"73":108,"74":[1,109],"75":[2,100],"76":[1,110],"77":[1,111],"80":[2,100],"85":100,"88":[1,102],"89":[2,114],"90":[2,100],"94":[2,100],"96":[2,100],"105":[2,100],"107":[2,100],"108":[2,100],"109":[2,100],"113":[2,100],"121":[2,100],"130":[2,100],"131":[2,100],"133":[2,100],"134":[2,100],"137":[2,100],"138":[2,100],"139":[2,100],"140":[2,100],"141":[2,100],"142":[2,100],"144":[2,100]},{"1":[2,144],"4":[2,144],"29":[2,144],"30":[2,144],"47":[2,144],"55":[2,144],"59":[2,144],"68":[2,144],"69":[2,144],"70":[2,144],"71":[2,144],"74":[2,144],"75":[2,144],"76":[2,144],"77":[2,144],"80":[2,144],"88":[2,144],"89":[2,144],"90":[2,144],"94":[2,144],"96":[2,144],"105":[2,144],"107":[2,144],"108":[2,144],"109":[2,144],"113":[2,144],"121":[2,144],"130":[2,144],"131":[2,144],"133":[2,144],"134":[2,144],"137":[2,144],"138":[2,144],"139":[2,144],"140":[2,144],"141":[2,144],"142":[2,144],"144":[2,144]},{"8":283,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,66],"12":[2,121],"13":[2,121],"14":[2,121],"29":[2,66],"32":[2,121],"34":[2,121],"35":[2,121],"37":[2,121],"38":[2,121],"39":[2,121],"45":[2,121],"46":[2,121],"48":[2,121],"52":[2,121],"53":[2,121],"55":[2,66],"58":[2,121],"78":[2,121],"81":[2,121],"87":[2,121],"92":[2,121],"95":[2,121],"96":[2,66],"99":[2,121],"103":[2,121],"104":[2,121],"107":[2,121],"109":[2,121],"111":[2,121],"113":[2,121],"122":[2,121],"128":[2,121],"129":[2,121],"132":[2,121],"133":[2,121],"134":[2,121],"135":[2,121],"136":[2,121]},{"4":[1,285],"29":[1,286],"96":[1,284]},{"4":[2,58],"8":210,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[2,58],"30":[2,58],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"90":[2,58],"92":[1,60],"95":[1,59],"96":[2,58],"97":287,"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,57],"29":[2,57],"30":[2,57],"54":288,"55":[1,240]},{"1":[2,183],"4":[2,183],"29":[2,183],"30":[2,183],"47":[2,183],"55":[2,183],"59":[2,183],"75":[2,183],"80":[2,183],"90":[2,183],"94":[2,183],"96":[2,183],"105":[2,183],"107":[2,183],"108":[2,183],"109":[2,183],"113":[2,183],"121":[2,183],"124":[2,183],"130":[2,183],"131":[2,183],"133":[2,183],"134":[2,183],"137":[2,183],"138":[2,183],"139":[2,183],"140":[2,183],"141":[2,183],"142":[2,183],"144":[2,183]},{"1":[2,184],"4":[2,184],"29":[2,184],"30":[2,184],"47":[2,184],"55":[2,184],"59":[2,184],"75":[2,184],"80":[2,184],"90":[2,184],"94":[2,184],"96":[2,184],"105":[2,184],"107":[2,184],"108":[2,184],"109":[2,184],"113":[2,184],"121":[2,184],"124":[2,184],"130":[2,184],"131":[2,184],"133":[2,184],"134":[2,184],"137":[2,184],"138":[2,184],"139":[2,184],"140":[2,184],"141":[2,184],"142":[2,184],"144":[2,184]},{"8":289,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":290,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"119":[2,162],"120":[2,162]},{"8":210,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"91":151,"92":[1,60],"95":[1,59],"96":[1,150],"97":152,"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"31":166,"32":[1,76],"63":167,"64":168,"78":[1,73],"95":[1,247],"118":291},{"1":[2,168],"4":[2,168],"29":[2,168],"30":[2,168],"47":[1,95],"55":[2,168],"59":[2,168],"75":[2,168],"80":[2,168],"90":[2,168],"94":[2,168],"96":[2,168],"105":[2,168],"106":93,"107":[2,168],"108":[1,292],"109":[2,168],"112":94,"113":[2,168],"114":72,"121":[1,293],"130":[2,168],"131":[2,168],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,169],"4":[2,169],"29":[2,169],"30":[2,169],"47":[1,95],"55":[2,169],"59":[2,169],"75":[2,169],"80":[2,169],"90":[2,169],"94":[2,169],"96":[2,169],"105":[2,169],"106":93,"107":[2,169],"108":[1,294],"109":[2,169],"112":94,"113":[2,169],"114":72,"121":[2,169],"130":[2,169],"131":[2,169],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"4":[1,296],"29":[1,297],"80":[1,295]},{"4":[2,58],"28":177,"29":[2,58],"30":[2,58],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":298,"43":176,"46":[1,49],"58":[1,178],"80":[2,58]},{"8":299,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,300],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":301,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,302],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,85],"4":[2,85],"29":[2,85],"30":[2,85],"41":[2,85],"47":[2,85],"55":[2,85],"59":[2,85],"68":[2,85],"69":[2,85],"70":[2,85],"71":[2,85],"74":[2,85],"75":[2,85],"76":[2,85],"77":[2,85],"80":[2,85],"82":[2,85],"88":[2,85],"89":[2,85],"90":[2,85],"94":[2,85],"96":[2,85],"105":[2,85],"107":[2,85],"108":[2,85],"109":[2,85],"113":[2,85],"121":[2,85],"130":[2,85],"131":[2,85],"133":[2,85],"134":[2,85],"135":[2,85],"136":[2,85],"137":[2,85],"138":[2,85],"139":[2,85],"140":[2,85],"141":[2,85],"142":[2,85],"143":[2,85],"144":[2,85]},{"8":303,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"75":[1,304],"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"47":[1,95],"75":[1,305],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"47":[1,95],"75":[1,255],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"30":[1,306],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"4":[1,285],"29":[1,286],"90":[1,307]},{"4":[2,66],"29":[2,66],"30":[2,66],"55":[2,66],"90":[2,66],"96":[2,66]},{"4":[1,122],"6":308,"29":[1,6]},{"50":[2,61],"55":[2,61]},{"50":[2,65],"55":[2,65]},{"30":[1,309],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"4":[1,122],"6":310,"29":[1,6],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"4":[1,122],"6":311,"29":[1,6]},{"1":[2,140],"4":[2,140],"29":[2,140],"30":[2,140],"47":[2,140],"55":[2,140],"59":[2,140],"75":[2,140],"80":[2,140],"90":[2,140],"94":[2,140],"96":[2,140],"105":[2,140],"107":[2,140],"108":[2,140],"109":[2,140],"113":[2,140],"121":[2,140],"130":[2,140],"131":[2,140],"133":[2,140],"134":[2,140],"137":[2,140],"138":[2,140],"139":[2,140],"140":[2,140],"141":[2,140],"142":[2,140],"144":[2,140]},{"4":[1,122],"6":312,"29":[1,6]},{"30":[1,313],"124":[1,314],"125":273,"126":[1,227]},{"1":[2,177],"4":[2,177],"29":[2,177],"30":[2,177],"47":[2,177],"55":[2,177],"59":[2,177],"75":[2,177],"80":[2,177],"90":[2,177],"94":[2,177],"96":[2,177],"105":[2,177],"107":[2,177],"108":[2,177],"109":[2,177],"113":[2,177],"121":[2,177],"130":[2,177],"131":[2,177],"133":[2,177],"134":[2,177],"137":[2,177],"138":[2,177],"139":[2,177],"140":[2,177],"141":[2,177],"142":[2,177],"144":[2,177]},{"4":[1,122],"6":315,"29":[1,6]},{"30":[2,180],"124":[2,180],"126":[2,180]},{"4":[1,122],"6":316,"29":[1,6],"55":[1,317]},{"4":[2,136],"29":[2,136],"47":[1,95],"55":[2,136],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,95],"4":[2,95],"29":[1,318],"30":[2,95],"47":[2,95],"55":[2,95],"59":[2,95],"62":101,"68":[1,103],"69":[1,104],"70":[1,105],"71":[1,106],"72":107,"73":108,"74":[1,109],"75":[2,95],"76":[1,110],"77":[1,111],"80":[2,95],"85":100,"88":[1,102],"89":[2,114],"90":[2,95],"94":[2,95],"96":[2,95],"105":[2,95],"107":[2,95],"108":[2,95],"109":[2,95],"113":[2,95],"121":[2,95],"130":[2,95],"131":[2,95],"133":[2,95],"134":[2,95],"137":[2,95],"138":[2,95],"139":[2,95],"140":[2,95],"141":[2,95],"142":[2,95],"144":[2,95]},{"4":[1,279],"30":[1,319]},{"1":[2,98],"4":[2,98],"29":[2,98],"30":[2,98],"47":[2,98],"55":[2,98],"59":[2,98],"75":[2,98],"80":[2,98],"90":[2,98],"94":[2,98],"96":[2,98],"105":[2,98],"107":[2,98],"108":[2,98],"109":[2,98],"113":[2,98],"121":[2,98],"130":[2,98],"131":[2,98],"133":[2,98],"134":[2,98],"137":[2,98],"138":[2,98],"139":[2,98],"140":[2,98],"141":[2,98],"142":[2,98],"144":[2,98]},{"28":177,"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"84":320},{"4":[1,279],"80":[1,321]},{"8":322,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,323],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,105],"28":177,"30":[2,105],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"83":324,"84":231},{"47":[1,95],"96":[1,325],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,128],"4":[2,128],"29":[2,128],"30":[2,128],"41":[2,128],"47":[2,128],"55":[2,128],"59":[2,128],"68":[2,128],"69":[2,128],"70":[2,128],"71":[2,128],"74":[2,128],"75":[2,128],"76":[2,128],"77":[2,128],"80":[2,128],"88":[2,128],"89":[2,128],"90":[2,128],"94":[2,128],"96":[2,128],"105":[2,128],"107":[2,128],"108":[2,128],"109":[2,128],"113":[2,128],"119":[2,128],"120":[2,128],"121":[2,128],"130":[2,128],"131":[2,128],"133":[2,128],"134":[2,128],"137":[2,128],"138":[2,128],"139":[2,128],"140":[2,128],"141":[2,128],"142":[2,128],"144":[2,128]},{"8":210,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"97":326,"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":210,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"29":[1,153],"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"60":154,"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"91":327,"92":[1,60],"95":[1,59],"97":152,"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,130],"29":[2,130],"30":[2,130],"55":[2,130],"90":[2,130],"96":[2,130]},{"4":[1,285],"29":[1,286],"30":[1,328]},{"1":[2,147],"4":[2,147],"29":[2,147],"30":[2,147],"47":[1,95],"55":[2,147],"59":[2,147],"75":[2,147],"80":[2,147],"90":[2,147],"94":[2,147],"96":[2,147],"105":[2,147],"106":93,"107":[1,68],"108":[2,147],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,147],"130":[2,147],"131":[2,147],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,149],"4":[2,149],"29":[2,149],"30":[2,149],"47":[1,95],"55":[2,149],"59":[2,149],"75":[2,149],"80":[2,149],"90":[2,149],"94":[2,149],"96":[2,149],"105":[2,149],"106":93,"107":[1,68],"108":[2,149],"109":[1,69],"112":94,"113":[1,71],"114":72,"121":[2,149],"130":[2,149],"131":[2,149],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"119":[2,167],"120":[2,167]},{"8":329,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":330,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":331,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"1":[2,88],"4":[2,88],"29":[2,88],"30":[2,88],"41":[2,88],"47":[2,88],"55":[2,88],"59":[2,88],"68":[2,88],"69":[2,88],"70":[2,88],"71":[2,88],"74":[2,88],"75":[2,88],"76":[2,88],"77":[2,88],"80":[2,88],"88":[2,88],"89":[2,88],"90":[2,88],"94":[2,88],"96":[2,88],"105":[2,88],"107":[2,88],"108":[2,88],"109":[2,88],"113":[2,88],"119":[2,88],"120":[2,88],"121":[2,88],"130":[2,88],"131":[2,88],"133":[2,88],"134":[2,88],"137":[2,88],"138":[2,88],"139":[2,88],"140":[2,88],"141":[2,88],"142":[2,88],"144":[2,88]},{"28":177,"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":332,"43":176,"46":[1,49],"58":[1,178]},{"4":[2,89],"28":177,"29":[2,89],"30":[2,89],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":173,"43":176,"46":[1,49],"55":[2,89],"58":[1,178],"79":333},{"4":[2,91],"29":[2,91],"30":[2,91],"55":[2,91],"80":[2,91]},{"4":[2,44],"29":[2,44],"30":[2,44],"47":[1,95],"55":[2,44],"80":[2,44],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"8":334,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,45],"29":[2,45],"30":[2,45],"47":[1,95],"55":[2,45],"80":[2,45],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"8":335,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"47":[1,95],"75":[1,336],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,125],"4":[2,125],"29":[2,125],"30":[2,125],"41":[2,125],"47":[2,125],"55":[2,125],"59":[2,125],"68":[2,125],"69":[2,125],"70":[2,125],"71":[2,125],"74":[2,125],"75":[2,125],"76":[2,125],"77":[2,125],"80":[2,125],"82":[2,125],"88":[2,125],"89":[2,125],"90":[2,125],"94":[2,125],"96":[2,125],"105":[2,125],"107":[2,125],"108":[2,125],"109":[2,125],"113":[2,125],"121":[2,125],"130":[2,125],"131":[2,125],"133":[2,125],"134":[2,125],"135":[2,125],"136":[2,125],"137":[2,125],"138":[2,125],"139":[2,125],"140":[2,125],"141":[2,125],"142":[2,125],"143":[2,125],"144":[2,125]},{"1":[2,126],"4":[2,126],"29":[2,126],"30":[2,126],"41":[2,126],"47":[2,126],"55":[2,126],"59":[2,126],"68":[2,126],"69":[2,126],"70":[2,126],"71":[2,126],"74":[2,126],"75":[2,126],"76":[2,126],"77":[2,126],"80":[2,126],"82":[2,126],"88":[2,126],"89":[2,126],"90":[2,126],"94":[2,126],"96":[2,126],"105":[2,126],"107":[2,126],"108":[2,126],"109":[2,126],"113":[2,126],"121":[2,126],"130":[2,126],"131":[2,126],"133":[2,126],"134":[2,126],"135":[2,126],"136":[2,126],"137":[2,126],"138":[2,126],"139":[2,126],"140":[2,126],"141":[2,126],"142":[2,126],"143":[2,126],"144":[2,126]},{"1":[2,40],"4":[2,40],"29":[2,40],"30":[2,40],"47":[2,40],"55":[2,40],"59":[2,40],"75":[2,40],"80":[2,40],"90":[2,40],"94":[2,40],"96":[2,40],"105":[2,40],"107":[2,40],"108":[2,40],"109":[2,40],"113":[2,40],"121":[2,40],"130":[2,40],"131":[2,40],"133":[2,40],"134":[2,40],"137":[2,40],"138":[2,40],"139":[2,40],"140":[2,40],"141":[2,40],"142":[2,40],"144":[2,40]},{"1":[2,117],"4":[2,117],"29":[2,117],"30":[2,117],"47":[2,117],"55":[2,117],"59":[2,117],"68":[2,117],"69":[2,117],"70":[2,117],"71":[2,117],"74":[2,117],"75":[2,117],"76":[2,117],"77":[2,117],"80":[2,117],"88":[2,117],"89":[2,117],"90":[2,117],"94":[2,117],"96":[2,117],"105":[2,117],"107":[2,117],"108":[2,117],"109":[2,117],"113":[2,117],"121":[2,117],"130":[2,117],"131":[2,117],"133":[2,117],"134":[2,117],"137":[2,117],"138":[2,117],"139":[2,117],"140":[2,117],"141":[2,117],"142":[2,117],"144":[2,117]},{"1":[2,53],"4":[2,53],"29":[2,53],"30":[2,53],"47":[2,53],"55":[2,53],"59":[2,53],"75":[2,53],"80":[2,53],"90":[2,53],"94":[2,53],"96":[2,53],"105":[2,53],"107":[2,53],"108":[2,53],"109":[2,53],"113":[2,53],"121":[2,53],"130":[2,53],"131":[2,53],"133":[2,53],"134":[2,53],"137":[2,53],"138":[2,53],"139":[2,53],"140":[2,53],"141":[2,53],"142":[2,53],"144":[2,53]},{"1":[2,208],"4":[2,208],"29":[2,208],"30":[2,208],"47":[2,208],"55":[2,208],"59":[2,208],"75":[2,208],"80":[2,208],"90":[2,208],"94":[2,208],"96":[2,208],"105":[2,208],"107":[2,208],"108":[2,208],"109":[2,208],"113":[2,208],"121":[2,208],"130":[2,208],"131":[2,208],"133":[2,208],"134":[2,208],"137":[2,208],"138":[2,208],"139":[2,208],"140":[2,208],"141":[2,208],"142":[2,208],"144":[2,208]},{"1":[2,185],"4":[2,185],"29":[2,185],"30":[2,185],"47":[2,185],"55":[2,185],"59":[2,185],"75":[2,185],"80":[2,185],"90":[2,185],"94":[2,185],"96":[2,185],"105":[2,185],"107":[2,185],"108":[2,185],"109":[2,185],"113":[2,185],"121":[2,185],"124":[2,185],"130":[2,185],"131":[2,185],"133":[2,185],"134":[2,185],"137":[2,185],"138":[2,185],"139":[2,185],"140":[2,185],"141":[2,185],"142":[2,185],"144":[2,185]},{"1":[2,141],"4":[2,141],"29":[2,141],"30":[2,141],"47":[2,141],"55":[2,141],"59":[2,141],"75":[2,141],"80":[2,141],"90":[2,141],"94":[2,141],"96":[2,141],"105":[2,141],"107":[2,141],"108":[2,141],"109":[2,141],"113":[2,141],"121":[2,141],"130":[2,141],"131":[2,141],"133":[2,141],"134":[2,141],"137":[2,141],"138":[2,141],"139":[2,141],"140":[2,141],"141":[2,141],"142":[2,141],"144":[2,141]},{"1":[2,142],"4":[2,142],"29":[2,142],"30":[2,142],"47":[2,142],"55":[2,142],"59":[2,142],"75":[2,142],"80":[2,142],"90":[2,142],"94":[2,142],"96":[2,142],"101":[2,142],"105":[2,142],"107":[2,142],"108":[2,142],"109":[2,142],"113":[2,142],"121":[2,142],"130":[2,142],"131":[2,142],"133":[2,142],"134":[2,142],"137":[2,142],"138":[2,142],"139":[2,142],"140":[2,142],"141":[2,142],"142":[2,142],"144":[2,142]},{"1":[2,175],"4":[2,175],"29":[2,175],"30":[2,175],"47":[2,175],"55":[2,175],"59":[2,175],"75":[2,175],"80":[2,175],"90":[2,175],"94":[2,175],"96":[2,175],"105":[2,175],"107":[2,175],"108":[2,175],"109":[2,175],"113":[2,175],"121":[2,175],"130":[2,175],"131":[2,175],"133":[2,175],"134":[2,175],"137":[2,175],"138":[2,175],"139":[2,175],"140":[2,175],"141":[2,175],"142":[2,175],"144":[2,175]},{"4":[1,122],"6":337,"29":[1,6]},{"30":[1,338]},{"4":[1,339],"30":[2,181],"124":[2,181],"126":[2,181]},{"8":340,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[2,105],"28":177,"30":[2,105],"31":174,"32":[1,76],"33":175,"34":[1,74],"35":[1,75],"42":233,"43":234,"46":[1,49],"58":[1,178],"78":[1,232],"83":341,"84":231},{"1":[2,96],"4":[2,96],"29":[2,96],"30":[2,96],"47":[2,96],"55":[2,96],"59":[2,96],"75":[2,96],"80":[2,96],"90":[2,96],"94":[2,96],"96":[2,96],"105":[2,96],"107":[2,96],"108":[2,96],"109":[2,96],"113":[2,96],"121":[2,96],"130":[2,96],"131":[2,96],"133":[2,96],"134":[2,96],"137":[2,96],"138":[2,96],"139":[2,96],"140":[2,96],"141":[2,96],"142":[2,96],"144":[2,96]},{"4":[2,107],"30":[2,107],"80":[2,107]},{"4":[2,108],"30":[2,108],"80":[2,108]},{"4":[2,103],"30":[2,103],"47":[1,95],"80":[2,103],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"8":342,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[1,279],"30":[1,343]},{"1":[2,123],"4":[2,123],"29":[2,123],"30":[2,123],"47":[2,123],"55":[2,123],"59":[2,123],"68":[2,123],"69":[2,123],"70":[2,123],"71":[2,123],"74":[2,123],"75":[2,123],"76":[2,123],"77":[2,123],"80":[2,123],"88":[2,123],"89":[2,123],"90":[2,123],"94":[2,123],"96":[2,123],"105":[2,123],"107":[2,123],"108":[2,123],"109":[2,123],"113":[2,123],"121":[2,123],"130":[2,123],"131":[2,123],"133":[2,123],"134":[2,123],"137":[2,123],"138":[2,123],"139":[2,123],"140":[2,123],"141":[2,123],"142":[2,123],"144":[2,123]},{"4":[2,131],"29":[2,131],"30":[2,131],"55":[2,131],"90":[2,131],"96":[2,131]},{"4":[2,57],"29":[2,57],"30":[2,57],"54":344,"55":[1,240]},{"4":[2,132],"29":[2,132],"30":[2,132],"55":[2,132],"90":[2,132],"96":[2,132]},{"1":[2,170],"4":[2,170],"29":[2,170],"30":[2,170],"47":[1,95],"55":[2,170],"59":[2,170],"75":[2,170],"80":[2,170],"90":[2,170],"94":[2,170],"96":[2,170],"105":[2,170],"106":93,"107":[2,170],"108":[2,170],"109":[2,170],"112":94,"113":[2,170],"114":72,"121":[1,345],"130":[2,170],"131":[2,170],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,172],"4":[2,172],"29":[2,172],"30":[2,172],"47":[1,95],"55":[2,172],"59":[2,172],"75":[2,172],"80":[2,172],"90":[2,172],"94":[2,172],"96":[2,172],"105":[2,172],"106":93,"107":[2,172],"108":[1,346],"109":[2,172],"112":94,"113":[2,172],"114":72,"121":[2,172],"130":[2,172],"131":[2,172],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,171],"4":[2,171],"29":[2,171],"30":[2,171],"47":[1,95],"55":[2,171],"59":[2,171],"75":[2,171],"80":[2,171],"90":[2,171],"94":[2,171],"96":[2,171],"105":[2,171],"106":93,"107":[2,171],"108":[2,171],"109":[2,171],"112":94,"113":[2,171],"114":72,"121":[2,171],"130":[2,171],"131":[2,171],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"4":[2,92],"29":[2,92],"30":[2,92],"55":[2,92],"80":[2,92]},{"4":[2,57],"29":[2,57],"30":[2,57],"54":347,"55":[1,252]},{"30":[1,348],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"30":[1,349],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,124],"4":[2,124],"29":[2,124],"30":[2,124],"41":[2,124],"47":[2,124],"55":[2,124],"59":[2,124],"68":[2,124],"69":[2,124],"70":[2,124],"71":[2,124],"74":[2,124],"75":[2,124],"76":[2,124],"77":[2,124],"80":[2,124],"82":[2,124],"88":[2,124],"89":[2,124],"90":[2,124],"94":[2,124],"96":[2,124],"105":[2,124],"107":[2,124],"108":[2,124],"109":[2,124],"113":[2,124],"121":[2,124],"130":[2,124],"131":[2,124],"133":[2,124],"134":[2,124],"135":[2,124],"136":[2,124],"137":[2,124],"138":[2,124],"139":[2,124],"140":[2,124],"141":[2,124],"142":[2,124],"143":[2,124],"144":[2,124]},{"30":[1,350]},{"1":[2,178],"4":[2,178],"29":[2,178],"30":[2,178],"47":[2,178],"55":[2,178],"59":[2,178],"75":[2,178],"80":[2,178],"90":[2,178],"94":[2,178],"96":[2,178],"105":[2,178],"107":[2,178],"108":[2,178],"109":[2,178],"113":[2,178],"121":[2,178],"130":[2,178],"131":[2,178],"133":[2,178],"134":[2,178],"137":[2,178],"138":[2,178],"139":[2,178],"140":[2,178],"141":[2,178],"142":[2,178],"144":[2,178]},{"30":[2,182],"124":[2,182],"126":[2,182]},{"4":[2,137],"29":[2,137],"47":[1,95],"55":[2,137],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"4":[1,279],"30":[1,351]},{"30":[1,352],"47":[1,95],"106":93,"107":[1,68],"109":[1,69],"112":94,"113":[1,71],"114":72,"130":[1,91],"131":[1,92],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,101],"4":[2,101],"29":[2,101],"30":[2,101],"47":[2,101],"55":[2,101],"59":[2,101],"75":[2,101],"80":[2,101],"90":[2,101],"94":[2,101],"96":[2,101],"105":[2,101],"107":[2,101],"108":[2,101],"109":[2,101],"113":[2,101],"121":[2,101],"130":[2,101],"131":[2,101],"133":[2,101],"134":[2,101],"137":[2,101],"138":[2,101],"139":[2,101],"140":[2,101],"141":[2,101],"142":[2,101],"144":[2,101]},{"4":[1,285],"29":[1,286],"30":[1,353]},{"8":354,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"8":355,"9":124,"10":23,"11":24,"12":[1,25],"13":[1,26],"14":[1,27],"15":9,"16":10,"17":11,"18":12,"19":13,"20":14,"21":15,"22":16,"23":17,"24":18,"25":19,"26":20,"27":21,"28":22,"31":64,"32":[1,76],"33":54,"34":[1,74],"35":[1,75],"36":29,"37":[1,55],"38":[1,56],"39":[1,57],"40":28,"43":65,"45":[1,50],"46":[1,49],"48":[1,34],"51":35,"52":[1,62],"53":[1,63],"58":[1,61],"61":41,"63":52,"64":53,"65":30,"66":31,"67":32,"78":[1,73],"81":[1,48],"87":[1,33],"92":[1,60],"95":[1,59],"99":[1,43],"103":[1,51],"104":[1,58],"106":44,"107":[1,68],"109":[1,69],"110":45,"111":[1,70],"112":46,"113":[1,71],"114":72,"122":[1,47],"127":42,"128":[1,66],"129":[1,67],"132":[1,36],"133":[1,37],"134":[1,38],"135":[1,39],"136":[1,40]},{"4":[1,296],"29":[1,297],"30":[1,356]},{"4":[2,46],"29":[2,46],"30":[2,46],"55":[2,46],"80":[2,46]},{"4":[2,47],"29":[2,47],"30":[2,47],"55":[2,47],"80":[2,47]},{"1":[2,176],"4":[2,176],"29":[2,176],"30":[2,176],"47":[2,176],"55":[2,176],"59":[2,176],"75":[2,176],"80":[2,176],"90":[2,176],"94":[2,176],"96":[2,176],"105":[2,176],"107":[2,176],"108":[2,176],"109":[2,176],"113":[2,176],"121":[2,176],"130":[2,176],"131":[2,176],"133":[2,176],"134":[2,176],"137":[2,176],"138":[2,176],"139":[2,176],"140":[2,176],"141":[2,176],"142":[2,176],"144":[2,176]},{"1":[2,97],"4":[2,97],"29":[2,97],"30":[2,97],"47":[2,97],"55":[2,97],"59":[2,97],"75":[2,97],"80":[2,97],"90":[2,97],"94":[2,97],"96":[2,97],"105":[2,97],"107":[2,97],"108":[2,97],"109":[2,97],"113":[2,97],"121":[2,97],"130":[2,97],"131":[2,97],"133":[2,97],"134":[2,97],"137":[2,97],"138":[2,97],"139":[2,97],"140":[2,97],"141":[2,97],"142":[2,97],"144":[2,97]},{"4":[2,104],"30":[2,104],"80":[2,104]},{"4":[2,133],"29":[2,133],"30":[2,133],"55":[2,133],"90":[2,133],"96":[2,133]},{"1":[2,173],"4":[2,173],"29":[2,173],"30":[2,173],"47":[1,95],"55":[2,173],"59":[2,173],"75":[2,173],"80":[2,173],"90":[2,173],"94":[2,173],"96":[2,173],"105":[2,173],"106":93,"107":[2,173],"108":[2,173],"109":[2,173],"112":94,"113":[2,173],"114":72,"121":[2,173],"130":[2,173],"131":[2,173],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"1":[2,174],"4":[2,174],"29":[2,174],"30":[2,174],"47":[1,95],"55":[2,174],"59":[2,174],"75":[2,174],"80":[2,174],"90":[2,174],"94":[2,174],"96":[2,174],"105":[2,174],"106":93,"107":[2,174],"108":[2,174],"109":[2,174],"112":94,"113":[2,174],"114":72,"121":[2,174],"130":[2,174],"131":[2,174],"133":[1,83],"134":[1,82],"137":[1,84],"138":[1,85],"139":[1,86],"140":[1,87],"141":[1,88],"142":[1,89],"144":[1,90]},{"4":[2,93],"29":[2,93],"30":[2,93],"55":[2,93],"80":[2,93]}],
+defaultActions: {"79":[2,4],"102":[2,115]},
+parseError: function parseError(str, hash) {
+ throw new Error(str);
+},
+parse: function parse(input) {
+ var self = this,
+ stack = [0],
+ vstack = [null], // semantic value stack
+ table = this.table,
+ yytext = '',
+ yylineno = 0,
+ yyleng = 0,
+ shifts = 0,
+ reductions = 0,
+ recovering = 0,
+ TERROR = 2,
+ EOF = 1;
+
+ this.lexer.setInput(input);
+ this.lexer.yy = this.yy;
+ this.yy.lexer = this.lexer;
+
+ var parseError = this.yy.parseError = typeof this.yy.parseError == 'function' ? this.yy.parseError : this.parseError;
+
+ function popStack (n) {
+ stack.length = stack.length - 2*n;
+ vstack.length = vstack.length - n;
+ }
+
+ function checkRecover (st) {
+ for (var p in table[st]) if (p == TERROR) {
+ return true;
+ }
+ return false;
+ }
+
+ function lex() {
+ var token;
+ token = self.lexer.lex() || 1; // $end = 1
+ // if token isn't its numeric value, convert
+ if (typeof token !== 'number') {
+ token = self.symbols_[token] || token;
+ }
+ return token;
+ };
+
+ var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected, recovered = false;
+ while (true) {
+ // retreive state number from top of stack
+ state = stack[stack.length-1];
+
+ // use default actions if available
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol == null)
+ symbol = lex();
+ // read action for current state and first input
+ action = table[state] && table[state][symbol];
+ }
+
+ // handle parse error
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
+
+ if (!recovering) {
+ // Report error
+ expected = [];
+ for (p in table[state]) if (this.terminals_[p] && p > 2) {
+ expected.push("'"+this.terminals_[p]+"'");
+ }
+ if (this.lexer.showPosition) {
+ parseError.call(this, 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+'\nExpecting '+expected.join(', '),
+ {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, expected: expected});
+ } else {
+ parseError.call(this, 'Parse error on line '+(yylineno+1)+": Unexpected '"+(this.terminals_[symbol] || symbol)+"'",
+ {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, expected: expected});
+ }
+ }
+
+ // just recovered from another error
+ if (recovering == 3) {
+ if (symbol == EOF) {
+ throw 'Parsing halted.'
+ }
+
+ // discard current lookahead and grab another
+ yyleng = this.lexer.yyleng;
+ yytext = this.lexer.yytext;
+ yylineno = this.lexer.yylineno;
+ symbol = lex();
+ }
+
+ // try to recover from error
+ while (1) {
+ // check for error recovery rule in this state
+ if (checkRecover(state)) {
+ break;
+ }
+ if (state == 0) {
+ throw 'Parsing halted.'
+ }
+ popStack(1);
+ state = stack[stack.length-1];
+ }
+
+ preErrorSymbol = symbol; // save the lookahead token
+ symbol = TERROR; // insert generic error symbol as new lookahead
+ state = stack[stack.length-1];
+ action = table[state] && table[state][TERROR];
+ recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
+ }
+
+ // this shouldn't happen, unless resolve defaults are off
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);
+ }
+
+ a = action;
+
+ switch (a[0]) {
+
+ case 1: // shift
+ shifts++;
+
+ stack.push(symbol);
+ vstack.push(this.lexer.yytext); // semantic values or junk only, no terminals
+ stack.push(a[1]); // push state
+ symbol = null;
+ if (!preErrorSymbol) { // normal execution/no error
+ yyleng = this.lexer.yyleng;
+ yytext = this.lexer.yytext;
+ yylineno = this.lexer.yylineno;
+ if (recovering > 0)
+ recovering--;
+ } else { // error just occurred, resume old lookahead f/ before error
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+ break;
+
+ case 2: // reduce
+ reductions++;
+
+ len = this.productions_[a[1]][1];
+
+ // perform semantic action
+ yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
+ r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, a[1], vstack);
+
+ if (typeof r !== 'undefined') {
+ return r;
+ }
+
+ // pop off stack
+ if (len) {
+ stack = stack.slice(0,-1*len*2);
+ vstack = vstack.slice(0, -1*len);
+ }
+
+ stack.push(this.productions_[a[1]][0]); // push nonterminal (reduce)
+ vstack.push(yyval.$);
+ // goto new state = table[STATE][NONTERMINAL]
+ newState = table[stack[stack.length-2]][stack[stack.length-1]];
+ stack.push(newState);
+ break;
+
+ case 3: // accept
+
+ this.reductionCount = reductions;
+ this.shiftCount = shifts;
+ return true;
+ }
+
+ }
+
+ return true;
+}};
+return parser;
+})();
+if (typeof require !== 'undefined') {
+exports.parser = parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); }
+exports.main = function commonjsMain(args) {
+ if (!args[1])
+ throw new Error('Usage: '+args[0]+' FILE');
+ if (typeof process !== 'undefined') {
+ var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8");
+ } else {
+ var cwd = require("file").path(require("file").cwd());
+ var source = cwd.join(args[1]).read({charset: "utf-8"});
+ }
+ return exports.parser.parse(source);
+}
+if (typeof module !== 'undefined' && require.main === module) {
+ exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args);
+}
+}
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/lib/repl.js b/node_modules/jade/support/coffee-script/lib/repl.js
new file mode 100644
index 0000000..d30f756
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/repl.js
@@ -0,0 +1,38 @@
+(function() {
+ var CoffeeScript, helpers, readline, repl, run, stdio;
+ CoffeeScript = require('./coffee-script');
+ helpers = require('./helpers');
+ readline = require('readline');
+ stdio = process.openStdin();
+ helpers.extend(global, {
+ quit: function() {
+ return process.exit(0);
+ }
+ });
+ run = function(buffer) {
+ var val;
+ try {
+ val = CoffeeScript.eval(buffer.toString(), {
+ bare: true,
+ globals: true,
+ fileName: 'repl'
+ });
+ if (val !== undefined) {
+ puts(inspect(val));
+ }
+ } catch (err) {
+ puts(err.stack || err.toString());
+ }
+ return repl.prompt();
+ };
+ repl = readline.createInterface(stdio);
+ repl.setPrompt('coffee> ');
+ stdio.on('data', function(buffer) {
+ return repl.write(buffer);
+ });
+ repl.on('close', function() {
+ return stdio.destroy();
+ });
+ repl.on('line', run);
+ repl.prompt();
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/rewriter.js b/node_modules/jade/support/coffee-script/lib/rewriter.js
new file mode 100644
index 0000000..6999fc8
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/rewriter.js
@@ -0,0 +1,378 @@
+(function() {
+ var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, _i, _len, _ref, include, left, rite;
+ include = require('./helpers').include;
+ exports.Rewriter = (function() {
+ function Rewriter() {
+ return this;
+ };
+ return Rewriter;
+ })();
+ exports.Rewriter.prototype.rewrite = function(_arg) {
+ this.tokens = _arg;
+ this.adjustComments();
+ this.removeLeadingNewlines();
+ this.removeMidExpressionNewlines();
+ this.closeOpenCalls();
+ this.closeOpenIndexes();
+ this.addImplicitIndentation();
+ this.tagPostfixConditionals();
+ this.addImplicitBraces();
+ this.addImplicitParentheses();
+ this.ensureBalance(BALANCED_PAIRS);
+ this.rewriteClosingParens();
+ return this.tokens;
+ };
+ exports.Rewriter.prototype.scanTokens = function(block) {
+ var i, token, tokens;
+ tokens = this.tokens;
+ i = 0;
+ while (token = tokens[i]) {
+ i += block.call(this, token, i, tokens);
+ }
+ return true;
+ };
+ exports.Rewriter.prototype.detectEnd = function(i, condition, action) {
+ var levels, token, tokens;
+ tokens = this.tokens;
+ levels = 0;
+ while (token = tokens[i]) {
+ if (levels === 0 && condition.call(this, token, i)) {
+ return action.call(this, token, i);
+ }
+ if (!token || levels < 0) {
+ return action.call(this, token, i - 1);
+ }
+ if (include(EXPRESSION_START, token[0])) {
+ levels += 1;
+ } else if (include(EXPRESSION_END, token[0])) {
+ levels -= 1;
+ }
+ i += 1;
+ }
+ return i - 1;
+ };
+ exports.Rewriter.prototype.adjustComments = function() {
+ return this.scanTokens(function(token, i, tokens) {
+ var _ref, after, before, post, prev;
+ if (token[0] !== 'HERECOMMENT') {
+ return 1;
+ }
+ before = tokens[i - 2];
+ prev = tokens[i - 1];
+ post = tokens[i + 1];
+ after = tokens[i + 2];
+ if (((after != null) ? after[0] : undefined) === 'INDENT') {
+ tokens.splice(i + 2, 1);
+ if (((before != null) ? before[0] : undefined) === 'OUTDENT' && ((post != null) ? post[0] : undefined) === 'TERMINATOR') {
+ tokens.splice(i - 2, 1);
+ } else {
+ tokens.splice(i, 0, after);
+ }
+ } else if (prev && !((_ref = prev[0]) === 'TERMINATOR' || _ref === 'INDENT' || _ref === 'OUTDENT')) {
+ if (((post != null) ? post[0] : undefined) === 'TERMINATOR' && ((after != null) ? after[0] : undefined) === 'OUTDENT') {
+ tokens.splice.apply(tokens, [i + 2, 0].concat(tokens.splice(i, 2)));
+ if (tokens[i + 2][0] !== 'TERMINATOR') {
+ tokens.splice(i + 2, 0, ['TERMINATOR', '\n', prev[2]]);
+ }
+ } else {
+ tokens.splice(i, 0, ['TERMINATOR', '\n', prev[2]]);
+ }
+ return 2;
+ }
+ return 1;
+ });
+ };
+ exports.Rewriter.prototype.removeLeadingNewlines = function() {
+ var _len, _ref, i, tag;
+ for (i = 0, _len = (_ref = this.tokens).length; i < _len; i++) {
+ tag = _ref[i][0];
+ if (tag !== 'TERMINATOR') {
+ break;
+ }
+ }
+ return i ? this.tokens.splice(0, i) : undefined;
+ };
+ exports.Rewriter.prototype.removeMidExpressionNewlines = function() {
+ return this.scanTokens(function(token, i, tokens) {
+ if (!(token[0] === 'TERMINATOR' && include(EXPRESSION_CLOSE, this.tag(i + 1)))) {
+ return 1;
+ }
+ tokens.splice(i, 1);
+ return 0;
+ });
+ };
+ exports.Rewriter.prototype.closeOpenCalls = function() {
+ var action, condition;
+ condition = function(token, i) {
+ var _ref;
+ return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')';
+ };
+ action = function(token, i) {
+ return (this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END');
+ };
+ return this.scanTokens(function(token, i) {
+ if (token[0] === 'CALL_START') {
+ this.detectEnd(i + 1, condition, action);
+ }
+ return 1;
+ });
+ };
+ exports.Rewriter.prototype.closeOpenIndexes = function() {
+ var action, condition;
+ condition = function(token, i) {
+ var _ref;
+ return ((_ref = token[0]) === ']' || _ref === 'INDEX_END');
+ };
+ action = function(token, i) {
+ return (token[0] = 'INDEX_END');
+ };
+ return this.scanTokens(function(token, i) {
+ if (token[0] === 'INDEX_START') {
+ this.detectEnd(i + 1, condition, action);
+ }
+ return 1;
+ });
+ };
+ exports.Rewriter.prototype.addImplicitBraces = function() {
+ var action, condition, stack;
+ stack = [];
+ condition = function(token, i) {
+ var _ref, _ref2, one, tag, three, two;
+ if (('HERECOMMENT' === this.tag(i + 1) || 'HERECOMMENT' === this.tag(i - 1))) {
+ return false;
+ }
+ _ref = this.tokens.slice(i + 1, i + 4), one = _ref[0], two = _ref[1], three = _ref[2];
+ tag = token[0];
+ return (tag === 'TERMINATOR' || tag === 'OUTDENT') && !(((two != null) ? two[0] : undefined) === ':' || ((one != null) ? one[0] : undefined) === '@' && ((three != null) ? three[0] : undefined) === ':') || tag === ',' && !((_ref2 = ((one != null) ? one[0] : undefined)) === 'IDENTIFIER' || _ref2 === 'NUMBER' || _ref2 === 'STRING' || _ref2 === '@' || _ref2 === 'TERMINATOR' || _ref2 === 'OUTDENT');
+ };
+ action = function(token, i) {
+ return this.tokens.splice(i, 0, ['}', '}', token[2]]);
+ };
+ return this.scanTokens(function(token, i, tokens) {
+ var idx, tag, tok;
+ if (include(EXPRESSION_START, tag = token[0])) {
+ stack.push(tag === 'INDENT' && this.tag(i - 1) === '{' ? '{' : tag);
+ return 1;
+ }
+ if (include(EXPRESSION_END, tag)) {
+ stack.pop();
+ return 1;
+ }
+ if (!(tag === ':' && stack[stack.length - 1] !== '{')) {
+ return 1;
+ }
+ stack.push('{');
+ idx = this.tag(i - 2) === '@' ? i - 2 : i - 1;
+ if (this.tag(idx - 2) === 'HERECOMMENT') {
+ idx -= 2;
+ }
+ tok = ['{', '{', token[2]];
+ tok.generated = true;
+ tokens.splice(idx, 0, tok);
+ this.detectEnd(i + 2, condition, action);
+ return 2;
+ });
+ };
+ exports.Rewriter.prototype.addImplicitParentheses = function() {
+ var action, classLine;
+ classLine = false;
+ action = function(token, i) {
+ var idx;
+ idx = token[0] === 'OUTDENT' ? i + 1 : i;
+ return this.tokens.splice(idx, 0, ['CALL_END', ')', token[2]]);
+ };
+ return this.scanTokens(function(token, i, tokens) {
+ var callObject, next, prev, seenSingle, tag;
+ tag = token[0];
+ if (tag === 'CLASS') {
+ classLine = true;
+ }
+ prev = tokens[i - 1];
+ next = tokens[i + 1];
+ callObject = !classLine && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && include(IMPLICIT_FUNC, prev[0]);
+ seenSingle = false;
+ if (include(LINEBREAKS, tag)) {
+ classLine = false;
+ }
+ if (prev && !prev.spaced && tag === '?') {
+ token.call = true;
+ }
+ if (!(callObject || ((prev != null) ? prev.spaced : undefined) && (prev.call || include(IMPLICIT_FUNC, prev[0])) && (include(IMPLICIT_CALL, tag) || include(IMPLICIT_UNSPACED_CALL, tag) && !token.spaced))) {
+ return 1;
+ }
+ tokens.splice(i, 0, ['CALL_START', '(', token[2]]);
+ this.detectEnd(i + (callObject ? 2 : 1), function(token, i) {
+ var post;
+ if (!seenSingle && token.fromThen) {
+ return true;
+ }
+ tag = token[0];
+ if ((tag === 'IF' || tag === 'ELSE' || tag === 'UNLESS' || tag === '->' || tag === '=>')) {
+ seenSingle = true;
+ }
+ if (tag === 'PROPERTY_ACCESS' && this.tag(i - 1) === 'OUTDENT') {
+ return true;
+ }
+ return !token.generated && this.tag(i - 1) !== ',' && include(IMPLICIT_END, tag) && (tag !== 'INDENT' || (this.tag(i - 2) !== 'CLASS' && !include(IMPLICIT_BLOCK, this.tag(i - 1)) && !((post = this.tokens[i + 1]) && post.generated && post[0] === '{')));
+ }, action);
+ if (prev[0] === '?') {
+ prev[0] = 'FUNC_EXIST';
+ }
+ return 2;
+ });
+ };
+ exports.Rewriter.prototype.addImplicitIndentation = function() {
+ return this.scanTokens(function(token, i, tokens) {
+ var _ref, _ref2, action, condition, indent, outdent, starter, tag;
+ tag = token[0];
+ if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {
+ tokens.splice.apply(tokens, [i, 0].concat(this.indentation(token)));
+ return 2;
+ }
+ if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'TERMINATOR' || _ref === 'FINALLY')) {
+ tokens.splice.apply(tokens, [i + 2, 0].concat(this.indentation(token)));
+ return 4;
+ }
+ if (include(SINGLE_LINERS, tag) && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {
+ starter = tag;
+ _ref2 = this.indentation(token), indent = _ref2[0], outdent = _ref2[1];
+ if (starter === 'THEN') {
+ indent.fromThen = true;
+ }
+ indent.generated = (outdent.generated = true);
+ tokens.splice(i + 1, 0, indent);
+ condition = function(token, i) {
+ return token[1] !== ';' && include(SINGLE_CLOSERS, token[0]) && !(token[0] === 'ELSE' && !(starter === 'IF' || starter === 'THEN'));
+ };
+ action = function(token, i) {
+ return this.tokens.splice(this.tag(i - 1) === ',' ? i - 1 : i, 0, outdent);
+ };
+ this.detectEnd(i + 2, condition, action);
+ if (tag === 'THEN') {
+ tokens.splice(i, 1);
+ }
+ return 1;
+ }
+ return 1;
+ });
+ };
+ exports.Rewriter.prototype.tagPostfixConditionals = function() {
+ var condition;
+ condition = function(token, i) {
+ var _ref;
+ return ((_ref = token[0]) === 'TERMINATOR' || _ref === 'INDENT');
+ };
+ return this.scanTokens(function(token, i) {
+ var _ref, original;
+ if (!((_ref = token[0]) === 'IF' || _ref === 'UNLESS')) {
+ return 1;
+ }
+ original = token;
+ this.detectEnd(i + 1, condition, function(token, i) {
+ return token[0] !== 'INDENT' ? (original[0] = 'POST_' + original[0]) : undefined;
+ });
+ return 1;
+ });
+ };
+ exports.Rewriter.prototype.ensureBalance = function(pairs) {
+ var _result, key, levels, open, openLine, unclosed, value;
+ levels = {};
+ openLine = {};
+ this.scanTokens(function(token, i) {
+ var _i, _len, _ref, _ref2, close, open, tag;
+ tag = token[0];
+ for (_i = 0, _len = (_ref = pairs).length; _i < _len; _i++) {
+ _ref2 = _ref[_i], open = _ref2[0], close = _ref2[1];
+ levels[open] |= 0;
+ if (tag === open) {
+ if (levels[open] === 0) {
+ openLine[open] = token[2];
+ }
+ levels[open] += 1;
+ } else if (tag === close) {
+ levels[open] -= 1;
+ }
+ if (levels[open] < 0) {
+ throw Error("too many " + (token[1]) + " on line " + (token[2] + 1));
+ }
+ }
+ return 1;
+ });
+ unclosed = (function() {
+ _result = [];
+ for (key in levels) {
+ value = levels[key];
+ if (value > 0) {
+ _result.push(key);
+ }
+ }
+ return _result;
+ })();
+ if (unclosed.length) {
+ throw Error("unclosed " + (open = unclosed[0]) + " on line " + (openLine[open] + 1));
+ }
+ };
+ exports.Rewriter.prototype.rewriteClosingParens = function() {
+ var debt, key, stack;
+ stack = [];
+ debt = {};
+ for (key in INVERSES) {
+ (debt[key] = 0);
+ }
+ return this.scanTokens(function(token, i, tokens) {
+ var inv, match, mtag, oppos, tag, val;
+ if (include(EXPRESSION_START, tag = token[0])) {
+ stack.push(token);
+ return 1;
+ }
+ if (!include(EXPRESSION_END, tag)) {
+ return 1;
+ }
+ if (debt[(inv = INVERSES[tag])] > 0) {
+ debt[inv] -= 1;
+ tokens.splice(i, 1);
+ return 0;
+ }
+ match = stack.pop();
+ mtag = match[0];
+ oppos = INVERSES[mtag];
+ if (tag === oppos) {
+ return 1;
+ }
+ debt[mtag] += 1;
+ val = [oppos, mtag === 'INDENT' ? match[1] : oppos];
+ if (this.tag(i + 2) === mtag) {
+ tokens.splice(i + 3, 0, val);
+ stack.push(match);
+ } else {
+ tokens.splice(i, 0, val);
+ }
+ return 1;
+ });
+ };
+ exports.Rewriter.prototype.indentation = function(token) {
+ return [['INDENT', 2, token[2]], ['OUTDENT', 2, token[2]]];
+ };
+ exports.Rewriter.prototype.tag = function(i) {
+ var _ref;
+ return (((_ref = this.tokens[i]) != null) ? _ref[0] : undefined);
+ };
+ BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']];
+ INVERSES = {};
+ EXPRESSION_START = [];
+ EXPRESSION_END = [];
+ for (_i = 0, _len = BALANCED_PAIRS.length; _i < _len; _i++) {
+ _ref = BALANCED_PAIRS[_i], left = _ref[0], rite = _ref[1];
+ EXPRESSION_START.push(INVERSES[rite] = left);
+ EXPRESSION_END.push(INVERSES[left] = rite);
+ }
+ EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END);
+ IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS'];
+ IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'UNLESS', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'UNARY', '@', '->', '=>', '[', '(', '{', '--', '++'];
+ IMPLICIT_UNSPACED_CALL = ['+', '-'];
+ IMPLICIT_BLOCK = ['->', '=>', '{', '[', ','];
+ IMPLICIT_END = ['POST_IF', 'POST_UNLESS', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'TERMINATOR', 'INDENT'];
+ SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN'];
+ SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN'];
+ LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT'];
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/scope.js b/node_modules/jade/support/coffee-script/lib/scope.js
new file mode 100644
index 0000000..b0f2a64
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/scope.js
@@ -0,0 +1,134 @@
+(function() {
+ var Scope, _ref, extend, last;
+ var __hasProp = Object.prototype.hasOwnProperty;
+ _ref = require('./helpers'), extend = _ref.extend, last = _ref.last;
+ exports.Scope = (function() {
+ Scope = (function() {
+ function Scope(_arg, _arg2, _arg3) {
+ this.method = _arg3;
+ this.expressions = _arg2;
+ this.parent = _arg;
+ this.variables = {
+ 'arguments': 'arguments'
+ };
+ if (this.parent) {
+ this.garbage = this.parent.garbage;
+ } else {
+ this.garbage = [];
+ Scope.root = this;
+ }
+ return this;
+ };
+ return Scope;
+ })();
+ Scope.root = null;
+ Scope.prototype.startLevel = function() {
+ return this.garbage.push([]);
+ };
+ Scope.prototype.endLevel = function() {
+ var _i, _len, _ref2, _result, name, vars;
+ vars = this.variables;
+ _result = [];
+ for (_i = 0, _len = (_ref2 = this.garbage.pop()).length; _i < _len; _i++) {
+ name = _ref2[_i];
+ if (vars[name] === 'var') {
+ _result.push(vars[name] = 'reuse');
+ }
+ }
+ return _result;
+ };
+ Scope.prototype.find = function(name, options) {
+ if (this.check(name, options)) {
+ return true;
+ }
+ this.variables[name] = 'var';
+ return false;
+ };
+ Scope.prototype.any = function(fn) {
+ var _ref2, k, v;
+ for (v in _ref2 = this.variables) {
+ if (!__hasProp.call(_ref2, v)) continue;
+ k = _ref2[v];
+ if (fn(v, k)) {
+ return true;
+ }
+ }
+ return false;
+ };
+ Scope.prototype.parameter = function(name) {
+ return (this.variables[name] = 'param');
+ };
+ Scope.prototype.check = function(name, options) {
+ var _ref2, immediate;
+ immediate = Object.prototype.hasOwnProperty.call(this.variables, name);
+ if (immediate || ((options != null) ? options.immediate : undefined)) {
+ return immediate;
+ }
+ return !!(((_ref2 = this.parent) != null) ? _ref2.check(name) : undefined);
+ };
+ Scope.prototype.temporary = function(type, index) {
+ return type.length > 1 ? '_' + type + (index > 1 ? index : '') : '_' + (index + parseInt(type, 36)).toString(36).replace(/\d/g, 'a');
+ };
+ Scope.prototype.freeVariable = function(type) {
+ var index, temp;
+ index = 0;
+ while (this.check(temp = this.temporary(type, index)) && this.variables[temp] !== 'reuse') {
+ index++;
+ }
+ this.variables[temp] = 'var';
+ if (this.garbage.length) {
+ last(this.garbage).push(temp);
+ }
+ return temp;
+ };
+ Scope.prototype.assign = function(name, value) {
+ return (this.variables[name] = {
+ value: value,
+ assigned: true
+ });
+ };
+ Scope.prototype.hasDeclarations = function(body) {
+ return body === this.expressions && this.any(function(k, val) {
+ return (val === 'var' || val === 'reuse');
+ });
+ };
+ Scope.prototype.hasAssignments = function(body) {
+ return body === this.expressions && this.any(function(k, val) {
+ return val.assigned;
+ });
+ };
+ Scope.prototype.declaredVariables = function() {
+ var _ref2, _result, key, val;
+ return (function() {
+ _result = [];
+ for (key in _ref2 = this.variables) {
+ if (!__hasProp.call(_ref2, key)) continue;
+ val = _ref2[key];
+ if ((val === 'var' || val === 'reuse')) {
+ _result.push(key);
+ }
+ }
+ return _result;
+ }).call(this).sort();
+ };
+ Scope.prototype.assignedVariables = function() {
+ var _ref2, _result, key, val;
+ _result = [];
+ for (key in _ref2 = this.variables) {
+ if (!__hasProp.call(_ref2, key)) continue;
+ val = _ref2[key];
+ if (val.assigned) {
+ _result.push("" + key + " = " + (val.value));
+ }
+ }
+ return _result;
+ };
+ Scope.prototype.compiledDeclarations = function() {
+ return this.declaredVariables().join(', ');
+ };
+ Scope.prototype.compiledAssignments = function() {
+ return this.assignedVariables().join(', ');
+ };
+ return Scope;
+ }).call(this);
+}).call(this);
diff --git a/node_modules/jade/support/coffee-script/lib/utilities.js b/node_modules/jade/support/coffee-script/lib/utilities.js
new file mode 100644
index 0000000..dacb61d
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/lib/utilities.js
@@ -0,0 +1,12 @@
+(function(){
+ if (!((typeof process !== "undefined" && process !== null))) {
+ this.exports = this;
+ }
+ exports.utilities = {
+ extend: "function(child, parent) {\n var ctor = function(){ };\n ctor.prototype = parent.prototype;\n child.__superClass__ = parent.prototype;\n child.prototype = new ctor();\n child.prototype.constructor = child;\n }",
+ bind: "function(func, obj, args) {\n return function() {\n return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);\n };\n }",
+ range: "function(array, from, to, exclusive) {\n return [\n (from < 0 ? from + array.length : from || 0),\n (to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1)\n ];\n }",
+ hasProp: 'Object.prototype.hasOwnProperty',
+ slice: 'Array.prototype.slice'
+ };
+})();
diff --git a/node_modules/jade/support/coffee-script/package.json b/node_modules/jade/support/coffee-script/package.json
new file mode 100644
index 0000000..89f7340
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "coffee-script",
+ "description": "Unfancy JavaScript",
+ "keywords": ["javascript", "language", "coffeescript", "compiler"],
+ "author": "Jeremy Ashkenas",
+ "version": "0.9.4",
+ "licenses": [{
+ "type": "MIT",
+ "url": "http://github.com/jashkenas/coffee-script/raw/master/LICENSE"
+ }],
+ "engines": {
+ "node": ">=0.1.99"
+ },
+ "directories" : {
+ "lib" : "./lib"
+ },
+ "main" : "./lib/coffee-script",
+ "bin": {
+ "coffee": "./bin/coffee",
+ "cake": "./bin/cake"
+ }
+}
diff --git a/node_modules/jade/support/coffee-script/src/browser.coffee b/node_modules/jade/support/coffee-script/src/browser.coffee
new file mode 100644
index 0000000..ddb7a0f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/browser.coffee
@@ -0,0 +1,41 @@
+# Override exported methods for non-Node.js engines.
+
+CoffeeScript = require './coffee-script'
+CoffeeScript.require = require
+
+# Use standard JavaScript `eval` to eval code.
+CoffeeScript.eval = (code, options) ->
+ eval CoffeeScript.compile code, options
+
+# Running code does not provide access to this scope.
+CoffeeScript.run = (code, options) ->
+ options?.bare = on
+ Function(CoffeeScript.compile code, options)()
+
+# If we're not in a browser environment, we're finished with the public API.
+return unless window?
+
+# Load a remote script from the current domain via XHR.
+CoffeeScript.load = (url, options) ->
+ xhr = new (window.ActiveXObject or XMLHttpRequest)('Microsoft.XMLHTTP')
+ xhr.open 'GET', url, true
+ xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr
+ xhr.onreadystatechange = ->
+ CoffeeScript.run xhr.responseText, options if xhr.readyState is 4
+ xhr.send null
+
+# Activate CoffeeScript in the browser by having it compile and evaluate
+# all script tags with a content-type of `text/coffeescript`.
+# This happens on page load.
+runScripts = ->
+ for script in document.getElementsByTagName 'script'
+ if script.type is 'text/coffeescript'
+ if script.src
+ CoffeeScript.load script.src
+ else
+ setTimeout -> CoffeeScript.run script.innerHTML
+ null
+if window.addEventListener
+ addEventListener 'DOMContentLoaded', runScripts, no
+else
+ attachEvent 'onload', runScripts
diff --git a/node_modules/jade/support/coffee-script/src/cake.coffee b/node_modules/jade/support/coffee-script/src/cake.coffee
new file mode 100644
index 0000000..61567bc
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/cake.coffee
@@ -0,0 +1,69 @@
+# `cake` is a simplified version of [Make](http://www.gnu.org/software/make/)
+# ([Rake](http://rake.rubyforge.org/), [Jake](http://github.com/280north/jake))
+# for CoffeeScript. You define tasks with names and descriptions in a Cakefile,
+# and can call them from the command line, or invoke them from other tasks.
+#
+# Running `cake` with no arguments will print out a list of all the tasks in the
+# current directory's Cakefile.
+
+# External dependencies.
+fs = require 'fs'
+path = require 'path'
+helpers = require './helpers'
+optparse = require './optparse'
+CoffeeScript = require './coffee-script'
+
+# Keep track of the list of defined tasks, the accepted options, and so on.
+tasks = {}
+options = {}
+switches = []
+oparse = null
+
+# Mixin the top-level Cake functions for Cakefiles to use directly.
+helpers.extend global,
+
+ # Define a Cake task with a short name, an optional sentence description,
+ # and the function to run as the action itself.
+ task: (name, description, action) ->
+ [action, description] = [description, action] unless action
+ tasks[name] = {name, description, action}
+
+ # Define an option that the Cakefile accepts. The parsed options hash,
+ # containing all of the command-line options passed, will be made available
+ # as the first argument to the action.
+ option: (letter, flag, description) ->
+ switches.push [letter, flag, description]
+
+ # Invoke another task in the current Cakefile.
+ invoke: (name) ->
+ missingTask name unless tasks[name]
+ tasks[name].action options
+
+
+# Run `cake`. Executes all of the tasks you pass, in order. Note that Node's
+# asynchrony may cause tasks to execute in a different order than you'd expect.
+# If no tasks are passed, print the help screen.
+exports.run = ->
+ path.exists 'Cakefile', (exists) ->
+ throw new Error("Cakefile not found in #{process.cwd()}") unless exists
+ args = process.argv.slice 2
+ CoffeeScript.run fs.readFileSync('Cakefile').toString(), fileName: 'Cakefile'
+ oparse = new optparse.OptionParser switches
+ return printTasks() unless args.length
+ options = oparse.parse(args)
+ invoke arg for arg in options.arguments
+
+# Display the list of Cake tasks in a format similar to `rake -T`
+printTasks = ->
+ puts ''
+ for all name, task of tasks
+ spaces = 20 - name.length
+ spaces = if spaces > 0 then Array(spaces + 1).join(' ') else ''
+ desc = if task.description then "# #{task.description}" else ''
+ puts "cake #{name}#{spaces} #{desc}"
+ puts oparse.help() if switches.length
+
+# Print an error and exit when attempting to all an undefined task.
+missingTask = (task) ->
+ puts "No such task: \"#{task}\""
+ process.exit 1
diff --git a/node_modules/jade/support/coffee-script/src/coffee-script.coffee b/node_modules/jade/support/coffee-script/src/coffee-script.coffee
new file mode 100755
index 0000000..135788d
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/coffee-script.coffee
@@ -0,0 +1,90 @@
+# CoffeeScript can be used both on the server, as a command-line compiler based
+# on Node.js/V8, or to run CoffeeScripts directly in the browser. This module
+# contains the main entry functions for tokenzing, parsing, and compiling source
+# CoffeeScript into JavaScript.
+#
+# If included on a webpage, it will automatically sniff out, compile, and
+# execute all scripts present in `text/coffeescript` tags.
+
+path = require 'path'
+{Lexer} = require './lexer'
+{parser} = require './parser'
+
+# TODO: Remove registerExtension when fully deprecated
+if require.extensions
+ fs = require 'fs'
+ require.extensions['.coffee'] = (module, filename) ->
+ content = compile fs.readFileSync filename, 'utf8'
+ module._compile content, filename
+else if require.registerExtension
+ require.registerExtension '.coffee', (content) -> compile content
+
+# The current CoffeeScript version number.
+exports.VERSION = '0.9.4'
+
+# Expose helpers for testing.
+exports.helpers = require './helpers'
+
+# Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison
+# compiler.
+exports.compile = compile = (code, options) ->
+ options or= {}
+ try
+ (parser.parse lexer.tokenize code).compile options
+ catch err
+ err.message = "In #{options.fileName}, #{err.message}" if options.fileName
+ throw err
+
+# Tokenize a string of CoffeeScript code, and return the array of tokens.
+exports.tokens = (code, options) ->
+ lexer.tokenize code, options
+
+# Tokenize and parse a string of CoffeeScript code, and return the AST. You can
+# then compile it by calling `.compile()` on the root, or traverse it by using
+# `.traverse()` with a callback.
+exports.nodes = (code, options) ->
+ parser.parse lexer.tokenize code, options
+
+# Compile and execute a string of CoffeeScript (on the server), correctly
+# setting `__filename`, `__dirname`, and relative `require()`.
+exports.run = (code, options) ->
+ # We want the root module.
+ root = module
+ while root.parent
+ root = root.parent
+ # Set the filename
+ root.filename = options.fileName
+ # Clear the module cache
+ root.moduleCache = {} if root.moduleCache
+ # Compile
+ if path.extname(root.filename) isnt '.coffee' or require.extensions
+ root._compile exports.compile(code, options), root.filename
+ else
+ root._compile code, root.filename
+
+# Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).
+# The CoffeeScript REPL uses this to run the input.
+exports.eval = (code, options) ->
+ __filename = options.fileName
+ __dirname = path.dirname __filename
+ eval exports.compile(code, options)
+
+# Instantiate a Lexer for our use here.
+lexer = new Lexer
+
+# The real Lexer produces a generic stream of tokens. This object provides a
+# thin wrapper around it, compatible with the Jison API. We can then pass it
+# directly as a "Jison lexer".
+parser.lexer =
+ lex: ->
+ token = @tokens[@pos] or [""]
+ @pos += 1
+ this.yylineno = token[2]
+ this.yytext = token[1]
+ token[0]
+ setInput: (tokens) ->
+ @tokens = tokens
+ @pos = 0
+ upcomingInput: -> ""
+
+parser.yy = require './nodes'
diff --git a/node_modules/jade/support/coffee-script/src/command.coffee b/node_modules/jade/support/coffee-script/src/command.coffee
new file mode 100644
index 0000000..59cf5ef
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/command.coffee
@@ -0,0 +1,195 @@
+# The `coffee` utility. Handles command-line compilation of CoffeeScript
+# into various forms: saved into `.js` files or printed to stdout, piped to
+# [JSLint](http://javascriptlint.com/) or recompiled every time the source is
+# saved, printed as a token stream or as the syntax tree, or launch an
+# interactive REPL.
+
+# External dependencies.
+fs = require 'fs'
+path = require 'path'
+optparse = require './optparse'
+CoffeeScript = require './coffee-script'
+helpers = require './helpers'
+{spawn, exec} = require 'child_process'
+{EventEmitter} = require 'events'
+
+# Allow CoffeeScript to emit Node.js events, and add it to global scope.
+helpers.extend CoffeeScript, new EventEmitter
+global.CoffeeScript = CoffeeScript
+
+# The help banner that is printed when `coffee` is called without arguments.
+BANNER = '''
+ coffee compiles CoffeeScript source files into JavaScript.
+
+ Usage:
+ coffee path/to/script.coffee
+ '''
+
+# The list of all the valid option flags that `coffee` knows how to handle.
+SWITCHES = [
+ ['-c', '--compile', 'compile to JavaScript and save as .js files']
+ ['-i', '--interactive', 'run an interactive CoffeeScript REPL']
+ ['-o', '--output [DIR]', 'set the directory for compiled JavaScript']
+ ['-w', '--watch', 'watch scripts for changes, and recompile']
+ ['-p', '--print', 'print the compiled JavaScript to stdout']
+ ['-l', '--lint', 'pipe the compiled JavaScript through JSLint']
+ ['-s', '--stdio', 'listen for and compile scripts over stdio']
+ ['-e', '--eval', 'compile a string from the command line']
+ ['-r', '--require [FILE*]', 'require a library before executing your script']
+ ['-b', '--bare', 'compile without the top-level function wrapper']
+ ['-t', '--tokens', 'print the tokens that the lexer produces']
+ ['-n', '--nodes', 'print the parse tree that Jison produces']
+ ['-v', '--version', 'display CoffeeScript version']
+ ['-h', '--help', 'display this help message']
+]
+
+# Top-level objects shared by all the functions.
+opts = {}
+sources = []
+optionParser = null
+
+# Run `coffee` by parsing passed options and determining what action to take.
+# Many flags cause us to divert before compiling anything. Flags passed after
+# `--` will be passed verbatim to your script as arguments in `process.argv`
+exports.run = ->
+ parseOptions()
+ return usage() if opts.help
+ return version() if opts.version
+ return require './repl' if opts.interactive
+ return compileStdio() if opts.stdio
+ return compileScript 'console', sources[0] if opts.eval
+ return require './repl' unless sources.length
+ separator = sources.indexOf '--'
+ flags = []
+ if separator >= 0
+ flags = sources.splice separator + 1
+ sources.pop()
+ if opts.run
+ flags = sources.splice(1).concat flags
+ process.ARGV = process.argv = flags
+ compileScripts()
+
+# Asynchronously read in each CoffeeScript in a list of source files and
+# compile them. If a directory is passed, recursively compile all
+# '.coffee' extension source files in it and all subdirectories.
+compileScripts = ->
+ for source in sources
+ base = source
+ compile = (source, topLevel) ->
+ path.exists source, (exists) ->
+ throw new Error "File not found: #{source}" unless exists
+ fs.stat source, (err, stats) ->
+ if stats.isDirectory()
+ fs.readdir source, (err, files) ->
+ for file in files
+ compile path.join(source, file)
+ else if topLevel or path.extname(source) is '.coffee'
+ fs.readFile source, (err, code) -> compileScript(source, code.toString(), base)
+ watch source, base if opts.watch
+ compile source, true
+
+# Compile a single source script, containing the given code, according to the
+# requested options. If evaluating the script directly sets `__filename`,
+# `__dirname` and `module.filename` to be correct relative to the script's path.
+compileScript = (file, input, base) ->
+ o = opts
+ options = compileOptions file
+ if o.require
+ require(if helpers.starts(req, '.') then fs.realpathSync(req) else req) for req in o.require
+ try
+ t = task = {file, input, options}
+ CoffeeScript.emit 'compile', task
+ if o.tokens then printTokens CoffeeScript.tokens t.input
+ else if o.nodes then puts CoffeeScript.nodes(t.input).toString().trim()
+ else if o.run then CoffeeScript.run t.input, t.options
+ else
+ t.output = CoffeeScript.compile t.input, t.options
+ CoffeeScript.emit 'success', task
+ if o.print then print t.output
+ else if o.compile then writeJs t.file, t.output, base
+ else if o.lint then lint t.output
+ catch err
+ # Avoid using 'error' as it is a special event -- if there is no handler,
+ # node will print a stack trace and exit the program.
+ CoffeeScript.emit 'failure', err, task
+ return if CoffeeScript.listeners('failure').length
+ return puts err.message if o.watch
+ error err.stack
+ process.exit 1
+
+# Attach the appropriate listeners to compile scripts incoming over **stdin**,
+# and write them back to **stdout**.
+compileStdio = ->
+ code = ''
+ stdin = process.openStdin()
+ stdin.on 'data', (buffer) ->
+ code += buffer.toString() if buffer
+ stdin.on 'end', ->
+ compileScript 'stdio', code
+
+# Watch a source CoffeeScript file using `fs.watchFile`, recompiling it every
+# time the file is updated. May be used in combination with other options,
+# such as `--lint` or `--print`.
+watch = (source, base) ->
+ fs.watchFile source, {persistent: true, interval: 500}, (curr, prev) ->
+ return if curr.size is prev.size and curr.mtime.getTime() is prev.mtime.getTime()
+ fs.readFile source, (err, code) ->
+ throw err if err
+ compileScript(source, code.toString(), base)
+
+# Write out a JavaScript source file with the compiled code. By default, files
+# are written out in `cwd` as `.js` files with the same name, but the output
+# directory can be customized with `--output`.
+writeJs = (source, js, base) ->
+ filename = path.basename(source, path.extname(source)) + '.js'
+ srcDir = path.dirname source
+ baseDir = srcDir.substring base.length
+ dir = if opts.output then path.join opts.output, baseDir else srcDir
+ jsPath = path.join dir, filename
+ compile = ->
+ js = ' ' if js.length <= 0
+ fs.writeFile jsPath, js, (err) ->
+ puts "Compiled #{source}" if opts.compile and opts.watch
+ path.exists dir, (exists) ->
+ if exists then compile() else exec "mkdir -p #{dir}", compile
+
+# Pipe compiled JS through JSLint (requires a working `jsl` command), printing
+# any errors or warnings that arise.
+lint = (js) ->
+ printIt = (buffer) -> puts buffer.toString().trim()
+ conf = __dirname + '/../extras/jsl.conf'
+ jsl = spawn 'jsl', ['-nologo', '-stdin', '-conf', conf]
+ jsl.stdout.on 'data', printIt
+ jsl.stderr.on 'data', printIt
+ jsl.stdin.write js
+ jsl.stdin.end()
+
+# Pretty-print a stream of tokens.
+printTokens = (tokens) ->
+ strings = for token in tokens
+ [tag, value] = [token[0], token[1].toString().replace(/\n/, '\\n')]
+ "[#{tag} #{value}]"
+ puts strings.join(' ')
+
+# Use the [OptionParser module](optparse.html) to extract all options from
+# `process.argv` that are specified in `SWITCHES`.
+parseOptions = ->
+ optionParser = new optparse.OptionParser SWITCHES, BANNER
+ o = opts = optionParser.parse process.argv.slice 2
+ o.compile or= !!o.output
+ o.run = not (o.compile or o.print or o.lint)
+ o.print = !! (o.print or (o.eval or o.stdio and o.compile))
+ sources = o.arguments
+
+# The compile-time options to pass to the CoffeeScript compiler.
+compileOptions = (fileName) -> {fileName, bare: opts.bare}
+
+# Print the `--help` usage message and exit.
+usage = ->
+ puts optionParser.help()
+ process.exit 0
+
+# Print the `--version` message and exit.
+version = ->
+ puts "CoffeeScript version #{CoffeeScript.VERSION}"
+ process.exit 0
diff --git a/node_modules/jade/support/coffee-script/src/grammar.coffee b/node_modules/jade/support/coffee-script/src/grammar.coffee
new file mode 100644
index 0000000..70f5632
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/grammar.coffee
@@ -0,0 +1,613 @@
+# The CoffeeScript parser is generated by [Jison](http://github.com/zaach/jison)
+# from this grammar file. Jison is a bottom-up parser generator, similar in
+# style to [Bison](http://www.gnu.org/software/bison), implemented in JavaScript.
+# It can recognize [LALR(1), LR(0), SLR(1), and LR(1)](http://en.wikipedia.org/wiki/LR_grammar)
+# type grammars. To create the Jison parser, we list the pattern to match
+# on the left-hand side, and the action to take (usually the creation of syntax
+# tree nodes) on the right. As the parser runs, it
+# shifts tokens from our token stream, from left to right, and
+# [attempts to match](http://en.wikipedia.org/wiki/Bottom-up_parsing)
+# the token sequence against the rules below. When a match can be made, it
+# reduces into the [nonterminal](http://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols)
+# (the enclosing name at the top), and we proceed from there.
+#
+# If you run the `cake build:parser` command, Jison constructs a parse table
+# from our rules and saves it into `lib/parser.js`.
+
+# The only dependency is on the **Jison.Parser**.
+Parser = require('jison').Parser
+
+# Jison DSL
+# ---------
+
+# Since we're going to be wrapped in a function by Jison in any case, if our
+# action immediately returns a value, we can optimize by removing the function
+# wrapper and just returning the value directly.
+unwrap = /function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/
+
+# Our handy DSL for Jison grammar generation, thanks to
+# [Tim Caswell](http://github.com/creationix). For every rule in the grammar,
+# we pass the pattern-defining string, the action to run, and extra options,
+# optionally. If no action is specified, we simply pass the value of the
+# previous nonterminal.
+o = (patternString, action, options) ->
+ return [patternString, '$$ = $1;', options] unless action
+ action = if match = (action + '').match(unwrap) then match[1] else "(#{action}())"
+ action = action.replace(/\bnew (\w+)\b/g, 'new yy.$1').replace(/Expressions\.wrap/g, 'yy.Expressions.wrap');
+ [patternString, "$$ = #{action};", options]
+
+# Grammatical Rules
+# -----------------
+
+# In all of the rules that follow, you'll see the name of the nonterminal as
+# the key to a list of alternative matches. With each match's action, the
+# dollar-sign variables are provided by Jison as references to the value of
+# their numeric position, so in this rule:
+#
+# "Expression UNLESS Expression"
+#
+# `$1` would be the value of the first `Expression`, `$2` would be the token
+# for the `UNLESS` terminal, and `$3` would be the value of the second
+# `Expression`.
+grammar =
+
+ # The **Root** is the top-level node in the syntax tree. Since we parse bottom-up,
+ # all parsing must end here.
+ Root: [
+ o "", -> new Expressions
+ o "TERMINATOR", -> new Expressions
+ o "Body"
+ o "Block TERMINATOR"
+ ]
+
+ # Any list of statements and expressions, seperated by line breaks or semicolons.
+ Body: [
+ o "Line", -> Expressions.wrap [$1]
+ o "Body TERMINATOR Line", -> $1.push $3
+ o "Body TERMINATOR"
+ ]
+
+ # Expressions and statements, which make up a line in a body.
+ Line: [
+ o "Expression"
+ o "Statement"
+ ]
+
+ # Pure statements which cannot be expressions.
+ Statement: [
+ o "Return"
+ o "Throw"
+ o "BREAK", -> new Literal $1
+ o "CONTINUE", -> new Literal $1
+ o "DEBUGGER", -> new Literal $1
+ ]
+
+ # All the different types of expressions in our language. The basic unit of
+ # CoffeeScript is the **Expression** -- everything that can be an expression
+ # is one. Expressions serve as the building blocks of many other rules, making
+ # them somewhat circular.
+ Expression: [
+ o "Value"
+ o "Invocation"
+ o "Code"
+ o "Operation"
+ o "Assign"
+ o "If"
+ o "Try"
+ o "While"
+ o "For"
+ o "Switch"
+ o "Extends"
+ o "Class"
+ o "Existence"
+ o "Comment"
+ ]
+
+ # An indented block of expressions. Note that the [Rewriter](rewriter.html)
+ # will convert some postfix forms into blocks for us, by adjusting the
+ # token stream.
+ Block: [
+ o "INDENT Body OUTDENT", -> $2
+ o "INDENT OUTDENT", -> new Expressions
+ o "TERMINATOR Comment", -> Expressions.wrap [$2]
+ ]
+
+ # A literal identifier, a variable name or property.
+ Identifier: [
+ o "IDENTIFIER", -> new Literal $1
+ ]
+
+ # Alphanumerics are separated from the other **Literal** matchers because
+ # they can also serve as keys in object literals.
+ AlphaNumeric: [
+ o "NUMBER", -> new Literal $1
+ o "STRING", -> new Literal $1
+ ]
+
+ # All of our immediate values. These can (in general), be passed straight
+ # through and printed to JavaScript.
+ Literal: [
+ o "AlphaNumeric"
+ o "JS", -> new Literal $1
+ o "REGEX", -> new Literal $1
+ o "BOOL", -> new Literal $1
+ ]
+
+ # Assignment of a variable, property, or index to a value.
+ Assign: [
+ o "Assignable = Expression", -> new Assign $1, $3
+ o "Assignable = INDENT Expression OUTDENT", -> new Assign $1, $4
+ ]
+
+ # Assignment when it happens within an object literal. The difference from
+ # the ordinary **Assign** is that these allow numbers and strings as keys.
+ AssignObj: [
+ o "Identifier", -> new Value $1
+ o "AlphaNumeric"
+ o "ThisProperty"
+ o "Identifier : Expression", -> new Assign new Value($1), $3, 'object'
+ o "AlphaNumeric : Expression", -> new Assign new Value($1), $3, 'object'
+ o "Identifier : INDENT Expression OUTDENT", -> new Assign new Value($1), $4, 'object'
+ o "AlphaNumeric : INDENT Expression OUTDENT", -> new Assign new Value($1), $4, 'object'
+ o "Comment"
+ ]
+
+ # A return statement from a function body.
+ Return: [
+ o "RETURN Expression", -> new Return $2
+ o "RETURN", -> new Return
+ ]
+
+ # A block comment.
+ Comment: [
+ o "HERECOMMENT", -> new Comment $1
+ ]
+
+ # [The existential operator](http://jashkenas.github.com/coffee-script/#existence).
+ Existence: [
+ o "Expression ?", -> new Existence $1
+ ]
+
+ # The **Code** node is the function literal. It's defined by an indented block
+ # of **Expressions** preceded by a function arrow, with an optional parameter
+ # list.
+ Code: [
+ o "PARAM_START ParamList PARAM_END FuncGlyph Block", -> new Code $2, $5, $4
+ o "FuncGlyph Block", -> new Code [], $2, $1
+ ]
+
+ # CoffeeScript has two different symbols for functions. `->` is for ordinary
+ # functions, and `=>` is for functions bound to the current value of *this*.
+ FuncGlyph: [
+ o "->", -> 'func'
+ o "=>", -> 'boundfunc'
+ ]
+
+ # An optional, trailing comma.
+ OptComma: [
+ o ''
+ o ','
+ ]
+
+ # The list of parameters that a function accepts can be of any length.
+ ParamList: [
+ o "", -> []
+ o "Param", -> [$1]
+ o "ParamList , Param", -> $1.concat $3
+ ]
+
+ # A single parameter in a function definition can be ordinary, or a splat
+ # that hoovers up the remaining arguments.
+ Param: [
+ o "PARAM", -> new Literal $1
+ o "@ PARAM", -> new Param $2, true
+ o "PARAM ...", -> new Param $1, false, true
+ o "@ PARAM ...", -> new Param $2, true, true
+ ]
+
+ # A splat that occurs outside of a parameter list.
+ Splat: [
+ o "Expression ...", -> new Splat $1
+ ]
+
+ # Variables and properties that can be assigned to.
+ SimpleAssignable: [
+ o "Identifier", -> new Value $1
+ o "Value Accessor", -> $1.push $2
+ o "Invocation Accessor", -> new Value $1, [$2]
+ o "ThisProperty"
+ ]
+
+ # Everything that can be assigned to.
+ Assignable: [
+ o "SimpleAssignable"
+ o "Array", -> new Value $1
+ o "Object", -> new Value $1
+ ]
+
+ # The types of things that can be treated as values -- assigned to, invoked
+ # as functions, indexed into, named as a class, etc.
+ Value: [
+ o "Assignable"
+ o "Literal", -> new Value $1
+ o "Parenthetical", -> new Value $1
+ o "Range", -> new Value $1
+ o "This"
+ ]
+
+ # The general group of accessors into an object, by property, by prototype
+ # or by array index or slice.
+ Accessor: [
+ o "PROPERTY_ACCESS Identifier", -> new Accessor $2
+ o "PROTOTYPE_ACCESS Identifier", -> new Accessor $2, 'prototype'
+ o "::", -> new Accessor(new Literal('prototype'))
+ o "SOAK_ACCESS Identifier", -> new Accessor $2, 'soak'
+ o "Index"
+ o "Slice", -> new Slice $1
+ ]
+
+ # Indexing into an object or array using bracket notation.
+ Index: [
+ o "INDEX_START Expression INDEX_END", -> new Index $2
+ o "INDEX_SOAK Index", -> $2.soakNode = yes; $2
+ o "INDEX_PROTO Index", -> $2.proto = yes; $2
+ ]
+
+ # In CoffeeScript, an object literal is simply a list of assignments.
+ Object: [
+ o "{ AssignList OptComma }", -> new ObjectLiteral $2
+ ]
+
+ # Assignment of properties within an object literal can be separated by
+ # comma, as in JavaScript, or simply by newline.
+ AssignList: [
+ o "", -> []
+ o "AssignObj", -> [$1]
+ o "AssignList , AssignObj", -> $1.concat $3
+ o "AssignList OptComma TERMINATOR AssignObj", -> $1.concat $4
+ o "AssignList OptComma INDENT AssignList OptComma OUTDENT", -> $1.concat $4
+ ]
+
+ # Class definitions have optional bodies of prototype property assignments,
+ # and optional references to the superclass.
+ Class: [
+ o "CLASS SimpleAssignable", -> new Class $2
+ o "CLASS SimpleAssignable EXTENDS Value", -> new Class $2, $4
+ o "CLASS SimpleAssignable INDENT ClassBody OUTDENT", -> new Class $2, null, $4
+ o "CLASS SimpleAssignable EXTENDS Value INDENT ClassBody OUTDENT", -> new Class $2, $4, $6
+ o "CLASS INDENT ClassBody OUTDENT", -> new Class '__temp__', null, $3
+ o "CLASS", -> new Class '__temp__', null, new Expressions
+ o "CLASS EXTENDS Value", -> new Class '__temp__', $3, new Expressions
+ o "CLASS EXTENDS Value INDENT ClassBody OUTDENT", -> new Class '__temp__', $3, $5
+ ]
+
+ # Assignments that can happen directly inside a class declaration.
+ ClassAssign: [
+ o "AssignObj", -> $1
+ o "ThisProperty : Expression", -> new Assign new Value($1), $3, 'this'
+ o "ThisProperty : INDENT Expression OUTDENT", -> new Assign new Value($1), $4, 'this'
+ ]
+
+ # A list of assignments to a class.
+ ClassBody: [
+ o "", -> []
+ o "ClassAssign", -> [$1]
+ o "ClassBody TERMINATOR ClassAssign", -> $1.concat $3
+ o "{ ClassBody }", -> $2
+ ]
+
+ # Extending an object by setting its prototype chain to reference a parent
+ # object.
+ Extends: [
+ o "SimpleAssignable EXTENDS Value", -> new Extends $1, $3
+ ]
+
+ # Ordinary function invocation, or a chained series of calls.
+ Invocation: [
+ o "Value OptFuncExist Arguments", -> new Call $1, $3, $2
+ o "Invocation OptFuncExist Arguments", -> new Call $1, $3, $2
+ o "SUPER", -> new Call 'super', [new Splat(new Literal('arguments'))]
+ o "SUPER Arguments", -> new Call 'super', $2
+ ]
+
+ # An optional existence check on a function.
+ OptFuncExist: [
+ o "", -> no
+ o "FUNC_EXIST", -> yes
+ ]
+
+ # The list of arguments to a function call.
+ Arguments: [
+ o "CALL_START CALL_END", -> []
+ o "CALL_START ArgList OptComma CALL_END", -> $2
+ ]
+
+ # A reference to the *this* current object.
+ This: [
+ o "THIS", -> new Value new Literal 'this'
+ o "@", -> new Value new Literal 'this'
+ ]
+
+ RangeDots: [
+ o "..", -> 'inclusive'
+ o "...", -> 'exclusive'
+ ]
+
+ # A reference to a property on *this*.
+ ThisProperty: [
+ o "@ Identifier", -> new Value new Literal('this'), [new Accessor($2)], 'this'
+ ]
+
+ # The CoffeeScript range literal.
+ Range: [
+ o "[ Expression RangeDots Expression ]", -> new Range $2, $4, $3
+ ]
+
+ # The slice literal.
+ Slice: [
+ o "INDEX_START Expression RangeDots Expression INDEX_END", -> new Range $2, $4, $3
+ o "INDEX_START Expression RangeDots INDEX_END", -> new Range $2, null, $3
+ o "INDEX_START RangeDots Expression INDEX_END", -> new Range null, $3, $2
+ ]
+
+ # The array literal.
+ Array: [
+ o "[ ]", -> new ArrayLiteral []
+ o "[ ArgList OptComma ]", -> new ArrayLiteral $2
+ ]
+
+ # The **ArgList** is both the list of objects passed into a function call,
+ # as well as the contents of an array literal
+ # (i.e. comma-separated expressions). Newlines work as well.
+ ArgList: [
+ o "Arg", -> [$1]
+ o "ArgList , Arg", -> $1.concat $3
+ o "ArgList OptComma TERMINATOR Arg", -> $1.concat $4
+ o "INDENT ArgList OptComma OUTDENT", -> $2
+ o "ArgList OptComma INDENT ArgList OptComma OUTDENT", -> $1.concat $4
+ ]
+
+ # Valid arguments are Expressions or Splats.
+ Arg: [
+ o "Expression"
+ o "Splat"
+ ]
+
+ # Just simple, comma-separated, required arguments (no fancy syntax). We need
+ # this to be separate from the **ArgList** for use in **Switch** blocks, where
+ # having the newlines wouldn't make sense.
+ SimpleArgs: [
+ o "Expression"
+ o "SimpleArgs , Expression", -> [].concat $1, $3
+ ]
+
+ # The variants of *try/catch/finally* exception handling blocks.
+ Try: [
+ o "TRY Block", -> new Try $2
+ o "TRY Block Catch", -> new Try $2, $3[0], $3[1]
+ o "TRY Block FINALLY Block", -> new Try $2, null, null, $4
+ o "TRY Block Catch FINALLY Block", -> new Try $2, $3[0], $3[1], $5
+ ]
+
+ # A catch clause names its error and runs a block of code.
+ Catch: [
+ o "CATCH Identifier Block", -> [$2, $3]
+ ]
+
+ # Throw an exception object.
+ Throw: [
+ o "THROW Expression", -> new Throw $2
+ ]
+
+ # Parenthetical expressions. Note that the **Parenthetical** is a **Value**,
+ # not an **Expression**, so if you need to use an expression in a place
+ # where only values are accepted, wrapping it in parentheses will always do
+ # the trick.
+ Parenthetical: [
+ o "( Expression )", -> new Parens $2
+ o "( )", -> new Parens new Literal ''
+ ]
+
+ # The condition portion of a while loop.
+ WhileSource: [
+ o "WHILE Expression", -> new While $2
+ o "WHILE Expression WHEN Expression", -> new While $2, guard: $4
+ o "UNTIL Expression", -> new While $2, invert: true
+ o "UNTIL Expression WHEN Expression", -> new While $2, invert: true, guard: $4
+ ]
+
+ # The while loop can either be normal, with a block of expressions to execute,
+ # or postfix, with a single expression. There is no do..while.
+ While: [
+ o "WhileSource Block", -> $1.addBody $2
+ o "Statement WhileSource", -> $2.addBody Expressions.wrap [$1]
+ o "Expression WhileSource", -> $2.addBody Expressions.wrap [$1]
+ o "Loop", -> $1
+ ]
+
+ Loop: [
+ o "LOOP Block", -> new While(new Literal 'true').addBody $2
+ o "LOOP Expression", -> new While(new Literal 'true').addBody Expressions.wrap [$2]
+ ]
+
+ # Array, object, and range comprehensions, at the most generic level.
+ # Comprehensions can either be normal, with a block of expressions to execute,
+ # or postfix, with a single expression.
+ For: [
+ o "Statement ForBody", -> new For $1, $2, $2.vars[0], $2.vars[1]
+ o "Expression ForBody", -> new For $1, $2, $2.vars[0], $2.vars[1]
+ o "ForBody Block", -> new For $2, $1, $1.vars[0], $1.vars[1]
+ ]
+
+ ForBody: [
+ o "FOR Range", -> source: new Value($2), vars: []
+ o "ForStart ForSource", -> $2.raw = $1.raw; $2.vars = $1; $2
+ ]
+
+ ForStart: [
+ o "FOR ForVariables", -> $2
+ o "FOR ALL ForVariables", -> $3.raw = true; $3
+ ]
+
+ # An array of all accepted values for a variable inside the loop. This
+ # enables support for pattern matching.
+ ForValue: [
+ o "Identifier"
+ o "Array", -> new Value $1
+ o "Object", -> new Value $1
+ ]
+
+ # An array or range comprehension has variables for the current element and
+ # (optional) reference to the current index. Or, *key, value*, in the case
+ # of object comprehensions.
+ ForVariables: [
+ o "ForValue", -> [$1]
+ o "ForValue , ForValue", -> [$1, $3]
+ ]
+
+ # The source of a comprehension is an array or object with an optional guard
+ # clause. If it's an array comprehension, you can also choose to step through
+ # in fixed-size increments.
+ ForSource: [
+ o "FORIN Expression", -> source: $2
+ o "FOROF Expression", -> source: $2, object: true
+ o "FORIN Expression WHEN Expression", -> source: $2, guard: $4
+ o "FOROF Expression WHEN Expression", -> source: $2, guard: $4, object: true
+ o "FORIN Expression BY Expression", -> source: $2, step: $4
+ o "FORIN Expression WHEN Expression BY Expression", -> source: $2, guard: $4, step: $6
+ o "FORIN Expression BY Expression WHEN Expression", -> source: $2, step: $4, guard: $6
+ ]
+
+ Switch: [
+ o "SWITCH Expression INDENT Whens OUTDENT", -> new Switch $2, $4
+ o "SWITCH Expression INDENT Whens ELSE Block OUTDENT", -> new Switch $2, $4, $6
+ o "SWITCH INDENT Whens OUTDENT", -> new Switch null, $3
+ o "SWITCH INDENT Whens ELSE Block OUTDENT", -> new Switch null, $3, $5
+ ]
+
+ Whens: [
+ o "When"
+ o "Whens When", -> $1.concat $2
+ ]
+
+ # An individual **When** clause, with action.
+ When: [
+ o "LEADING_WHEN SimpleArgs Block", -> [[$2, $3]]
+ o "LEADING_WHEN SimpleArgs Block TERMINATOR", -> [[$2, $3]]
+ ]
+
+ # The most basic form of *if* is a condition and an action. The following
+ # if-related rules are broken up along these lines in order to avoid
+ # ambiguity.
+ IfBlock: [
+ o "IF Expression Block", -> new If $2, $3
+ o "UNLESS Expression Block", -> new If $2, $3, invert: true
+ o "IfBlock ELSE IF Expression Block", -> $1.addElse new If $4, $5
+ o "IfBlock ELSE Block", -> $1.addElse $3
+ ]
+
+ # The full complement of *if* expressions, including postfix one-liner
+ # *if* and *unless*.
+ If: [
+ o "IfBlock"
+ o "Statement POST_IF Expression", -> new If $3, Expressions.wrap([$1]), statement: true
+ o "Expression POST_IF Expression", -> new If $3, Expressions.wrap([$1]), statement: true
+ o "Statement POST_UNLESS Expression", -> new If $3, Expressions.wrap([$1]), statement: true, invert: true
+ o "Expression POST_UNLESS Expression", -> new If $3, Expressions.wrap([$1]), statement: true, invert: true
+ ]
+
+ # Arithmetic and logical operators, working on one or more operands.
+ # Here they are grouped by order of precedence. The actual precedence rules
+ # are defined at the bottom of the page. It would be shorter if we could
+ # combine most of these rules into a single generic *Operand OpSymbol Operand*
+ # -type rule, but in order to make the precedence binding possible, separate
+ # rules are necessary.
+ Operation: [
+ o "UNARY Expression", -> new Op $1, $2
+ o "- Expression", (-> new Op '-', $2), prec: 'UNARY'
+ o "+ Expression", (-> new Op '+', $2), prec: 'UNARY'
+
+ o "-- SimpleAssignable", -> new Op '--', $2
+ o "++ SimpleAssignable", -> new Op '++', $2
+ o "SimpleAssignable --", -> new Op '--', $1, null, true
+ o "SimpleAssignable ++", -> new Op '++', $1, null, true
+
+ o "Expression + Expression", -> new Op '+', $1, $3
+ o "Expression - Expression", -> new Op '-', $1, $3
+ o "Expression == Expression", -> new Op '==', $1, $3
+ o "Expression != Expression", -> new Op '!=', $1, $3
+
+ o "Expression MATH Expression", -> new Op $2, $1, $3
+ o "Expression SHIFT Expression", -> new Op $2, $1, $3
+ o "Expression COMPARE Expression", -> new Op $2, $1, $3
+ o "Expression LOGIC Expression", -> new Op $2, $1, $3
+ o "SimpleAssignable COMPOUND_ASSIGN Expression", -> new Op $2, $1, $3
+ o "SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT", -> new Op $2, $1, $4
+
+ o "Expression RELATION Expression", ->
+ if $2.charAt(0) is '!'
+ if $2 is '!in'
+ new Op '!', new In $1, $3
+ else
+ new Op '!', new Parens new Op $2.slice(1), $1, $3
+ else
+ if $2 is 'in' then new In $1, $3 else new Op $2, $1, $3
+ ]
+
+
+# Precedence
+# ----------
+
+# Operators at the top of this list have higher precedence than the ones lower
+# down. Following these rules is what makes `2 + 3 * 4` parse as:
+#
+# 2 + (3 * 4)
+#
+# And not:
+#
+# (2 + 3) * 4
+operators = [
+ ["left", 'CALL_START', 'CALL_END']
+ ["nonassoc", '++', '--']
+ ["left", '?']
+ ["right", 'UNARY']
+ ["left", 'MATH']
+ ["left", '+', '-']
+ ["left", 'SHIFT']
+ ["left", 'COMPARE']
+ ["left", 'RELATION']
+ ["left", '==', '!=']
+ ["left", 'LOGIC']
+ ["right", 'COMPOUND_ASSIGN']
+ ["left", '.']
+ ["nonassoc", 'INDENT', 'OUTDENT']
+ ["right", 'WHEN', 'LEADING_WHEN', 'FORIN', 'FOROF', 'BY', 'THROW']
+ ["right", 'IF', 'UNLESS', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'EXTENDS']
+ ["right", '=', ':', 'RETURN']
+ ["right", '->', '=>', 'UNLESS', 'POST_IF', 'POST_UNLESS']
+]
+
+# Wrapping Up
+# -----------
+
+# Finally, now what we have our **grammar** and our **operators**, we can create
+# our **Jison.Parser**. We do this by processing all of our rules, recording all
+# terminals (every symbol which does not appear as the name of a rule above)
+# as "tokens".
+tokens = []
+for name, alternatives of grammar
+ grammar[name] = for alt in alternatives
+ for token in alt[0].split ' '
+ tokens.push token unless grammar[token]
+ alt[1] = "return #{alt[1]}" if name is 'Root'
+ alt
+
+# Initialize the **Parser** with our list of terminal **tokens**, our **grammar**
+# rules, and the name of the root. Reverse the operators because Jison orders
+# precedence from low to high, and we have it high to low
+# (as in [Yacc](http://dinosaur.compilertools.net/yacc/index.html)).
+exports.parser = new Parser
+ tokens: tokens.join ' '
+ bnf: grammar
+ operators: operators.reverse()
+ startSymbol: 'Root'
diff --git a/node_modules/jade/support/coffee-script/src/helpers.coffee b/node_modules/jade/support/coffee-script/src/helpers.coffee
new file mode 100644
index 0000000..4d201de
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/helpers.coffee
@@ -0,0 +1,72 @@
+# This file contains the common helper functions that we'd like to share among
+# the **Lexer**, **Rewriter**, and the **Nodes**. Merge objects, flatten
+# arrays, count characters, that sort of thing.
+
+# Cross-engine `indexOf`, so that JScript can join the party. Use SpiderMonkey's
+# functional-style `indexOf`, if it's available.
+indexOf = exports.indexOf = Array.indexOf or
+ if Array::indexOf
+ (array, item, from) -> array.indexOf item, from
+ else
+ (array, item, from) ->
+ for other, index in array
+ if other is item and (not from or from <= index)
+ return index
+ -1
+
+# Does a list include a value?
+exports.include = (list, value) ->
+ indexOf(list, value) >= 0
+
+# Peek at the beginning of a given string to see if it matches a sequence.
+exports.starts = (string, literal, start) ->
+ literal is string.substr start, literal.length
+
+# Peek at the end of a given string to see if it matches a sequence.
+exports.ends = (string, literal, back) ->
+ len = literal.length
+ literal is string.substr string.length - len - (back or 0), len
+
+# Trim out all falsy values from an array.
+exports.compact = (array) ->
+ item for item in array when item
+
+# Count the number of occurences of a character in a string.
+exports.count = (string, letter) ->
+ num = pos = 0
+ num++ while pos = 1 + string.indexOf letter, pos
+ num
+
+# Merge objects, returning a fresh copy with attributes from both sides.
+# Used every time `Base#compile` is called, to allow properties in the
+# options hash to propagate down the tree without polluting other branches.
+exports.merge = (options, overrides) ->
+ extend (extend {}, options), overrides
+
+# Extend a source object with the properties of another object (shallow copy).
+# We use this to simulate Node's deprecated `process.mixin`.
+extend = exports.extend = (object, properties) ->
+ for all key, val of properties
+ object[key] = val
+ object
+
+# Return a flattened version of an array.
+# Handy for getting a list of `children` from the nodes.
+exports.flatten = flatten = (array) ->
+ flattened = []
+ for element in array
+ if element instanceof Array
+ flattened = flattened.concat flatten element
+ else
+ flattened.push element
+ flattened
+
+# Delete a key from an object, returning the value. Useful when a node is
+# looking for a particular method in an options hash.
+exports.del = (obj, key) ->
+ val = obj[key]
+ delete obj[key]
+ val
+
+# Gets the last item of an array(-like) object.
+exports.last = (array, back) -> array[array.length - (back or 0) - 1]
diff --git a/node_modules/jade/support/coffee-script/src/index.coffee b/node_modules/jade/support/coffee-script/src/index.coffee
new file mode 100644
index 0000000..220f4e2
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/index.coffee
@@ -0,0 +1,2 @@
+# Loader for CoffeeScript as a Node.js library.
+(exports[key] = val) for key, val of require './coffee-script'
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/src/lexer.coffee b/node_modules/jade/support/coffee-script/src/lexer.coffee
new file mode 100644
index 0000000..0362eeb
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/lexer.coffee
@@ -0,0 +1,635 @@
+# The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt
+# matches against the beginning of the source code. When a match is found,
+# a token is produced, we consume the match, and start again. Tokens are in the
+# form:
+#
+# [tag, value, lineNumber]
+#
+# Which is a format that can be fed directly into [Jison](http://github.com/zaach/jison).
+
+{Rewriter} = require './rewriter'
+
+# Import the helpers we need.
+{include, count, starts, compact, last} = require './helpers'
+
+# The Lexer Class
+# ---------------
+
+# The Lexer class reads a stream of CoffeeScript and divvys it up into tagged
+# tokens. Some potential ambiguity in the grammar has been avoided by
+# pushing some extra smarts into the Lexer.
+exports.Lexer = class Lexer
+
+ # **tokenize** is the Lexer's main method. Scan by attempting to match tokens
+ # one at a time, using a regular expression anchored at the start of the
+ # remaining code, or a custom recursive token-matching method
+ # (for interpolations). When the next token has been recorded, we move forward
+ # within the code past the token, and begin again.
+ #
+ # Each tokenizing method is responsible for incrementing `@i` by the number of
+ # characters it has consumed. `@i` can be thought of as our finger on the page
+ # of source.
+ #
+ # Before returning the token stream, run it through the [Rewriter](rewriter.html)
+ # unless explicitly asked not to.
+ tokenize: (code, options) ->
+ code = code.replace(/\r/g, '').replace TRAILING_SPACES, ''
+ o = options or {}
+ @code = code # The remainder of the source code.
+ @i = 0 # Current character position we're parsing.
+ @line = o.line or 0 # The current line.
+ @indent = 0 # The current indentation level.
+ @indebt = 0 # The over-indentation at the current level.
+ @outdebt = 0 # The under-outdentation at the current level.
+ @seenFor = no # The flag for distinguishing FORIN/FOROF from IN/OF.
+ @indents = [] # The stack of all current indentation levels.
+ @tokens = [] # Stream of parsed tokens in the form ['TYPE', value, line]
+ # At every position, run through this list of attempted matches,
+ # short-circuiting if any of them succeed. Their order determines precedence:
+ # `@literalToken` is the fallback catch-all.
+ while @chunk = code.slice @i
+ @identifierToken() or
+ @commentToken() or
+ @whitespaceToken() or
+ @lineToken() or
+ @heredocToken() or
+ @stringToken() or
+ @numberToken() or
+ @regexToken() or
+ @jsToken() or
+ @literalToken()
+ @closeIndentation()
+ return @tokens if o.rewrite is off
+ (new Rewriter).rewrite @tokens
+
+ # Tokenizers
+ # ----------
+
+ # Matches identifying literals: variables, keywords, method names, etc.
+ # Check to ensure that JavaScript reserved words aren't being used as
+ # identifiers. Because CoffeeScript reserves a handful of keywords that are
+ # allowed in JavaScript, we're careful not to tag them as keywords when
+ # referenced as property names here, so you can still do `jQuery.is()` even
+ # though `is` means `===` otherwise.
+ identifierToken: ->
+ return false unless match = IDENTIFIER.exec @chunk
+ [input, id, colon] = match
+ @i += input.length
+ if id is 'all' and @tag() is 'FOR'
+ @token 'ALL', id
+ return true
+ forcedIdentifier = colon or @tagAccessor()
+ tag = 'IDENTIFIER'
+ if include(JS_KEYWORDS, id) or
+ not forcedIdentifier and include(COFFEE_KEYWORDS, id)
+ tag = id.toUpperCase()
+ if tag is 'WHEN' and include LINE_BREAK, @tag()
+ tag = 'LEADING_WHEN'
+ else if tag is 'FOR'
+ @seenFor = yes
+ else if include UNARY, tag
+ tag = 'UNARY'
+ else if include RELATION, tag
+ if tag isnt 'INSTANCEOF' and @seenFor
+ @seenFor = no
+ tag = 'FOR' + tag
+ else
+ tag = 'RELATION'
+ if @value() is '!'
+ @tokens.pop()
+ id = '!' + id
+ if include JS_FORBIDDEN, id
+ if forcedIdentifier
+ tag = 'IDENTIFIER'
+ id = new String id
+ id.reserved = yes
+ else if include RESERVED, id
+ @identifierError id
+ unless forcedIdentifier
+ tag = id = COFFEE_ALIASES[id] if COFFEE_ALIASES.hasOwnProperty id
+ if id is '!'
+ tag = 'UNARY'
+ else if include LOGIC, id
+ tag = 'LOGIC'
+ else if include BOOL, tag
+ id = tag.toLowerCase()
+ tag = 'BOOL'
+ @token tag, id
+ @token ':', ':' if colon
+ true
+
+ # Matches numbers, including decimals, hex, and exponential notation.
+ # Be careful not to interfere with ranges-in-progress.
+ numberToken: ->
+ return false unless match = NUMBER.exec @chunk
+ number = match[0]
+ return false if @tag() is '.' and number.charAt(0) is '.'
+ @i += number.length
+ @token 'NUMBER', number
+ true
+
+ # Matches strings, including multi-line strings. Ensures that quotation marks
+ # are balanced within the string's contents, and within nested interpolations.
+ stringToken: ->
+ switch @chunk.charAt 0
+ when "'"
+ return false unless match = SIMPLESTR.exec @chunk
+ @token 'STRING', (string = match[0]).replace MULTILINER, '\\\n'
+ when '"'
+ return false unless string = @balancedString @chunk, [['"', '"'], ['#{', '}']]
+ if 0 < string.indexOf '#{', 1
+ @interpolateString string.slice 1, -1
+ else
+ @token 'STRING', @escapeLines string
+ else
+ return false
+ @line += count string, '\n'
+ @i += string.length
+ true
+
+ # Matches heredocs, adjusting indentation to the correct level, as heredocs
+ # preserve whitespace, but ignore indentation to the left.
+ heredocToken: ->
+ return false unless match = HEREDOC.exec @chunk
+ heredoc = match[0]
+ quote = heredoc.charAt 0
+ doc = @sanitizeHeredoc match[2], {quote, indent: null}
+ if quote is '"' and 0 <= doc.indexOf '#{'
+ @interpolateString doc, heredoc: yes
+ else
+ @token 'STRING', @makeString doc, quote, yes
+ @line += count heredoc, '\n'
+ @i += heredoc.length
+ true
+
+ # Matches and consumes comments.
+ commentToken: ->
+ return false unless match = @chunk.match COMMENT
+ [comment, here] = match
+ @line += count comment, '\n'
+ @i += comment.length
+ if here
+ @token 'HERECOMMENT', @sanitizeHeredoc here,
+ herecomment: true, indent: Array(@indent + 1).join(' ')
+ @token 'TERMINATOR', '\n'
+ true
+
+ # Matches JavaScript interpolated directly into the source via backticks.
+ jsToken: ->
+ return false unless @chunk.charAt(0) is '`' and match = JSTOKEN.exec @chunk
+ @token 'JS', (script = match[0]).slice 1, -1
+ @i += script.length
+ true
+
+ # Matches regular expression literals. Lexing regular expressions is difficult
+ # to distinguish from division, so we borrow some basic heuristics from
+ # JavaScript and Ruby.
+ regexToken: ->
+ return false if @chunk.charAt(0) isnt '/'
+ return @heregexToken match if match = HEREGEX.exec @chunk
+ return false if include NOT_REGEX, @tag()
+ return false unless match = REGEX.exec @chunk
+ [regex] = match
+ @token 'REGEX', if regex is '//' then '/(?:)/' else regex
+ @i += regex.length
+ true
+
+ # Matches experimental, multiline and extended regular expression literals.
+ heregexToken: (match) ->
+ [heregex, body, flags] = match
+ @i += heregex.length
+ if 0 > body.indexOf '#{'
+ re = body.replace(HEREGEX_OMIT, '').replace(/\//g, '\\/')
+ @token 'REGEX', "/#{ re or '(?:)' }/#{flags}"
+ return true
+ @token 'IDENTIFIER', 'RegExp'
+ @tokens.push ['CALL_START', '(']
+ tokens = []
+ for [tag, value] in @interpolateString(body, regex: yes)
+ if tag is 'TOKENS'
+ tokens.push value...
+ else
+ continue unless value = value.replace HEREGEX_OMIT, ''
+ value = value.replace /\\/g, '\\\\'
+ tokens.push ['STRING', @makeString(value, '"', yes)]
+ tokens.push ['+', '+']
+ tokens.pop()
+ @tokens.push ['STRING', '""'], ['+', '+'] unless tokens[0]?[0] is 'STRING'
+ @tokens.push tokens...
+ @tokens.push [',', ','], ['STRING', '"' + flags + '"'] if flags
+ @token ')', ')'
+ true
+
+ # Matches newlines, indents, and outdents, and determines which is which.
+ # If we can detect that the current line is continued onto the the next line,
+ # then the newline is suppressed:
+ #
+ # elements
+ # .each( ... )
+ # .map( ... )
+ #
+ # Keeps track of the level of indentation, because a single outdent token
+ # can close multiple indents, so we need to know how far in we happen to be.
+ lineToken: ->
+ return false unless match = MULTI_DENT.exec @chunk
+ indent = match[0]
+ @line += count indent, '\n'
+ @i += indent.length
+ prev = last @tokens, 1
+ size = indent.length - 1 - indent.lastIndexOf '\n'
+ nextCharacter = NEXT_CHARACTER.exec(@chunk)[1]
+ noNewlines = (nextCharacter in ['.', ','] and not NEXT_ELLIPSIS.test(@chunk)) or @unfinished()
+ if size - @indebt is @indent
+ return @suppressNewlines() if noNewlines
+ return @newlineToken indent
+ else if size > @indent
+ if noNewlines
+ @indebt = size - @indent
+ return @suppressNewlines()
+ diff = size - @indent + @outdebt
+ @token 'INDENT', diff
+ @indents.push diff
+ @outdebt = @indebt = 0
+ else
+ @indebt = 0
+ @outdentToken @indent - size, noNewlines
+ @indent = size
+ true
+
+ # Record an outdent token or multiple tokens, if we happen to be moving back
+ # inwards past several recorded indents.
+ outdentToken: (moveOut, noNewlines, close) ->
+ while moveOut > 0
+ len = @indents.length - 1
+ if @indents[len] is undefined
+ moveOut = 0
+ else if @indents[len] is @outdebt
+ moveOut -= @outdebt
+ @outdebt = 0
+ else if @indents[len] < @outdebt
+ @outdebt -= @indents[len]
+ moveOut -= @indents[len]
+ else
+ dent = @indents.pop() - @outdebt
+ moveOut -= dent
+ @outdebt = 0
+ @token 'OUTDENT', dent
+ @outdebt -= moveOut if dent
+ @token 'TERMINATOR', '\n' unless @tag() is 'TERMINATOR' or noNewlines
+ true
+
+ # Matches and consumes non-meaningful whitespace. Tag the previous token
+ # as being "spaced", because there are some cases where it makes a difference.
+ whitespaceToken: ->
+ return false unless match = WHITESPACE.exec @chunk
+ prev = last @tokens
+ prev.spaced = true if prev
+ @i += match[0].length
+ true
+
+ # Generate a newline token. Consecutive newlines get merged together.
+ newlineToken: (newlines) ->
+ @token 'TERMINATOR', '\n' unless @tag() is 'TERMINATOR'
+ true
+
+ # Use a `\` at a line-ending to suppress the newline.
+ # The slash is removed here once its job is done.
+ suppressNewlines: ->
+ @tokens.pop() if @value() is '\\'
+ true
+
+ # We treat all other single characters as a token. Eg.: `( ) , . !`
+ # Multi-character operators are also literal tokens, so that Jison can assign
+ # the proper order of operations. There are some symbols that we tag specially
+ # here. `;` and newlines are both treated as a `TERMINATOR`, we distinguish
+ # parentheses that indicate a method call from regular parentheses, and so on.
+ literalToken: ->
+ if match = OPERATOR.exec @chunk
+ [value] = match
+ @tagParameters() if CODE.test value
+ else
+ value = @chunk.charAt 0
+ @i += value.length
+ tag = value
+ prev = last @tokens
+ if value is '=' and prev
+ @assignmentError() if not prev[1].reserved and include JS_FORBIDDEN, prev[1]
+ if prev[1] in ['||', '&&']
+ prev[0] = 'COMPOUND_ASSIGN'
+ prev[1] += '='
+ return true
+ if ';' is value then tag = 'TERMINATOR'
+ else if include LOGIC , value then tag = 'LOGIC'
+ else if include MATH , value then tag = 'MATH'
+ else if include COMPARE , value then tag = 'COMPARE'
+ else if include COMPOUND_ASSIGN, value then tag = 'COMPOUND_ASSIGN'
+ else if include UNARY , value then tag = 'UNARY'
+ else if include SHIFT , value then tag = 'SHIFT'
+ else if value is '?' and prev?.spaced then tag = 'LOGIC'
+ else if prev and not prev.spaced
+ if value is '(' and include CALLABLE, prev[0]
+ prev[0] = 'FUNC_EXIST' if prev[0] is '?'
+ tag = 'CALL_START'
+ else if value is '[' and include INDEXABLE, prev[0]
+ tag = 'INDEX_START'
+ switch prev[0]
+ when '?' then prev[0] = 'INDEX_SOAK'
+ when '::' then prev[0] = 'INDEX_PROTO'
+ @token tag, value
+ true
+
+ # Token Manipulators
+ # ------------------
+
+ # As we consume a new `IDENTIFIER`, look at the previous token to determine
+ # if it's a special kind of accessor. Return `true` if any type of accessor
+ # is the previous token.
+ tagAccessor: ->
+ return false if not (prev = last @tokens) or prev.spaced
+ if prev[1] is '::'
+ @tag 0, 'PROTOTYPE_ACCESS'
+ else if prev[1] is '.' and @value(1) isnt '.'
+ if @tag(1) is '?'
+ @tag 0, 'SOAK_ACCESS'
+ @tokens.splice(-2, 1)
+ else
+ @tag 0, 'PROPERTY_ACCESS'
+ else
+ return prev[0] is '@'
+ true
+
+ # Sanitize a heredoc or herecomment by
+ # erasing all external indentation on the left-hand side.
+ sanitizeHeredoc: (doc, options) ->
+ {indent, herecomment} = options
+ return doc if herecomment and 0 > doc.indexOf '\n'
+ unless herecomment
+ while match = HEREDOC_INDENT.exec doc
+ attempt = match[1]
+ indent = attempt if indent is null or 0 < attempt.length < indent.length
+ doc = doc.replace /// \n #{indent} ///g, '\n' if indent
+ doc = doc.replace /^\n/, '' unless herecomment
+ doc
+
+ # A source of ambiguity in our grammar used to be parameter lists in function
+ # definitions versus argument lists in function calls. Walk backwards, tagging
+ # parameters specially in order to make things easier for the parser.
+ tagParameters: ->
+ return if @tag() isnt ')'
+ i = @tokens.length
+ while tok = @tokens[--i]
+ switch tok[0]
+ when 'IDENTIFIER' then tok[0] = 'PARAM'
+ when ')' then tok[0] = 'PARAM_END'
+ when '(', 'CALL_START' then tok[0] = 'PARAM_START'; return true
+ true
+
+ # Close up all remaining open blocks at the end of the file.
+ closeIndentation: ->
+ @outdentToken @indent
+
+ # The error for when you try to use a forbidden word in JavaScript as
+ # an identifier.
+ identifierError: (word) ->
+ throw SyntaxError "Reserved word \"#{word}\" on line #{@line + 1}"
+
+ # The error for when you try to assign to a reserved word in JavaScript,
+ # like "function" or "default".
+ assignmentError: ->
+ throw SyntaxError "Reserved word \"#{@value()}\" on line #{@line + 1} can't be assigned"
+
+ # Matches a balanced group such as a single or double-quoted string. Pass in
+ # a series of delimiters, all of which must be nested correctly within the
+ # contents of the string. This method allows us to have strings within
+ # interpolations within strings, ad infinitum.
+ balancedString: (str, delimited, options) ->
+ options or= {}
+ levels = []
+ i = 0
+ slen = str.length
+ while i < slen
+ if levels.length and str.charAt(i) is '\\'
+ i += 1
+ else
+ for pair in delimited
+ [open, close] = pair
+ if levels.length and starts(str, close, i) and last(levels) is pair
+ levels.pop()
+ i += close.length - 1
+ i += 1 unless levels.length
+ break
+ if starts str, open, i
+ levels.push(pair)
+ i += open.length - 1
+ break
+ break if not levels.length
+ i += 1
+ if levels.length
+ throw SyntaxError "Unterminated #{levels.pop()[0]} starting on line #{@line + 1}"
+ if not i then false else str[0...i]
+
+ # Expand variables and expressions inside double-quoted strings using
+ # Ruby-like notation for substitution of arbitrary expressions.
+ #
+ # "Hello #{name.capitalize()}."
+ #
+ # If it encounters an interpolation, this method will recursively create a
+ # new Lexer, tokenize the interpolated contents, and merge them into the
+ # token stream.
+ interpolateString: (str, options) ->
+ {heredoc, regex} = options or= {}
+ tokens = []
+ pi = 0
+ i = -1
+ while letter = str.charAt i += 1
+ if letter is '\\'
+ i += 1
+ continue
+ unless letter is '#' and str.charAt(i+1) is '{' and
+ (expr = @balancedString str.slice(i+1), [['{', '}']])
+ continue
+ tokens.push ['TO_BE_STRING', str.slice(pi, i)] if pi < i
+ inner = expr.slice(1, -1).replace(LEADING_SPACES, '').replace(TRAILING_SPACES, '')
+ if inner.length
+ nested = new Lexer().tokenize inner, line: @line, rewrite: off
+ nested.pop()
+ if nested.length > 1
+ nested.unshift ['(', '(']
+ nested.push [')', ')']
+ tokens.push ['TOKENS', nested]
+ i += expr.length
+ pi = i + 1
+ tokens.push ['TO_BE_STRING', str.slice pi] if i > pi < str.length
+ return tokens if regex
+ return @token 'STRING', '""' unless tokens.length
+ tokens.unshift ['', ''] unless tokens[0][0] is 'TO_BE_STRING'
+ @token '(', '(' if interpolated = tokens.length > 1
+ for [tag, value], i in tokens
+ @token '+', '+' if i
+ if tag is 'TOKENS'
+ @tokens.push value...
+ else
+ @token 'STRING', @makeString value, '"', heredoc
+ @token ')', ')' if interpolated
+ tokens
+
+ # Helpers
+ # -------
+
+ # Add a token to the results, taking note of the line number.
+ token: (tag, value) ->
+ @tokens.push [tag, value, @line]
+
+ # Peek at a tag/value in the current token stream.
+ tag : (index, tag) ->
+ (tok = last @tokens, index) and if tag? then tok[0] = tag else tok[0]
+ value: (index, val) ->
+ (tok = last @tokens, index) and if val? then tok[1] = val else tok[1]
+
+ # Are we in the midst of an unfinished expression?
+ unfinished: ->
+ (prev = last @tokens, 1) and prev[0] isnt '.' and
+ (value = @value()) and not value.reserved and
+ NO_NEWLINE.test(value) and not CODE.test(value) and not ASSIGNED.test(@chunk)
+
+ # Converts newlines for string literals.
+ escapeLines: (str, heredoc) ->
+ str.replace MULTILINER, if heredoc then '\\n' else ''
+
+ # Constructs a string token by escaping quotes and newlines.
+ makeString: (body, quote, heredoc) ->
+ return quote + quote unless body
+ body = body.replace /\\([\s\S])/g, (match, contents) ->
+ if contents in ['\n', quote] then contents else match
+ body = body.replace /// #{quote} ///g, '\\$&'
+ quote + @escapeLines(body, heredoc) + quote
+
+# Constants
+# ---------
+
+# Keywords that CoffeeScript shares in common with JavaScript.
+JS_KEYWORDS = [
+ 'true', 'false', 'null', 'this'
+ 'new', 'delete', 'typeof', 'in', 'instanceof'
+ 'return', 'throw', 'break', 'continue', 'debugger'
+ 'if', 'else', 'switch', 'for', 'while', 'try', 'catch', 'finally'
+ 'class', 'extends', 'super'
+]
+
+# CoffeeScript-only keywords.
+COFFEE_KEYWORDS = ['then', 'unless', 'until', 'loop', 'of', 'by', 'when']
+COFFEE_KEYWORDS.push op for all op of COFFEE_ALIASES =
+ and : '&&'
+ or : '||'
+ is : '=='
+ isnt : '!='
+ not : '!'
+ yes : 'TRUE'
+ no : 'FALSE'
+ on : 'TRUE'
+ off : 'FALSE'
+
+# The list of keywords that are reserved by JavaScript, but not used, or are
+# used by CoffeeScript internally. We throw an error when these are encountered,
+# to avoid having a JavaScript error at runtime.
+RESERVED = [
+ 'case', 'default', 'do', 'function', 'var', 'void', 'with'
+ 'const', 'let', 'enum', 'export', 'import', 'native'
+ '__hasProp', '__extends', '__slice'
+]
+
+# The superset of both JavaScript keywords and reserved words, none of which may
+# be used as identifiers or properties.
+JS_FORBIDDEN = JS_KEYWORDS.concat RESERVED
+
+# Token matching regexes.
+IDENTIFIER = /// ^
+ ( [$A-Za-z_][$\w]* )
+ ( [^\n\S]* : (?!:) )? # Is this a property name?
+///
+NUMBER = /^0x[\da-f]+|^(?:\d+(\.\d+)?|\.\d+)(?:e[+-]?\d+)?/i
+HEREDOC = /^("""|''')([\s\S]*?)(?:\n[ \t]*)?\1/
+OPERATOR = /// ^ (?: -[-=>]? | \+[+=]? | \.\.\.? | [*&|/%=<>^:!?]+ ) ///
+WHITESPACE = /^[ \t]+/
+COMMENT = /^###([^#][\s\S]*?)(?:###[ \t]*\n|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/
+CODE = /^[-=]>/
+MULTI_DENT = /^(?:\n[ \t]*)+/
+SIMPLESTR = /^'[^\\']*(?:\\.[^\\']*)*'/
+JSTOKEN = /^`[^\\`]*(?:\\.[^\\`]*)*`/
+
+# Regex-matching-regexes.
+REGEX = /// ^
+ / (?! \s ) # disallow leading whitespace
+ [^ [ / \n \\ ]* # every other thing
+ (?:
+ (?: \\[\s\S] # anything escaped
+ | \[ # character class
+ [^ \] \n \\ ]*
+ (?: \\[\s\S] [^ \] \n \\ ]* )*
+ ]
+ ) [^ [ / \n \\ ]*
+ )*
+ / [imgy]{0,4} (?![A-Za-z])
+///
+HEREGEX = /^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?![A-Za-z])/
+HEREGEX_OMIT = /\s+(?:#.*)?/g
+
+# Token cleaning regexes.
+MULTILINER = /\n/g
+HEREDOC_INDENT = /\n+([ \t]*)/g
+ASSIGNED = /^\s*@?[$A-Za-z_][$\w]*[ \t]*?[:=][^:=>]/
+NEXT_CHARACTER = /^\s*(\S?)/
+NEXT_ELLIPSIS = /^\s*\.\.\.?/
+LEADING_SPACES = /^\s+/
+TRAILING_SPACES = /\s+$/
+NO_NEWLINE = /// ^
+ (?: # non-capturing...
+ [-+*&|/%=<>!.\\][<>=&|]* | # symbol operators
+ and | or | is(?:nt)? | n(?:ot|ew) | # word operators
+ delete | typeof | instanceof
+ )$
+///
+
+
+# Compound assignment tokens.
+COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']
+
+# Unary tokens.
+UNARY = ['UMINUS', 'UPLUS', '!', '!!', '~', 'NEW', 'TYPEOF', 'DELETE']
+
+# Logical tokens.
+LOGIC = ['&', '|', '^', '&&', '||']
+
+# Bit-shifting tokens.
+SHIFT = ['<<', '>>', '>>>']
+
+# Comparison tokens.
+COMPARE = ['<=', '<', '>', '>=']
+
+# Mathmatical tokens.
+MATH = ['*', '/', '%']
+
+# Relational tokens that are negatable with `not` prefix.
+RELATION = ['IN', 'OF', 'INSTANCEOF']
+
+# Boolean tokens.
+BOOL = ['TRUE', 'FALSE', 'NULL']
+
+# Tokens which a regular expression will never immediately follow, but which
+# a division operator might.
+#
+# See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions
+#
+# Our list is shorter, due to sans-parentheses method calls.
+NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', '++', '--', ']']
+
+# Tokens which could legitimately be invoked or indexed. A opening
+# parentheses or bracket following these tokens will be recorded as the start
+# of a function invocation or indexing operation.
+CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER']
+INDEXABLE = CALLABLE.concat 'NUMBER', 'BOOL'
+
+# Tokens that, when immediately preceding a `WHEN`, indicate that the `WHEN`
+# occurs at the start of a line. We disambiguate these from trailing whens to
+# avoid an ambiguity in the grammar.
+LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']
diff --git a/node_modules/jade/support/coffee-script/src/nodes.coffee b/node_modules/jade/support/coffee-script/src/nodes.coffee
new file mode 100644
index 0000000..99e372a
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/nodes.coffee
@@ -0,0 +1,1710 @@
+# `nodes.coffee` contains all of the node classes for the syntax tree. Most
+# nodes are created as the result of actions in the [grammar](grammar.html),
+# but some are created by other nodes as a method of code generation. To convert
+# the syntax tree into a string of JavaScript code, call `compile()` on the root.
+
+{Scope} = require './scope'
+
+# Import the helpers we plan to use.
+{compact, flatten, merge, del, include, starts, ends, last} = require './helpers'
+
+# Constant functions for nodes that don't need customization.
+YES = -> yes
+NO = -> no
+THIS = -> this
+
+#### Base
+
+# The **Base** is the abstract base class for all nodes in the syntax tree.
+# Each subclass implements the `compileNode` method, which performs the
+# code generation for that node. To compile a node to JavaScript,
+# call `compile` on it, which wraps `compileNode` in some generic extra smarts,
+# to know when the generated code needs to be wrapped up in a closure.
+# An options hash is passed and cloned throughout, containing information about
+# the environment from higher in the tree (such as if a returned value is
+# being requested by the surrounding function), information about the current
+# scope, and indentation level.
+exports.Base = class Base
+
+ constructor: ->
+ @tags = {}
+
+ # Common logic for determining whether to wrap this node in a closure before
+ # compiling it, or to compile directly. We need to wrap if this node is a
+ # *statement*, and it's not a *pureStatement*, and we're not at
+ # the top level of a block (which would be unnecessary), and we haven't
+ # already been asked to return the result (because statements know how to
+ # return results).
+ #
+ # If a Node is *topSensitive*, that means that it needs to compile differently
+ # depending on whether it's being used as part of a larger expression, or is a
+ # top-level statement within the function body.
+ compile: (o) ->
+ @options = if o then merge o else {}
+ @tab = o.indent
+ top = if @topSensitive() then @options.top else del @options, 'top'
+ closure = @isStatement(o) and not @isPureStatement() and not top and
+ not @options.asStatement and this not instanceof Comment
+ code = if closure then @compileClosure(@options) else @compileNode(@options)
+ code
+
+ # Statements converted into expressions via closure-wrapping share a scope
+ # object with their parent closure, to preserve the expected lexical scope.
+ compileClosure: (o) ->
+ o.sharedScope = o.scope
+ throw new Error 'cannot include a pure statement in an expression.' if @containsPureStatement()
+ Closure.wrap(this).compile o
+
+ # If the code generation wishes to use the result of a complex expression
+ # in multiple places, ensure that the expression is only ever evaluated once,
+ # by assigning it to a temporary variable.
+ compileReference: (o, options) ->
+ pair = unless @isComplex()
+ [this, this]
+ else
+ reference = new Literal o.scope.freeVariable 'ref'
+ compiled = new Assign reference, this
+ [compiled, reference]
+ (pair[i] = node.compile o) for node, i in pair if options?.precompile
+ pair
+
+ # Convenience method to grab the current indentation level, plus tabbing in.
+ idt: (tabs) ->
+ idt = @tab or ''
+ num = (tabs or 0) + 1
+ idt += TAB while num -= 1
+ idt
+
+ # Construct a node that returns the current node's result.
+ # Note that this is overridden for smarter behavior for
+ # many statement nodes (eg If, For)...
+ makeReturn: ->
+ new Return this
+
+ # Does this node, or any of its children, contain a node of a certain kind?
+ # Recursively traverses down the *children* of the nodes, yielding to a block
+ # and returning true when the block finds a match. `contains` does not cross
+ # scope boundaries.
+ contains: (block) ->
+ contains = false
+ @traverseChildren false, (node) ->
+ if block(node)
+ contains = true
+ return false
+ contains
+
+ # Is this node of a certain type, or does it contain the type?
+ containsType: (type) ->
+ this instanceof type or @contains (node) -> node instanceof type
+
+ # Convenience for the most common use of contains. Does the node contain
+ # a pure statement?
+ containsPureStatement: ->
+ @isPureStatement() or @contains (node) -> node.isPureStatement()
+
+ # Perform an in-order traversal of the AST. Crosses scope boundaries.
+ traverse: (block) -> @traverseChildren true, block
+
+ # `toString` representation of the node, for inspecting the parse tree.
+ # This is what `coffee --nodes` prints out.
+ toString: (idt, override) ->
+ idt or= ''
+ children = (child.toString idt + TAB for child in @collectChildren()).join('')
+ klass = override or @constructor.name + if @soakNode then '?' else ''
+ '\n' + idt + klass + children
+
+ eachChild: (func) ->
+ return unless @children
+ for attr in @children when this[attr]
+ for child in flatten [this[attr]]
+ return if func(child) is false
+
+ collectChildren: ->
+ nodes = []
+ @eachChild (node) -> nodes.push node
+ nodes
+
+ traverseChildren: (crossScope, func) ->
+ @eachChild (child) ->
+ return false if func(child) is false
+ if crossScope or child not instanceof Code
+ child.traverseChildren crossScope, func
+
+ invert: -> new Op '!', this
+
+ # Default implementations of the common node properties and methods. Nodes
+ # will override these with custom logic, if needed.
+ children: []
+
+ unwrap : THIS
+ isStatement : NO
+ isPureStatement : NO
+ isComplex : YES
+ topSensitive : NO
+ unfoldSoak : NO
+
+ # Is this node used to assign a certain variable?
+ assigns: NO
+
+#### Expressions
+
+# The expressions body is the list of expressions that forms the body of an
+# indented block of code -- the implementation of a function, a clause in an
+# `if`, `switch`, or `try`, and so on...
+exports.Expressions = class Expressions extends Base
+
+ children: ['expressions']
+ isStatement: YES
+
+ constructor: (nodes) ->
+ super()
+ @expressions = compact flatten nodes or []
+
+ # Tack an expression on to the end of this expression list.
+ push: (node) ->
+ @expressions.push(node)
+ this
+
+ # Add an expression at the beginning of this expression list.
+ unshift: (node) ->
+ @expressions.unshift(node)
+ this
+
+ # If this Expressions consists of just a single node, unwrap it by pulling
+ # it back out.
+ unwrap: ->
+ if @expressions.length is 1 then @expressions[0] else this
+
+ # Is this an empty block of code?
+ empty: ->
+ @expressions.length is 0
+
+ # An Expressions node does not return its entire body, rather it
+ # ensures that the final expression is returned.
+ makeReturn: ->
+ end = @expressions[idx = @expressions.length - 1]
+ end = @expressions[idx -= 1] if end instanceof Comment
+ if end and end not instanceof Return
+ @expressions[idx] = end.makeReturn()
+ this
+
+ # An **Expressions** is the only node that can serve as the root.
+ compile: (o) ->
+ o or= {}
+ if o.scope then super(o) else @compileRoot(o)
+
+ compileNode: (o) ->
+ (@compileExpression node, merge o for node in @expressions).join '\n'
+
+ # If we happen to be the top-level **Expressions**, wrap everything in
+ # a safety closure, unless requested not to.
+ # It would be better not to generate them in the first place, but for now,
+ # clean up obvious double-parentheses.
+ compileRoot: (o) ->
+ o.indent = @tab = if o.bare then '' else TAB
+ o.scope = new Scope null, this, null
+ code = @compileWithDeclarations o
+ code = code.replace TRAILING_WHITESPACE, ''
+ if o.bare then code else "(function() {\n#{code}\n}).call(this);\n"
+
+ # Compile the expressions body for the contents of a function, with
+ # declarations of all inner variables pushed up to the top.
+ compileWithDeclarations: (o) ->
+ code = @compileNode(o)
+ if o.scope.hasAssignments this
+ code = "#{@tab}var #{ o.scope.compiledAssignments().replace /\n/g, '$&' + @tab };\n#{code}"
+ if not o.globals and o.scope.hasDeclarations this
+ code = "#{@tab}var #{o.scope.compiledDeclarations()};\n#{code}"
+ code
+
+ # Compiles a single expression within the expressions body. If we need to
+ # return the result, and it's an expression, simply return it. If it's a
+ # statement, ask the statement to do so.
+ compileExpression: (node, o) ->
+ @tab = o.indent
+ node.tags.front = true
+ compiledNode = node.compile merge o, top: true
+ if node.isStatement(o) then compiledNode else "#{@idt()}#{compiledNode};"
+
+# Wrap up the given nodes as an **Expressions**, unless it already happens
+# to be one.
+Expressions.wrap = (nodes) ->
+ return nodes[0] if nodes.length is 1 and nodes[0] instanceof Expressions
+ new Expressions(nodes)
+
+#### Literal
+
+# Literals are static values that can be passed through directly into
+# JavaScript without translation, such as: strings, numbers,
+# `true`, `false`, `null`...
+exports.Literal = class Literal extends Base
+
+ constructor: (@value) ->
+ super()
+
+ makeReturn: ->
+ if @isStatement() then this else super()
+
+ # Break and continue must be treated as pure statements -- they lose their
+ # meaning when wrapped in a closure.
+ isStatement: ->
+ @value in ['break', 'continue', 'debugger']
+ isPureStatement: Literal::isStatement
+
+ isComplex: NO
+
+ isReserved: ->
+ !!@value.reserved
+
+ assigns: (name) -> name is @value
+
+ compileNode: (o) ->
+ idt = if @isStatement(o) then @idt() else ''
+ end = if @isStatement(o) then ';' else ''
+ val = if @isReserved() then "\"#{@value}\"" else @value
+ idt + val + end
+
+ toString: -> ' "' + @value + '"'
+
+#### Return
+
+# A `return` is a *pureStatement* -- wrapping it in a closure wouldn't
+# make sense.
+exports.Return = class Return extends Base
+
+ isStatement: YES
+ isPureStatement: YES
+ children: ['expression']
+
+ constructor: (@expression) ->
+ super()
+
+ makeReturn: THIS
+
+ compile: (o) ->
+ expr = @expression?.makeReturn()
+ return expr.compile o if expr and (expr not instanceof Return)
+ super o
+
+ compileNode: (o) ->
+ expr = ''
+ if @expression
+ o.asStatement = true if @expression.isStatement(o)
+ expr = ' ' + @expression.compile(o)
+ "#{@tab}return#{expr};"
+
+#### Value
+
+# A value, variable or literal or parenthesized, indexed or dotted into,
+# or vanilla.
+exports.Value = class Value extends Base
+
+ children: ['base', 'properties']
+
+ # A **Value** has a base and a list of property accesses.
+ constructor: (@base, @properties, tag) ->
+ super()
+ @properties or= []
+ @tags[tag] = yes if tag
+
+ # Add a property access to the list.
+ push: (prop) ->
+ @properties.push(prop)
+ this
+
+ hasProperties: ->
+ !!@properties.length
+
+ # Some boolean checks for the benefit of other nodes.
+
+ isArray: ->
+ @base instanceof ArrayLiteral and not @properties.length
+
+ isObject: ->
+ @base instanceof ObjectLiteral and not @properties.length
+
+ isSplice: ->
+ last(@properties) instanceof Slice
+
+ isComplex: ->
+ @base.isComplex() or @hasProperties()
+
+ assigns: (name) ->
+ not @properties.length and @base.assigns name
+
+ makeReturn: ->
+ if @properties.length then super() else @base.makeReturn()
+
+
+ # The value can be unwrapped as its inner node, if there are no attached
+ # properties.
+ unwrap: ->
+ if @properties.length then this else @base
+
+ # Values are considered to be statements if their base is a statement.
+ isStatement: (o) ->
+ @base.isStatement(o) and not @properties.length
+
+ isSimpleNumber: ->
+ @base instanceof Literal and SIMPLENUM.test @base.value
+
+ # A reference has base part (`this` value) and name part.
+ # We cache them separately for compiling complex expressions.
+ # `a()[b()] ?= c` -> `(_base = a())[_name = b()] ? _base[_name] = c`
+ cacheReference: (o) ->
+ name = last @properties
+ if not @base.isComplex() and @properties.length < 2 and
+ not name?.isComplex()
+ return [this, this] # `a` `a.b`
+ base = new Value @base, @properties.slice 0, -1
+ if base.isComplex() # `a().b`
+ bref = new Literal o.scope.freeVariable 'base'
+ base = new Value new Parens new Assign bref, base
+ return [base, bref] unless name # `a()`
+ if name.isComplex() # `a[b()]`
+ nref = new Literal o.scope.freeVariable 'name'
+ name = new Index new Assign nref, name.index
+ nref = new Index nref
+ [base.push(name), new Value(bref or base.base, [nref or name])]
+
+ # Override compile to unwrap the value when possible.
+ compile: (o) ->
+ @base.tags.front = @tags.front
+ if not o.top or @properties.length then super(o) else @base.compile(o)
+
+ # We compile a value to JavaScript by compiling and joining each property.
+ # Things get much more insteresting if the chain of properties has *soak*
+ # operators `?.` interspersed. Then we have to take care not to accidentally
+ # evaluate a anything twice when building the soak chain.
+ compileNode: (o) ->
+ return ifn.compile o if ifn = @unfoldSoak o
+ props = @properties
+ @base.parenthetical = yes if @parenthetical and not props.length
+ code = @base.compile o
+ code = "(#{code})" if props[0] instanceof Accessor and @isSimpleNumber()
+ (code += prop.compile o) for prop in props
+ return code
+
+ # Unfold a soak into an `If`: `a?.b` -> `a.b if a?`
+ unfoldSoak: (o) ->
+ if ifn = @base.unfoldSoak o
+ Array::push.apply ifn.body.properties, @properties
+ return ifn
+ for prop, i in @properties when prop.soakNode
+ prop.soakNode = off
+ fst = new Value @base, @properties.slice 0, i
+ snd = new Value @base, @properties.slice i
+ if fst.isComplex()
+ ref = new Literal o.scope.freeVariable 'ref'
+ fst = new Parens new Assign ref, fst
+ snd.base = ref
+ ifn = new If new Existence(fst), snd, soak: yes
+ return ifn
+ null
+
+#### Comment
+
+# CoffeeScript passes through block comments as JavaScript block comments
+# at the same position.
+exports.Comment = class Comment extends Base
+
+ isStatement: YES
+
+ constructor: (@comment) ->
+ super()
+
+ makeReturn: THIS
+
+ compileNode: (o) ->
+ @tab + '/*' + @comment.replace(/\n/g, '\n' + @tab) + '*/'
+
+#### Call
+
+# Node for a function invocation. Takes care of converting `super()` calls into
+# calls against the prototype's function of the same name.
+exports.Call = class Call extends Base
+
+ children: ['variable', 'args']
+
+ constructor: (variable, @args, @soakNode) ->
+ super()
+ @isNew = false
+ @isSuper = variable is 'super'
+ @variable = if @isSuper then null else variable
+ @args or= []
+
+ compileSplatArguments: (o) ->
+ Splat.compileSplattedArray @args, o
+
+ # Tag this invocation as creating a new instance.
+ newInstance: ->
+ @isNew = true
+ this
+
+ prefix: ->
+ if @isNew then 'new ' else ''
+
+ # Grab the reference to the superclass' implementation of the current method.
+ superReference: (o) ->
+ {method} = o.scope
+ throw Error "cannot call super outside of a function." unless method
+ {name} = method
+ throw Error "cannot call super on an anonymous function." unless name
+ if method.klass
+ "#{method.klass}.__super__.#{name}"
+ else
+ "#{name}.__super__.constructor"
+
+ # Soaked chained invocations unfold into if/else ternary structures.
+ unfoldSoak: (o) ->
+ if @soakNode
+ if val = @variable
+ val = new Value val unless val instanceof Value
+ [left, rite] = val.cacheReference o
+ else
+ left = new Literal @superReference o
+ rite = new Value left
+ rite = new Call rite, @args
+ rite.isNew = @isNew
+ left = new Literal "typeof #{ left.compile o } === \"function\""
+ ifn = new If left, new Value(rite), soak: yes
+ return ifn
+ call = this
+ list = []
+ loop
+ if call.variable instanceof Call
+ list.push call
+ call = call.variable
+ continue
+ break unless call.variable instanceof Value
+ list.push call
+ break unless (call = call.variable.base) instanceof Call
+ for call in list.reverse()
+ if ifn
+ if call.variable instanceof Call
+ call.variable = ifn
+ else
+ call.variable.base = ifn
+ ifn = If.unfoldSoak o, call, 'variable'
+ ifn
+
+ # Compile a vanilla function call.
+ compileNode: (o) ->
+ return ifn.compile o if ifn = @unfoldSoak o
+ @variable?.tags.front = @tags.front
+ for arg in @args when arg instanceof Splat
+ return @compileSplat o
+ args = ((arg.parenthetical = on) and arg.compile o for arg in @args).join ', '
+ if @isSuper
+ @compileSuper args, o
+ else
+ "#{@prefix()}#{@variable.compile o}(#{args})"
+
+ # `super()` is converted into a call against the superclass's implementation
+ # of the current function.
+ compileSuper: (args, o) ->
+ "#{@superReference(o)}.call(this#{ if args.length then ', ' else '' }#{args})"
+
+ # If you call a function with a splat, it's converted into a JavaScript
+ # `.apply()` call to allow an array of arguments to be passed.
+ # If it's a constructor, then things get real tricky. We have to inject an
+ # inner constructor in order to be able to pass the varargs.
+ compileSplat: (o) ->
+ splatargs = @compileSplatArguments o
+ return "#{ @superReference o }.apply(this, #{splatargs})" if @isSuper
+ unless @isNew
+ base = new Value base unless (base = @variable) instanceof Value
+ if (name = base.properties.pop()) and base.isComplex()
+ ref = o.scope.freeVariable 'this'
+ fun = "(#{ref} = #{ base.compile o })#{ name.compile o }"
+ else
+ fun = ref = base.compile o
+ fun += name.compile o if name
+ return "#{fun}.apply(#{ref}, #{splatargs})"
+ idt = @idt 1
+ """
+ (function(func, args, ctor) {
+ #{idt}ctor.prototype = func.prototype;
+ #{idt}var child = new ctor, result = func.apply(child, args);
+ #{idt}return typeof result === "object" ? result : child;
+ #{@tab}})(#{ @variable.compile o }, #{splatargs}, function() {})
+ """
+
+#### Extends
+
+# Node to extend an object's prototype with an ancestor object.
+# After `goog.inherits` from the
+# [Closure Library](http://closure-library.googlecode.com/svn/docs/closureGoogBase.js.html).
+exports.Extends = class Extends extends Base
+
+ children: ['child', 'parent']
+
+ constructor: (@child, @parent) ->
+ super()
+
+ # Hooks one constructor into another's prototype chain.
+ compileNode: (o) ->
+ ref = new Value new Literal utility 'extends'
+ (new Call ref, [@child, @parent]).compile o
+
+#### Accessor
+
+# A `.` accessor into a property of a value, or the `::` shorthand for
+# an accessor into the object's prototype.
+exports.Accessor = class Accessor extends Base
+
+ children: ['name']
+
+ constructor: (@name, tag) ->
+ super()
+ @prototype = if tag is 'prototype' then '.prototype' else ''
+ @soakNode = tag is 'soak'
+
+ compileNode: (o) ->
+ name = @name.compile o
+ namePart = if name.match(IS_STRING) then "[#{name}]" else ".#{name}"
+ @prototype + namePart
+
+ isComplex: NO
+
+#### Index
+
+# A `[ ... ]` indexed accessor into an array or object.
+exports.Index = class Index extends Base
+
+ children: ['index']
+
+ constructor: (@index) ->
+ super()
+
+ compileNode: (o) ->
+ idx = @index.compile o
+ prefix = if @proto then '.prototype' else ''
+ "#{prefix}[#{idx}]"
+
+ isComplex: -> @index.isComplex()
+
+#### Range
+
+# A range literal. Ranges can be used to extract portions (slices) of arrays,
+# to specify a range for comprehensions, or as a value, to be expanded into the
+# corresponding array of integers at runtime.
+exports.Range = class Range extends Base
+
+ children: ['from', 'to']
+
+ constructor: (@from, @to, tag) ->
+ super()
+ @exclusive = tag is 'exclusive'
+ @equals = if @exclusive then '' else '='
+
+ # Compiles the range's source variables -- where it starts and where it ends.
+ # But only if they need to be cached to avoid double evaluation.
+ compileVariables: (o) ->
+ o = merge(o, top: true)
+ [@from, @fromVar] = @from.compileReference o, precompile: yes
+ [@to, @toVar] = @to.compileReference o, precompile: yes
+ [@fromNum, @toNum] = [@fromVar.match(SIMPLENUM), @toVar.match(SIMPLENUM)]
+ parts = []
+ parts.push @from if @from isnt @fromVar
+ parts.push @to if @to isnt @toVar
+
+ # When compiled normally, the range returns the contents of the *for loop*
+ # needed to iterate over the values in the range. Used by comprehensions.
+ compileNode: (o) ->
+ @compileVariables o
+ return @compileArray(o) unless o.index
+ return @compileSimple(o) if @fromNum and @toNum
+ idx = del o, 'index'
+ step = del o, 'step'
+ vars = "#{idx} = #{@from}" + if @to isnt @toVar then ", #{@to}" else ''
+ intro = "(#{@fromVar} <= #{@toVar} ? #{idx}"
+ compare = "#{intro} <#{@equals} #{@toVar} : #{idx} >#{@equals} #{@toVar})"
+ stepPart = if step then step.compile(o) else '1'
+ incr = if step then "#{idx} += #{stepPart}" else "#{intro} += #{stepPart} : #{idx} -= #{stepPart})"
+ "#{vars}; #{compare}; #{incr}"
+
+ # Compile a simple range comprehension, with integers.
+ compileSimple: (o) ->
+ [from, to] = [+@fromNum, +@toNum]
+ idx = del o, 'index'
+ step = del o, 'step'
+ step and= "#{idx} += #{step.compile(o)}"
+ if from <= to
+ "#{idx} = #{from}; #{idx} <#{@equals} #{to}; #{step or "#{idx}++"}"
+ else
+ "#{idx} = #{from}; #{idx} >#{@equals} #{to}; #{step or "#{idx}--"}"
+
+ # When used as a value, expand the range into the equivalent array.
+ compileArray: (o) ->
+ if @fromNum and @toNum and Math.abs(@fromNum - @toNum) <= 20
+ range = [+@fromNum..+@toNum]
+ range.pop() if @exclusive
+ return "[#{ range.join(', ') }]"
+ idt = @idt 1
+ i = o.scope.freeVariable 'i'
+ result = o.scope.freeVariable 'result'
+ pre = "\n#{idt}#{result} = [];"
+ if @fromNum and @toNum
+ o.index = i
+ body = @compileSimple o
+ else
+ vars = "#{i} = #{@from}" + if @to isnt @toVar then ", #{@to}" else ''
+ clause = "#{@fromVar} <= #{@toVar} ?"
+ body = "var #{vars}; #{clause} #{i} <#{@equals} #{@toVar} : #{i} >#{@equals} #{@toVar}; #{clause} #{i} += 1 : #{i} -= 1"
+ post = "{ #{result}.push(#{i}); }\n#{idt}return #{result};\n#{o.indent}"
+ "(function() {#{pre}\n#{idt}for (#{body})#{post}}).call(this)"
+
+#### Slice
+
+# An array slice literal. Unlike JavaScript's `Array#slice`, the second parameter
+# specifies the index of the end of the slice, just as the first parameter
+# is the index of the beginning.
+exports.Slice = class Slice extends Base
+
+ children: ['range']
+
+ constructor: (@range) ->
+ super()
+
+ compileNode: (o) ->
+ from = if @range.from then @range.from.compile(o) else '0'
+ to = if @range.to then @range.to.compile(o) else ''
+ to += if not to or @range.exclusive then '' else ' + 1'
+ to = ', ' + to if to
+ ".slice(#{from}#{to})"
+
+#### ObjectLiteral
+
+# An object literal, nothing fancy.
+exports.ObjectLiteral = class ObjectLiteral extends Base
+
+ children: ['properties']
+
+ constructor: (props) ->
+ super()
+ @objects = @properties = props or []
+
+ compileNode: (o) ->
+ top = del o, 'top'
+ o.indent = @idt 1
+ nonComments = prop for prop in @properties when prop not instanceof Comment
+ lastNoncom = last nonComments
+ props = for prop, i in @properties
+ join = if i is @properties.length - 1
+ ''
+ else if prop is lastNoncom or prop instanceof Comment
+ '\n'
+ else
+ ',\n'
+ indent = if prop instanceof Comment then '' else @idt 1
+ if prop instanceof Value and prop.tags.this
+ prop = new Assign prop.properties[0].name, prop, 'object'
+ else if prop not instanceof Assign and prop not instanceof Comment
+ prop = new Assign prop, prop, 'object'
+ indent + prop.compile(o) + join
+ props = props.join('')
+ obj = "{#{ if props then '\n' + props + '\n' + @idt() else '' }}"
+ if @tags.front then "(#{obj})" else obj
+
+ assigns: (name) ->
+ for prop in @properties when prop.assigns name then return yes
+ no
+
+#### ArrayLiteral
+
+# An array literal.
+exports.ArrayLiteral = class ArrayLiteral extends Base
+
+ children: ['objects']
+
+ constructor: (@objects) ->
+ super()
+ @objects or= []
+
+ compileSplatLiteral: (o) ->
+ Splat.compileSplattedArray @objects, o
+
+ compileNode: (o) ->
+ o.indent = @idt 1
+ for obj in @objects when obj instanceof Splat
+ return @compileSplatLiteral o
+ objects = []
+ for obj, i in @objects
+ code = obj.compile o
+ objects.push (if obj instanceof Comment
+ "\n#{code}\n#{o.indent}"
+ else if i is @objects.length - 1
+ code
+ else
+ code + ', '
+ )
+ objects = objects.join ''
+ if 0 < objects.indexOf '\n'
+ "[\n#{o.indent}#{objects}\n#{@tab}]"
+ else
+ "[#{objects}]"
+
+ assigns: (name) ->
+ for obj in @objects when obj.assigns name then return yes
+ no
+
+#### Class
+
+# The CoffeeScript class definition.
+exports.Class = class Class extends Base
+
+ children: ['variable', 'parent', 'properties']
+ isStatement: YES
+
+ # Initialize a **Class** with its name, an optional superclass, and a
+ # list of prototype property assignments.
+ constructor: (variable, @parent, @properties) ->
+ super()
+ @variable = if variable is '__temp__' then new Literal variable else variable
+ @properties or= []
+ @returns = false
+
+ makeReturn: ->
+ @returns = true
+ this
+
+ # Instead of generating the JavaScript string directly, we build up the
+ # equivalent syntax tree and compile that, in pieces. You can see the
+ # constructor, property assignments, and inheritance getting built out below.
+ compileNode: (o) ->
+ {variable} = this
+ variable = new Literal o.scope.freeVariable 'ctor' if variable.value is '__temp__'
+ extension = @parent and new Extends variable, @parent
+ props = new Expressions
+ o.top = true
+ me = null
+ className = variable.compile o
+ constScope = null
+
+ if @parent
+ applied = new Value @parent, [new Accessor new Literal 'apply']
+ constructor = new Code([], new Expressions([
+ new Call applied, [new Literal('this'), new Literal('arguments')]
+ ]))
+ else
+ constructor = new Code [], new Expressions [new Return new Literal 'this']
+
+ for prop in @properties
+ [pvar, func] = [prop.variable, prop.value]
+ if pvar and pvar.base.value is 'constructor'
+ if func not instanceof Code
+ [func, ref] = func.compileReference o
+ props.push func if func isnt ref
+ apply = new Call(new Value(ref, [new Accessor new Literal 'apply']), [new Literal('this'), new Literal('arguments')])
+ func = new Code [], new Expressions([apply])
+ throw new Error "cannot define a constructor as a bound function." if func.bound
+ func.name = className
+ func.body.push new Return new Literal 'this'
+ variable = new Value variable
+ variable.namespaced = 0 < className.indexOf '.'
+ constructor = func
+ constructor.comment = props.expressions.pop() if props.expressions[props.expressions.length - 1] instanceof Comment
+ continue
+ if func instanceof Code and func.bound
+ if prop.context is 'this'
+ func.context = className
+ else
+ func.bound = false
+ constScope or= new Scope(o.scope, constructor.body, constructor)
+ me or= constScope.freeVariable 'this'
+ pname = pvar.compile(o)
+ constructor.body.push new Return new Literal 'this' if constructor.body.empty()
+ constructor.body.unshift new Literal "this.#{pname} = function(){ return #{className}.prototype.#{pname}.apply(#{me}, arguments); }"
+ if pvar
+ access = if prop.context is 'this' then pvar.base.properties[0] else new Accessor(pvar, 'prototype')
+ val = new Value variable, [access]
+ prop = new Assign(val, func)
+ props.push prop
+
+ constructor.className = className.match /[\w\d\$_]+$/
+ constructor.body.unshift new Literal "#{me} = this" if me
+ construct = @idt() + new Assign(variable, constructor).compile(merge o, sharedScope: constScope) + ';'
+ props = if !props.empty() then '\n' + props.compile(o) else ''
+ extension = if extension then '\n' + @idt() + extension.compile(o) + ';' else ''
+ returns = if @returns then '\n' + new Return(variable).compile(o) else ''
+ construct + extension + props + returns
+
+#### Assign
+
+# The **Assign** is used to assign a local variable to value, or to set the
+# property of an object -- including within object literals.
+exports.Assign = class Assign extends Base
+
+ # Matchers for detecting class/method names
+ METHOD_DEF: /^(?:(\S+)\.prototype\.)?([$A-Za-z_][$\w]*)$/
+
+ children: ['variable', 'value']
+
+ constructor: (@variable, @value, @context) ->
+ super()
+
+ topSensitive: YES
+
+ isValue: ->
+ @variable instanceof Value
+
+ # Compile an assignment, delegating to `compilePatternMatch` or
+ # `compileSplice` if appropriate. Keep track of the name of the base object
+ # we've been assigned to, for correct internal references. If the variable
+ # has not been seen yet within the current scope, declare it.
+ compileNode: (o) ->
+ if isValue = @isValue()
+ return @compilePatternMatch(o) if @variable.isArray() or @variable.isObject()
+ return @compileSplice(o) if @variable.isSplice()
+ if ifn = If.unfoldSoak o, this, 'variable'
+ delete o.top
+ return ifn.compile o
+ top = del o, 'top'
+ stmt = del o, 'asStatement'
+ name = @variable.compile(o)
+ if @value instanceof Code and match = @METHOD_DEF.exec name
+ @value.name = match[2]
+ @value.klass = match[1]
+ val = @value.compile o
+ return "#{name}: #{val}" if @context is 'object'
+ o.scope.find name unless isValue and (@variable.hasProperties() or @variable.namespaced)
+ val = "#{name} = #{val}"
+ return "#{@tab}#{val};" if stmt
+ if top or @parenthetical then val else "(#{val})"
+
+ # Brief implementation of recursive pattern matching, when assigning array or
+ # object literals to a value. Peeks at their properties to assign inner names.
+ # See the [ECMAScript Harmony Wiki](http://wiki.ecmascript.org/doku.php?id=harmony:destructuring)
+ # for details.
+ compilePatternMatch: (o) ->
+ if (value = @value).isStatement o then value = Closure.wrap value
+ {objects} = @variable.base
+ return value.compile o unless olength = objects.length
+ isObject = @variable.isObject()
+ if o.top and olength is 1 and (obj = objects[0]) not instanceof Splat
+ # Unroll simplest cases: `{v} = x` -> `v = x.v`
+ if obj instanceof Assign
+ {variable: {base: idx}, value: obj} = obj
+ else
+ idx = if isObject
+ if obj.tags.this then obj.properties[0].name else obj
+ else new Literal 0
+ value = new Value value unless value instanceof Value
+ accessClass = if IDENTIFIER.test idx.value then Accessor else Index
+ value.properties.push new accessClass idx
+ return new Assign(obj, value).compile o
+ top = del o, 'top'
+ otop = merge o, top: yes
+ valVar = value.compile o
+ assigns = []
+ splat = false
+ if not IDENTIFIER.test(valVar) or @variable.assigns(valVar)
+ assigns.push "#{ ref = o.scope.freeVariable 'ref' } = #{valVar}"
+ valVar = ref
+ for obj, i in objects
+ # A regular array pattern-match.
+ idx = i
+ if isObject
+ if obj instanceof Assign
+ # A regular object pattern-match.
+ {variable: {base: idx}, value: obj} = obj
+ else
+ # A shorthand `{a, b, @c} = val` pattern-match.
+ idx = if obj.tags.this then obj.properties[0].name else obj
+ unless obj instanceof Value or obj instanceof Splat
+ throw new Error 'pattern matching must use only identifiers on the left-hand side.'
+ accessClass = if isObject and IDENTIFIER.test(idx.value) then Accessor else Index
+ if not splat and obj instanceof Splat
+ val = new Literal obj.compileValue o, valVar, i, olength - i - 1
+ splat = true
+ else
+ idx = new Literal(if splat then "#{valVar}.length - #{olength - idx}" else idx) if typeof idx isnt 'object'
+ val = new Value new Literal(valVar), [new accessClass idx]
+ assigns.push new Assign(obj, val).compile otop
+ assigns.push valVar unless top
+ code = assigns.join ', '
+ if top or @parenthetical then code else "(#{code})"
+
+ # Compile the assignment from an array splice literal, using JavaScript's
+ # `Array#splice` method.
+ compileSplice: (o) ->
+ {range} = @variable.properties.pop()
+ name = @variable.compile o
+ plus = if range.exclusive then '' else ' + 1'
+ from = if range.from then range.from.compile(o) else '0'
+ to = if range.to then range.to.compile(o) + ' - ' + from + plus else "#{name}.length"
+ ref = o.scope.freeVariable 'ref'
+ val = @value.compile(o)
+ "([].splice.apply(#{name}, [#{from}, #{to}].concat(#{ref} = #{val})), #{ref})"
+
+ assigns: (name) ->
+ @[if @context is 'object' then 'value' else 'variable'].assigns name
+
+#### Code
+
+# A function definition. This is the only node that creates a new Scope.
+# When for the purposes of walking the contents of a function body, the Code
+# has no *children* -- they're within the inner scope.
+exports.Code = class Code extends Base
+
+ children: ['params', 'body']
+
+ constructor: (@params, @body, tag) ->
+ super()
+ @params or= []
+ @body or= new Expressions
+ @bound = tag is 'boundfunc'
+ @context = 'this' if @bound
+
+ # Compilation creates a new scope unless explicitly asked to share with the
+ # outer scope. Handles splat parameters in the parameter list by peeking at
+ # the JavaScript `arguments` objects. If the function is bound with the `=>`
+ # arrow, generates a wrapper that saves the current value of `this` through
+ # a closure.
+ compileNode: (o) ->
+ sharedScope = del o, 'sharedScope'
+ top = del o, 'top'
+ o.scope = sharedScope or new Scope(o.scope, @body, this)
+ o.top = true
+ o.indent = @idt(1)
+ empty = @body.expressions.length is 0
+ delete o.bare
+ delete o.globals
+ splat = undefined
+ params = []
+ for param, i in @params
+ if splat
+ if param.attach
+ param.assign = new Assign new Value new Literal('this'), [new Accessor param.value]
+ @body.expressions.splice splat.index + 1, 0, param.assign
+ splat.trailings.push param
+ else
+ if param.attach
+ {value} = param
+ [param, param.splat] = [new Literal(o.scope.freeVariable 'arg'), param.splat]
+ @body.unshift new Assign new Value(new Literal('this'), [new Accessor value]), param
+ if param.splat
+ splat = new Splat param.value
+ splat.index = i
+ splat.trailings = []
+ splat.arglength = @params.length
+ @body.unshift(splat)
+ else
+ params.push param
+ o.scope.startLevel()
+ params = (param.compile(o) for param in params)
+ @body.makeReturn() unless empty or @noReturn
+ (o.scope.parameter(param)) for param in params
+ comm = if @comment then @comment.compile(o) + '\n' else ''
+ o.indent = @idt 2 if @className
+ code = if @body.expressions.length then "\n#{ @body.compileWithDeclarations(o) }\n" else ''
+ open = if @className then "(function() {\n#{comm}#{@idt(1)}function #{@className}(" else "function("
+ close = if @className then "#{code and @idt(1)}};\n#{@idt(1)}return #{@className};\n#{@tab}})()" else "#{code and @tab}}"
+ func = "#{open}#{ params.join(', ') }) {#{code}#{close}"
+ o.scope.endLevel()
+ return "#{utility 'bind'}(#{func}, #{@context})" if @bound
+ if @tags.front then "(#{func})" else func
+
+ # Short-circuit traverseChildren method to prevent it from crossing scope boundaries
+ # unless crossScope is true
+ traverseChildren: (crossScope, func) -> super(crossScope, func) if crossScope
+
+#### Param
+
+# A parameter in a function definition. Beyond a typical Javascript parameter,
+# these parameters can also attach themselves to the context of the function,
+# as well as be a splat, gathering up a group of parameters into an array.
+exports.Param = class Param extends Base
+
+ children: ['name']
+
+ constructor: (@name, @attach, @splat) ->
+ super()
+ @value = new Literal @name
+
+ compileNode: (o) ->
+ @value.compile o
+
+ toString: ->
+ {name} = @
+ name = '@' + name if @attach
+ name += '...' if @splat
+ new Literal(name).toString()
+
+#### Splat
+
+# A splat, either as a parameter to a function, an argument to a call,
+# or as part of a destructuring assignment.
+exports.Splat = class Splat extends Base
+
+ children: ['name']
+
+ constructor: (name) ->
+ super()
+ @name = if name.compile then name else new Literal name
+
+ assigns: (name) -> @name.assigns name
+
+ compileNode: (o) ->
+ if @index? then @compileParam(o) else @name.compile(o)
+
+ # Compiling a parameter splat means recovering the parameters that succeed
+ # the splat in the parameter list, by slicing the arguments object.
+ compileParam: (o) ->
+ name = @name.compile(o)
+ o.scope.find name
+ end = ''
+ if @trailings.length
+ len = o.scope.freeVariable 'len'
+ o.scope.assign len, "arguments.length"
+ variadic = o.scope.freeVariable 'result'
+ o.scope.assign variadic, len + ' >= ' + @arglength
+ end = if @trailings.length then ", #{len} - #{@trailings.length}"
+ for trailing, idx in @trailings
+ if trailing.attach
+ assign = trailing.assign
+ trailing = new Literal o.scope.freeVariable 'arg'
+ assign.value = trailing
+ pos = @trailings.length - idx
+ o.scope.assign(trailing.compile(o), "arguments[#{variadic} ? #{len} - #{pos} : #{@index + idx}]")
+ "#{name} = #{utility('slice')}.call(arguments, #{@index}#{end})"
+
+ # A compiling a splat as a destructuring assignment means slicing arguments
+ # from the right-hand-side's corresponding array.
+ compileValue: (o, name, index, trailings) ->
+ trail = if trailings then ", #{name}.length - #{trailings}" else ''
+ "#{utility 'slice'}.call(#{name}, #{index}#{trail})"
+
+ # Utility function that converts arbitrary number of elements, mixed with
+ # splats, to a proper array
+ @compileSplattedArray: (list, o) ->
+ args = []
+ end = -1
+ for arg, i in list
+ code = arg.compile o
+ prev = args[end]
+ if arg not instanceof Splat
+ if prev and starts(prev, '[') and ends(prev, ']')
+ args[end] = "#{prev.slice 0, -1}, #{code}]"
+ continue
+ if prev and starts(prev, '.concat([') and ends(prev, '])')
+ args[end] = "#{prev.slice 0, -2}, #{code}])"
+ continue
+ code = "[#{code}]"
+ args[++end] = if i is 0 then code else ".concat(#{code})"
+ args.join ''
+
+#### While
+
+# A while loop, the only sort of low-level loop exposed by CoffeeScript. From
+# it, all other loops can be manufactured. Useful in cases where you need more
+# flexibility or more speed than a comprehension can provide.
+exports.While = class While extends Base
+
+ children: ['condition', 'guard', 'body']
+ isStatement: YES
+
+ constructor: (condition, opts) ->
+ super()
+ @condition = if opts?.invert then condition.invert() else condition
+ @guard = opts?.guard
+
+ addBody: (body) ->
+ @body = body
+ this
+
+ makeReturn: ->
+ @returns = true
+ this
+
+ topSensitive: YES
+
+ # The main difference from a JavaScript *while* is that the CoffeeScript
+ # *while* can be used as a part of a larger expression -- while loops may
+ # return an array containing the computed result of each iteration.
+ compileNode: (o) ->
+ top = del(o, 'top') and not @returns
+ o.indent = @idt 1
+ @condition.parenthetical = yes
+ cond = @condition.compile(o)
+ o.top = true
+ set = ''
+ unless top
+ rvar = o.scope.freeVariable 'result'
+ set = "#{@tab}#{rvar} = [];\n"
+ @body = Push.wrap(rvar, @body) if @body
+ pre = "#{set}#{@tab}while (#{cond})"
+ @body = Expressions.wrap([new If(@guard, @body)]) if @guard
+ if @returns
+ post = '\n' + new Return(new Literal rvar).compile(merge(o, indent: @idt()))
+ else
+ post = ''
+ "#{pre} {\n#{ @body.compile(o) }\n#{@tab}}#{post}"
+
+#### Op
+
+# Simple Arithmetic and logical operations. Performs some conversion from
+# CoffeeScript operations into their JavaScript equivalents.
+exports.Op = class Op extends Base
+
+ # The map of conversions from CoffeeScript to JavaScript symbols.
+ CONVERSIONS:
+ '==': '==='
+ '!=': '!=='
+ of: 'in'
+
+ # The map of invertible operators.
+ INVERSIONS:
+ '!==': '==='
+ '===': '!=='
+
+ # The list of operators for which we perform
+ # [Python-style comparison chaining](http://docs.python.org/reference/expressions.html#notin).
+ CHAINABLE: ['<', '>', '>=', '<=', '===', '!==']
+
+ # Our assignment operators that have no JavaScript equivalent.
+ ASSIGNMENT: ['||=', '&&=', '?=']
+
+ # Operators must come before their operands with a space.
+ PREFIX_OPERATORS: ['new', 'typeof', 'delete']
+
+ children: ['first', 'second']
+
+ constructor: (op, first, second, flip) ->
+ if op is 'new'
+ return first.newInstance() if first instanceof Call
+ first = new Parens first if first instanceof Code and first.bound
+ super()
+ @operator = @CONVERSIONS[op] or op
+ (@first = first ).tags.operation = yes
+ (@second = second).tags.operation = yes if second
+ @flip = !!flip
+
+ isUnary: ->
+ not @second
+
+ isComplex: -> @operator isnt '!' or @first.isComplex()
+
+ isMutator: ->
+ ends(@operator, '=') and @operator not in ['===', '!==']
+
+ isChainable: ->
+ include(@CHAINABLE, @operator)
+
+ invert: ->
+ if @operator in ['===', '!==']
+ @operator = @INVERSIONS[@operator]
+ this
+ else if @second
+ new Parens(this).invert()
+ else
+ super()
+
+ toString: (idt) ->
+ super(idt, @constructor.name + ' ' + @operator)
+
+ compileNode: (o) ->
+ @first.tags.front = @tags.front if @second
+ return @compileChain(o) if @isChainable() and @first.unwrap() instanceof Op and @first.unwrap().isChainable()
+ return @compileAssignment(o) if include @ASSIGNMENT, @operator
+ return @compileUnary(o) if @isUnary()
+ return @compileExistence(o) if @operator is '?'
+ @first = new Parens @first if @first instanceof Op and @first.isMutator()
+ @second = new Parens @second if @second instanceof Op and @second.isMutator()
+ [@first.compile(o), @operator, @second.compile(o)].join ' '
+
+ # Mimic Python's chained comparisons when multiple comparison operators are
+ # used sequentially. For example:
+ #
+ # bin/coffee -e "puts 50 < 65 > 10"
+ # true
+ compileChain: (o) ->
+ shared = @first.unwrap().second
+ [@first.second, shared] = shared.compileReference o
+ [first, second, shared] = [@first.compile(o), @second.compile(o), shared.compile(o)]
+ "(#{first}) && (#{shared} #{@operator} #{second})"
+
+ # When compiling a conditional assignment, take care to ensure that the
+ # operands are only evaluated once, even though we have to reference them
+ # more than once.
+ compileAssignment: (o) ->
+ [left, rite] = @first.cacheReference o
+ rite = new Assign rite, @second
+ return new Op(@operator.slice(0, -1), left, rite).compile o
+
+ compileExistence: (o) ->
+ if @first.isComplex()
+ ref = o.scope.freeVariable 'ref'
+ fst = new Parens new Assign new Literal(ref), @first
+ else
+ fst = @first
+ ref = fst.compile o
+ new Existence(fst).compile(o) + " ? #{ref} : #{ @second.compile o }"
+
+ # Compile a unary **Op**.
+ compileUnary: (o) ->
+ space = if include @PREFIX_OPERATORS, @operator then ' ' else ''
+ parts = [@operator, space, @first.compile(o)]
+ (if @flip then parts.reverse() else parts).join ''
+
+#### In
+exports.In = class In extends Base
+
+ children: ['object', 'array']
+
+ constructor: (@object, @array) ->
+ super()
+
+ isArray: ->
+ @array instanceof Value and @array.isArray()
+
+ compileNode: (o) ->
+ if @isArray() then @compileOrTest(o) else @compileLoopTest(o)
+
+ compileOrTest: (o) ->
+ [obj1, obj2] = @object.compileReference o, precompile: yes
+ tests = for item, i in @array.base.objects
+ "#{if i then obj2 else obj1} === #{item.compile(o)}"
+ "(#{tests.join(' || ')})"
+
+ compileLoopTest: (o) ->
+ "#{utility 'inArray'}(#{@object.compile o}, #{@array.compile o})"
+
+#### Try
+
+# A classic *try/catch/finally* block.
+exports.Try = class Try extends Base
+
+ children: ['attempt', 'recovery', 'ensure']
+ isStatement: YES
+
+ constructor: (@attempt, @error, @recovery, @ensure) ->
+ super()
+
+ makeReturn: ->
+ @attempt = @attempt.makeReturn() if @attempt
+ @recovery = @recovery.makeReturn() if @recovery
+ this
+
+ # Compilation is more or less as you would expect -- the *finally* clause
+ # is optional, the *catch* is not.
+ compileNode: (o) ->
+ o.indent = @idt 1
+ o.top = true
+ attemptPart = @attempt.compile(o)
+ errorPart = if @error then " (#{ @error.compile(o) }) " else ' '
+ catchPart = if @recovery
+ " catch#{errorPart}{\n#{ @recovery.compile(o) }\n#{@tab}}"
+ else unless @ensure or @recovery then ' catch (_e) {}' else ''
+ finallyPart = (@ensure or '') and ' finally {\n' + @ensure.compile(merge(o)) + "\n#{@tab}}"
+ "#{@tab}try {\n#{attemptPart}\n#{@tab}}#{catchPart}#{finallyPart}"
+
+#### Throw
+
+# Simple node to throw an exception.
+exports.Throw = class Throw extends Base
+
+ children: ['expression']
+ isStatement: YES
+
+ constructor: (@expression) ->
+ super()
+
+ # A **Throw** is already a return, of sorts...
+ makeReturn: THIS
+
+ compileNode: (o) ->
+ "#{@tab}throw #{@expression.compile(o)};"
+
+#### Existence
+
+# Checks a variable for existence -- not *null* and not *undefined*. This is
+# similar to `.nil?` in Ruby, and avoids having to consult a JavaScript truth
+# table.
+exports.Existence = class Existence extends Base
+
+ children: ['expression']
+
+ constructor: (@expression) ->
+ super()
+
+ compileNode: (o) ->
+ code = @expression.compile o
+ code = if IDENTIFIER.test(code) and not o.scope.check code
+ "typeof #{code} !== \"undefined\" && #{code} !== null"
+ else
+ "#{code} != null"
+ if @parenthetical then code else "(#{code})"
+
+#### Parens
+
+# An extra set of parentheses, specified explicitly in the source. At one time
+# we tried to clean up the results by detecting and removing redundant
+# parentheses, but no longer -- you can put in as many as you please.
+#
+# Parentheses are a good way to force any statement to become an expression.
+exports.Parens = class Parens extends Base
+
+ children: ['expression']
+
+ constructor: (@expression) ->
+ super()
+
+ isStatement: (o) ->
+ @expression.isStatement(o)
+ isComplex: ->
+ @expression.isComplex()
+
+ topSensitive: YES
+
+ makeReturn: ->
+ @expression.makeReturn()
+
+ compileNode: (o) ->
+ top = del o, 'top'
+ @expression.parenthetical = true
+ code = @expression.compile(o)
+ return code if top and @expression.isPureStatement o
+ if @parenthetical or @isStatement o
+ return if top then @tab + code + ';' else code
+ "(#{code})"
+
+#### For
+
+# CoffeeScript's replacement for the *for* loop is our array and object
+# comprehensions, that compile into *for* loops here. They also act as an
+# expression, able to return the result of each filtered iteration.
+#
+# Unlike Python array comprehensions, they can be multi-line, and you can pass
+# the current index of the loop as a second parameter. Unlike Ruby blocks,
+# you can map and filter in a single pass.
+exports.For = class For extends Base
+
+ children: ['body', 'source', 'guard']
+ isStatement: YES
+
+ constructor: (@body, source, @name, @index) ->
+ super()
+ {@source, @guard, @step} = source
+ @raw = !!source.raw
+ @object = !!source.object
+ [@name, @index] = [@index, @name] if @object
+ @pattern = @name instanceof Value
+ throw new Error('index cannot be a pattern matching expression') if @index instanceof Value
+ @returns = false
+
+ topSensitive: YES
+
+ makeReturn: ->
+ @returns = true
+ this
+
+ compileReturnValue: (val, o) ->
+ return '\n' + new Return(new Literal val).compile(o) if @returns
+ return '\n' + val if val
+ ''
+
+ # Welcome to the hairiest method in all of CoffeeScript. Handles the inner
+ # loop, filtering, stepping, and result saving for array, object, and range
+ # comprehensions. Some of the generated code can be shared in common, and
+ # some cannot.
+ compileNode: (o) ->
+ topLevel = del(o, 'top') and not @returns
+ range = @source instanceof Value and @source.base instanceof Range and not @source.properties.length
+ source = if range then @source.base else @source
+ codeInBody = not @body.containsPureStatement() and @body.contains (node) -> node instanceof Code
+ scope = o.scope
+ name = @name and @name.compile o
+ index = @index and @index.compile o
+ scope.find(name, immediate: yes) if name and not @pattern and (range or not codeInBody)
+ scope.find(index, immediate: yes) if index
+ rvar = scope.freeVariable 'result' unless topLevel
+ ivar = if range then name else index
+ ivar = scope.freeVariable 'i' if not ivar or codeInBody
+ nvar = scope.freeVariable 'i' if name and not range and codeInBody
+ varPart = ''
+ guardPart = ''
+ unstepPart = ''
+ body = Expressions.wrap([@body])
+ idt1 = @idt 1
+ if range
+ forPart = source.compile merge o, {index: ivar, @step}
+ else
+ svar = sourcePart = @source.compile o
+ if (name or not @raw) and
+ not (IDENTIFIER.test(svar) and scope.check svar, immediate: on)
+ sourcePart = "#{ref = scope.freeVariable 'ref'} = #{svar}"
+ sourcePart = "(#{sourcePart})" unless @object
+ svar = ref
+ namePart = if @pattern
+ new Assign(@name, new Literal "#{svar}[#{ivar}]").compile merge o, top: on
+ else if name
+ "#{name} = #{svar}[#{ivar}]"
+ unless @object
+ lvar = scope.freeVariable 'len'
+ stepPart = if @step then "#{ivar} += #{ @step.compile(o) }" else "#{ivar}++"
+ forPart = "#{ivar} = 0, #{lvar} = #{sourcePart}.length; #{ivar} < #{lvar}; #{stepPart}"
+ resultPart = if rvar then "#{@tab}#{rvar} = [];\n" else ''
+ returnResult = @compileReturnValue(rvar, o)
+ body = Push.wrap(rvar, body) unless topLevel
+ if @guard
+ body = Expressions.wrap([new If(@guard, body)])
+ if codeInBody
+ body.unshift new Literal "var #{name} = #{ivar}" if range
+ body.unshift new Literal "var #{namePart}" if namePart
+ body.unshift new Literal "var #{index} = #{ivar}" if index
+ lastLine = body.expressions.pop()
+ body.push new Assign new Literal(ivar), new Literal index if index
+ body.push new Assign new Literal(nvar), new Literal name if nvar
+ body.push lastLine
+ o.indent = @idt 1
+ body = Expressions.wrap [new Literal body.compile o]
+ body.push new Assign new Literal(index), new Literal ivar if index
+ body.push new Assign new Literal(name), new Literal nvar or ivar if name
+ else
+ varPart = "#{idt1}#{namePart};\n" if namePart
+ if forPart and name is ivar
+ unstepPart = if @step then "#{name} -= #{ @step.compile(o) };" else "#{name}--;"
+ unstepPart = "\n#{@tab}" + unstepPart
+ if @object
+ forPart = "#{ivar} in #{sourcePart}"
+ guardPart = "\n#{idt1}if (!#{utility('hasProp')}.call(#{svar}, #{ivar})) continue;" unless @raw
+ body = body.compile merge o, indent: idt1, top: true
+ vars = if range then name else "#{name}, #{ivar}"
+ """
+ #{resultPart}#{@tab}for (#{forPart}) {#{guardPart}
+ #{varPart}#{body}
+ #{@tab}}#{unstepPart}#{returnResult}
+ """
+
+#### Switch
+
+# A JavaScript *switch* statement. Converts into a returnable expression on-demand.
+exports.Switch = class Switch extends Base
+
+ children: ['subject', 'cases', 'otherwise']
+
+ isStatement: YES
+
+ constructor: (@subject, @cases, @otherwise) ->
+ super()
+ @tags.subjectless = !@subject
+ @subject or= new Literal 'true'
+
+ makeReturn: ->
+ pair[1].makeReturn() for pair in @cases
+ @otherwise.makeReturn() if @otherwise
+ this
+
+ compileNode: (o) ->
+ idt = o.indent = @idt 2
+ o.top = yes
+ code = "#{ @tab }switch (#{ @subject.compile o }) {"
+ for pair in @cases
+ [conditions, block] = pair
+ exprs = block.expressions
+ for condition in flatten [conditions]
+ condition = new Op '!!', new Parens condition if @tags.subjectless
+ code += "\n#{ @idt(1) }case #{ condition.compile o }:"
+ code += "\n#{ block.compile o }"
+ code += "\n#{ idt }break;" unless last(exprs) instanceof Return
+ if @otherwise
+ code += "\n#{ @idt(1) }default:\n#{ @otherwise.compile o }"
+ code += "\n#{ @tab }}"
+ code
+
+#### If
+
+# *If/else* statements. Acts as an expression by pushing down requested returns
+# to the last line of each clause.
+#
+# Single-expression **Ifs** are compiled into conditional operators if possible,
+# because ternaries are already proper expressions, and don't need conversion.
+exports.If = class If extends Base
+
+ children: ['condition', 'body', 'elseBody', 'assigner']
+
+ topSensitive: YES
+
+ constructor: (condition, @body, tags) ->
+ @tags = tags or= {}
+ @condition = if tags.invert then condition.invert() else condition
+ @soakNode = tags.soak
+ @elseBody = null
+ @isChain = false
+
+ bodyNode: -> @body?.unwrap()
+ elseBodyNode: -> @elseBody?.unwrap()
+
+ # Rewrite a chain of **Ifs** to add a default case as the final *else*.
+ addElse: (elseBody) ->
+ if @isChain
+ @elseBodyNode().addElse elseBody
+ else
+ @isChain = elseBody instanceof If
+ @elseBody = @ensureExpressions elseBody
+ this
+
+ # The **If** only compiles into a statement if either of its bodies needs
+ # to be a statement. Otherwise a conditional operator is safe.
+ isStatement: (o) ->
+ @statement or= o?.top or @bodyNode().isStatement(o) or @elseBodyNode()?.isStatement(o)
+
+ compileCondition: (o) ->
+ @condition.parenthetical = yes
+ @condition.compile o
+
+ compileNode: (o) ->
+ if @isStatement o then @compileStatement o else @compileExpression o
+
+ makeReturn: ->
+ if @isStatement()
+ @body and= @ensureExpressions(@body.makeReturn())
+ @elseBody and= @ensureExpressions(@elseBody.makeReturn())
+ this
+ else
+ new Return this
+
+ ensureExpressions: (node) ->
+ if node instanceof Expressions then node else new Expressions [node]
+
+ # Compile the **If** as a regular *if-else* statement. Flattened chains
+ # force inner *else* bodies into statement form.
+ compileStatement: (o) ->
+ top = del o, 'top'
+ child = del o, 'chainChild'
+ condO = merge o
+ o.indent = @idt 1
+ o.top = true
+ ifPart = "if (#{ @compileCondition condO }) {\n#{ @body.compile o }\n#{@tab}}"
+ ifPart = @tab + ifPart unless child
+ return ifPart unless @elseBody
+ ifPart + if @isChain
+ ' else ' + @elseBodyNode().compile merge o, indent: @tab, chainChild: true
+ else
+ " else {\n#{ @elseBody.compile(o) }\n#{@tab}}"
+
+ # Compile the If as a conditional operator.
+ compileExpression: (o) ->
+ @bodyNode().tags.operation = @condition.tags.operation = yes
+ @elseBodyNode().tags.operation = yes if @elseBody
+ ifPart = @condition.compile(o) + ' ? ' + @bodyNode().compile(o)
+ elsePart = if @elseBody then @elseBodyNode().compile(o) else 'undefined'
+ code = "#{ifPart} : #{elsePart}"
+ if @tags.operation or @soakNode then "(#{code})" else code
+
+ unfoldSoak: -> @soakNode and this
+
+ # Unfold a node's child if soak, then tuck the node under created `If`
+ @unfoldSoak: (o, parent, name) ->
+ return unless ifn = parent[name].unfoldSoak o
+ parent[name] = ifn.body
+ ifn.body = new Value parent
+ ifn
+
+# Faux-Nodes
+# ----------
+# Faux-nodes are never created by the grammar, but are used during code
+# generation to generate other combinations of nodes.
+
+#### Push
+
+# The **Push** creates the tree for `array.push(value)`,
+# which is helpful for recording the result arrays from comprehensions.
+Push =
+ wrap: (name, expressions) ->
+ return expressions if expressions.empty() or expressions.containsPureStatement()
+ Expressions.wrap [new Call(
+ new Value new Literal(name), [new Accessor new Literal 'push']
+ [expressions.unwrap()]
+ )]
+
+#### Closure
+
+# A faux-node used to wrap an expressions body in a closure.
+Closure =
+
+ # Wrap the expressions body, unless it contains a pure statement,
+ # in which case, no dice. If the body mentions `this` or `arguments`,
+ # then make sure that the closure wrapper preserves the original values.
+ wrap: (expressions, statement, noReturn) ->
+ return expressions if expressions.containsPureStatement()
+ func = new Parens new Code [], Expressions.wrap [expressions]
+ args = []
+ if (mentionsArgs = expressions.contains @literalArgs) or
+ ( expressions.contains @literalThis)
+ meth = new Literal if mentionsArgs then 'apply' else 'call'
+ args = [new Literal 'this']
+ args.push new Literal 'arguments' if mentionsArgs
+ func = new Value func, [new Accessor meth]
+ func.noReturn = noReturn
+ call = new Call func, args
+ if statement then Expressions.wrap [call] else call
+
+ literalArgs: (node) -> node instanceof Literal and node.value is 'arguments'
+ literalThis: (node) -> node instanceof Literal and node.value is 'this' or
+ node instanceof Code and node.bound
+
+# Constants
+# ---------
+
+UTILITIES =
+
+ # Correctly set up a prototype chain for inheritance, including a reference
+ # to the superclass for `super()` calls. See:
+ # [goog.inherits](http://closure-library.googlecode.com/svn/docs/closureGoogBase.js.source.html#line1206).
+ extends: '''
+ function(child, parent) {
+ function ctor() { this.constructor = child; }
+ ctor.prototype = parent.prototype;
+ child.prototype = new ctor;
+ if (typeof parent.extended === "function") parent.extended(child);
+ child.__super__ = parent.prototype;
+ }
+ '''
+
+ # Create a function bound to the current value of "this".
+ bind: '''
+ function(func, context) {
+ return function() { return func.apply(context, arguments); };
+ }
+ '''
+
+ # Discover if an item is in an array.
+ inArray: '''
+ (function() {
+ var indexOf = Array.prototype.indexOf || function(item) {
+ var i = this.length; while (i--) if (this[i] === item) return i;
+ return -1;
+ };
+ return function(item, array) { return indexOf.call(array, item) > -1; };
+ })();
+ '''
+
+ # Shortcuts to speed up the lookup time for native functions.
+ hasProp: 'Object.prototype.hasOwnProperty'
+ slice: 'Array.prototype.slice'
+
+# Tabs are two spaces for pretty printing.
+TAB = ' '
+
+# Trim out all trailing whitespace, so that the generated code plays nice
+# with Git.
+TRAILING_WHITESPACE = /[ \t]+$/gm
+
+IDENTIFIER = /^[$A-Za-z_][$\w]*$/
+NUMBER = /^0x[\da-f]+|^(?:\d+(\.\d+)?|\.\d+)(?:e[+-]?\d+)?$/i
+SIMPLENUM = /^[+-]?\d+$/
+
+# Is a literal value a string?
+IS_STRING = /^['"]/
+
+# Utility Functions
+# -----------------
+
+# Helper for ensuring that utility functions are assigned at the top level.
+utility = (name) ->
+ ref = "__#{name}"
+ Scope.root.assign ref, UTILITIES[name]
+ ref
diff --git a/node_modules/jade/support/coffee-script/src/optparse.coffee b/node_modules/jade/support/coffee-script/src/optparse.coffee
new file mode 100644
index 0000000..5a6c9ee
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/optparse.coffee
@@ -0,0 +1,96 @@
+# A simple **OptionParser** class to parse option flags from the command-line.
+# Use it like so:
+#
+# parser = new OptionParser switches, helpBanner
+# options = parser.parse process.argv
+#
+# The first non-option is considered to be the start of the file (and file
+# option) list, and all subsequent arguments are left unparsed.
+exports.OptionParser = class OptionParser
+
+ # Initialize with a list of valid options, in the form:
+ #
+ # [short-flag, long-flag, description]
+ #
+ # Along with an an optional banner for the usage help.
+ constructor: (rules, banner) ->
+ @banner = banner
+ @rules = buildRules rules
+
+ # Parse the list of arguments, populating an `options` object with all of the
+ # specified options, and returning it. `options.arguments` will be an array
+ # containing the remaning non-option arguments. This is a simpler API than
+ # many option parsers that allow you to attach callback actions for every
+ # flag. Instead, you're responsible for interpreting the options object.
+ parse: (args) ->
+ options = arguments: []
+ args = normalizeArguments args
+ for arg, i in args
+ isOption = !!(arg.match(LONG_FLAG) or arg.match(SHORT_FLAG))
+ matchedRule = no
+ for rule in @rules
+ if rule.shortFlag is arg or rule.longFlag is arg
+ value = if rule.hasArgument then args[i += 1] else true
+ options[rule.name] = if rule.isList then (options[rule.name] or []).concat value else value
+ matchedRule = yes
+ break
+ throw new Error "unrecognized option: #{arg}" if isOption and not matchedRule
+ if not isOption
+ options.arguments = args.slice i
+ break
+ options
+
+ # Return the help text for this **OptionParser**, listing and describing all
+ # of the valid options, for `--help` and such.
+ help: ->
+ lines = ['Available options:']
+ lines.unshift "#{@banner}\n" if @banner
+ for rule in @rules
+ spaces = 15 - rule.longFlag.length
+ spaces = if spaces > 0 then Array(spaces + 1).join(' ') else ''
+ letPart = if rule.shortFlag then rule.shortFlag + ', ' else ' '
+ lines.push ' ' + letPart + rule.longFlag + spaces + rule.description
+ "\n#{ lines.join('\n') }\n"
+
+# Helpers
+# -------
+
+# Regex matchers for option flags.
+LONG_FLAG = /^(--\w[\w\-]+)/
+SHORT_FLAG = /^(-\w)/
+MULTI_FLAG = /^-(\w{2,})/
+OPTIONAL = /\[(\w+(\*?))\]/
+
+# Build and return the list of option rules. If the optional *short-flag* is
+# unspecified, leave it out by padding with `null`.
+buildRules = (rules) ->
+ for tuple in rules
+ tuple.unshift null if tuple.length < 3
+ buildRule tuple...
+
+# Build a rule from a `-o` short flag, a `--output [DIR]` long flag, and the
+# description of what the option does.
+buildRule = (shortFlag, longFlag, description, options) ->
+ match = longFlag.match(OPTIONAL)
+ longFlag = longFlag.match(LONG_FLAG)[1]
+ options or= {}
+ {
+ name: longFlag.substr 2
+ shortFlag: shortFlag
+ longFlag: longFlag
+ description: description
+ hasArgument: !!(match and match[1])
+ isList: !!(match and match[2])
+ }
+
+# Normalize arguments by expanding merged flags into multiple flags. This allows
+# you to have `-wl` be the same as `--watch --lint`.
+normalizeArguments = (args) ->
+ args = args.slice 0
+ result = []
+ for arg in args
+ if match = arg.match MULTI_FLAG
+ result.push '-' + l for l in match[1].split ''
+ else
+ result.push arg
+ result
diff --git a/node_modules/jade/support/coffee-script/src/repl.coffee b/node_modules/jade/support/coffee-script/src/repl.coffee
new file mode 100644
index 0000000..294146b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/repl.coffee
@@ -0,0 +1,35 @@
+# A very simple Read-Eval-Print-Loop. Compiles one line at a time to JavaScript
+# and evaluates it. Good for simple tests, or poking around the **Node.js** API.
+# Using it looks like this:
+#
+# coffee> puts "#{num} bottles of beer" for num in [99..1]
+
+# Require the **coffee-script** module to get access to the compiler.
+CoffeeScript = require './coffee-script'
+helpers = require './helpers'
+readline = require 'readline'
+
+# Start by opening up **stdio**.
+stdio = process.openStdin()
+
+# Quick alias for quitting the REPL.
+helpers.extend global, quit: -> process.exit(0)
+
+# The main REPL function. **run** is called every time a line of code is entered.
+# Attempt to evaluate the command. If there's an exception, print it out instead
+# of exiting.
+run = (buffer) ->
+ try
+ val = CoffeeScript.eval buffer.toString(), bare: on, globals: on, fileName: 'repl'
+ puts inspect val if val isnt undefined
+ catch err
+ puts err.stack or err.toString()
+ repl.prompt()
+
+# Create the REPL by listening to **stdin**.
+repl = readline.createInterface stdio
+repl.setPrompt 'coffee> '
+stdio.on 'data', (buffer) -> repl.write buffer
+repl.on 'close', -> stdio.destroy()
+repl.on 'line', run
+repl.prompt()
diff --git a/node_modules/jade/support/coffee-script/src/rewriter.coffee b/node_modules/jade/support/coffee-script/src/rewriter.coffee
new file mode 100644
index 0000000..5ea0298
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/rewriter.coffee
@@ -0,0 +1,349 @@
+# The CoffeeScript language has a good deal of optional syntax, implicit syntax,
+# and shorthand syntax. This can greatly complicate a grammar and bloat
+# the resulting parse table. Instead of making the parser handle it all, we take
+# a series of passes over the token stream, using this **Rewriter** to convert
+# shorthand into the unambiguous long form, add implicit indentation and
+# parentheses, balance incorrect nestings, and generally clean things up.
+
+# Import the helpers we need.
+{include} = require './helpers'
+
+# The **Rewriter** class is used by the [Lexer](lexer.html), directly against
+# its internal array of tokens.
+class exports.Rewriter
+
+ # Helpful snippet for debugging:
+ # puts (t[0] + '/' + t[1] for t in @tokens).join ' '
+
+ # Rewrite the token stream in multiple passes, one logical filter at
+ # a time. This could certainly be changed into a single pass through the
+ # stream, with a big ol' efficient switch, but it's much nicer to work with
+ # like this. The order of these passes matters -- indentation must be
+ # corrected before implicit parentheses can be wrapped around blocks of code.
+ rewrite: (@tokens) ->
+ @adjustComments()
+ @removeLeadingNewlines()
+ @removeMidExpressionNewlines()
+ @closeOpenCalls()
+ @closeOpenIndexes()
+ @addImplicitIndentation()
+ @tagPostfixConditionals()
+ @addImplicitBraces()
+ @addImplicitParentheses()
+ @ensureBalance BALANCED_PAIRS
+ @rewriteClosingParens()
+ @tokens
+
+ # Rewrite the token stream, looking one token ahead and behind.
+ # Allow the return value of the block to tell us how many tokens to move
+ # forwards (or backwards) in the stream, to make sure we don't miss anything
+ # as tokens are inserted and removed, and the stream changes length under
+ # our feet.
+ scanTokens: (block) ->
+ {tokens} = this
+ i = 0
+ i += block.call this, token, i, tokens while token = tokens[i]
+ true
+
+ detectEnd: (i, condition, action) ->
+ {tokens} = this
+ levels = 0
+ while token = tokens[i]
+ return action.call this, token, i if levels is 0 and condition.call this, token, i
+ return action.call this, token, i - 1 if not token or levels < 0
+ if include EXPRESSION_START, token[0]
+ levels += 1
+ else if include EXPRESSION_END, token[0]
+ levels -= 1
+ i += 1
+ i - 1
+
+ # Massage newlines and indentations so that comments don't have to be
+ # correctly indented, or appear on a line of their own.
+ adjustComments: ->
+ @scanTokens (token, i, tokens) ->
+ return 1 unless token[0] is 'HERECOMMENT'
+ before = tokens[i - 2]
+ prev = tokens[i - 1]
+ post = tokens[i + 1]
+ after = tokens[i + 2]
+ if after?[0] is 'INDENT'
+ tokens.splice i + 2, 1
+ if before?[0] is 'OUTDENT' and post?[0] is 'TERMINATOR'
+ tokens.splice i - 2, 1
+ else
+ tokens.splice i, 0, after
+ else if prev and prev[0] not in ['TERMINATOR', 'INDENT', 'OUTDENT']
+ if post?[0] is 'TERMINATOR' and after?[0] is 'OUTDENT'
+ tokens.splice i + 2, 0, tokens.splice(i, 2)...
+ if tokens[i + 2][0] isnt 'TERMINATOR'
+ tokens.splice i + 2, 0, ['TERMINATOR', '\n', prev[2]]
+ else
+ tokens.splice i, 0, ['TERMINATOR', '\n', prev[2]]
+ return 2
+ 1
+
+ # Leading newlines would introduce an ambiguity in the grammar, so we
+ # dispatch them here.
+ removeLeadingNewlines: ->
+ break for [tag], i in @tokens when tag isnt 'TERMINATOR'
+ @tokens.splice 0, i if i
+
+ # Some blocks occur in the middle of expressions -- when we're expecting
+ # this, remove their trailing newlines.
+ removeMidExpressionNewlines: ->
+ @scanTokens (token, i, tokens) ->
+ return 1 unless token[0] is 'TERMINATOR' and include EXPRESSION_CLOSE, @tag(i + 1)
+ tokens.splice i, 1
+ 0
+
+ # The lexer has tagged the opening parenthesis of a method call. Match it with
+ # its paired close. We have the mis-nested outdent case included here for
+ # calls that close on the same line, just before their outdent.
+ closeOpenCalls: ->
+ condition = (token, i) ->
+ token[0] in [')', 'CALL_END'] or
+ token[0] is 'OUTDENT' and @tag(i - 1) is ')'
+ action = (token, i) ->
+ @tokens[if token[0] is 'OUTDENT' then i - 1 else i][0] = 'CALL_END'
+ @scanTokens (token, i) ->
+ @detectEnd i + 1, condition, action if token[0] is 'CALL_START'
+ 1
+
+ # The lexer has tagged the opening parenthesis of an indexing operation call.
+ # Match it with its paired close.
+ closeOpenIndexes: ->
+ condition = (token, i) -> token[0] in [']', 'INDEX_END']
+ action = (token, i) -> token[0] = 'INDEX_END'
+ @scanTokens (token, i) ->
+ @detectEnd i + 1, condition, action if token[0] is 'INDEX_START'
+ 1
+
+ # Object literals may be written with implicit braces, for simple cases.
+ # Insert the missing braces here, so that the parser doesn't have to.
+ addImplicitBraces: ->
+ stack = []
+ condition = (token, i) ->
+ return false if 'HERECOMMENT' in [@tag(i + 1), @tag(i - 1)]
+ [one, two, three] = @tokens.slice i + 1, i + 4
+ [tag] = token
+ tag in ['TERMINATOR', 'OUTDENT'] and not (two?[0] is ':' or one?[0] is '@' and three?[0] is ':') or
+ tag is ',' and one?[0] not in ['IDENTIFIER', 'NUMBER', 'STRING', '@', 'TERMINATOR', 'OUTDENT']
+ action = (token, i) -> @tokens.splice i, 0, ['}', '}', token[2]]
+ @scanTokens (token, i, tokens) ->
+ if include EXPRESSION_START, tag = token[0]
+ stack.push if tag is 'INDENT' and @tag(i - 1) is '{' then '{' else tag
+ return 1
+ if include EXPRESSION_END, tag
+ stack.pop()
+ return 1
+ return 1 unless tag is ':' and stack[stack.length - 1] isnt '{'
+ stack.push '{'
+ idx = if @tag(i - 2) is '@' then i - 2 else i - 1
+ idx -= 2 if @tag(idx - 2) is 'HERECOMMENT'
+ tok = ['{', '{', token[2]]
+ tok.generated = yes
+ tokens.splice idx, 0, tok
+ @detectEnd i + 2, condition, action
+ 2
+
+ # Methods may be optionally called without parentheses, for simple cases.
+ # Insert the implicit parentheses here, so that the parser doesn't have to
+ # deal with them.
+ addImplicitParentheses: ->
+ classLine = no
+ action = (token, i) ->
+ idx = if token[0] is 'OUTDENT' then i + 1 else i
+ @tokens.splice idx, 0, ['CALL_END', ')', token[2]]
+ @scanTokens (token, i, tokens) ->
+ tag = token[0]
+ classLine = yes if tag is 'CLASS'
+ prev = tokens[i - 1]
+ next = tokens[i + 1]
+ callObject = not classLine and tag is 'INDENT' and
+ next and next.generated and next[0] is '{' and
+ prev and include(IMPLICIT_FUNC, prev[0])
+ seenSingle = no
+ classLine = no if include LINEBREAKS, tag
+ token.call = yes if prev and not prev.spaced and tag is '?'
+ return 1 unless callObject or
+ prev?.spaced and (prev.call or include(IMPLICIT_FUNC, prev[0])) and
+ (include(IMPLICIT_CALL, tag) or include(IMPLICIT_UNSPACED_CALL, tag) and not token.spaced)
+ tokens.splice i, 0, ['CALL_START', '(', token[2]]
+ @detectEnd i + (if callObject then 2 else 1), (token, i) ->
+ return yes if not seenSingle and token.fromThen
+ [tag] = token
+ seenSingle = yes if tag in ['IF', 'ELSE', 'UNLESS', '->', '=>']
+ return yes if tag is 'PROPERTY_ACCESS' and @tag(i - 1) is 'OUTDENT'
+ not token.generated and @tag(i - 1) isnt ',' and include(IMPLICIT_END, tag) and
+ (tag isnt 'INDENT' or
+ (@tag(i - 2) isnt 'CLASS' and not include(IMPLICIT_BLOCK, @tag(i - 1)) and
+ not ((post = @tokens[i + 1]) and post.generated and post[0] is '{')))
+ , action
+ prev[0] = 'FUNC_EXIST' if prev[0] is '?'
+ 2
+
+ # Because our grammar is LALR(1), it can't handle some single-line
+ # expressions that lack ending delimiters. The **Rewriter** adds the implicit
+ # blocks, so it doesn't need to. ')' can close a single-line block,
+ # but we need to make sure it's balanced.
+ addImplicitIndentation: ->
+ @scanTokens (token, i, tokens) ->
+ [tag] = token
+ if tag is 'ELSE' and @tag(i - 1) isnt 'OUTDENT'
+ tokens.splice i, 0, @indentation(token)...
+ return 2
+ if tag is 'CATCH' and @tag(i + 2) in ['TERMINATOR', 'FINALLY']
+ tokens.splice i + 2, 0, @indentation(token)...
+ return 4
+ if include(SINGLE_LINERS, tag) and @tag(i + 1) isnt 'INDENT' and
+ not (tag is 'ELSE' and @tag(i + 1) is 'IF')
+ starter = tag
+ [indent, outdent] = @indentation token
+ indent.fromThen = true if starter is 'THEN'
+ indent.generated = outdent.generated = true
+ tokens.splice i + 1, 0, indent
+ condition = (token, i) ->
+ token[1] isnt ';' and include(SINGLE_CLOSERS, token[0]) and
+ not (token[0] is 'ELSE' and starter not in ['IF', 'THEN'])
+ action = (token, i) ->
+ @tokens.splice (if @tag(i - 1) is ',' then i - 1 else i), 0, outdent
+ @detectEnd i + 2, condition, action
+ tokens.splice i, 1 if tag is 'THEN'
+ return 1
+ return 1
+
+ # Tag postfix conditionals as such, so that we can parse them with a
+ # different precedence.
+ tagPostfixConditionals: ->
+ condition = (token, i) -> token[0] in ['TERMINATOR', 'INDENT']
+ @scanTokens (token, i) ->
+ return 1 unless token[0] in ['IF', 'UNLESS']
+ original = token
+ @detectEnd i + 1, condition, (token, i) ->
+ original[0] = 'POST_' + original[0] if token[0] isnt 'INDENT'
+ 1
+
+ # Ensure that all listed pairs of tokens are correctly balanced throughout
+ # the course of the token stream.
+ ensureBalance: (pairs) ->
+ levels = {}
+ openLine = {}
+ @scanTokens (token, i) ->
+ [tag] = token
+ for [open, close] in pairs
+ levels[open] |= 0
+ if tag is open
+ openLine[open] = token[2] if levels[open] is 0
+ levels[open] += 1
+ else if tag is close
+ levels[open] -= 1
+ throw Error "too many #{token[1]} on line #{token[2] + 1}" if levels[open] < 0
+ 1
+ unclosed = key for all key, value of levels when value > 0
+ if unclosed.length
+ throw Error "unclosed #{ open = unclosed[0] } on line #{openLine[open] + 1}"
+
+ # We'd like to support syntax like this:
+ #
+ # el.click((event) ->
+ # el.hide())
+ #
+ # In order to accomplish this, move outdents that follow closing parens
+ # inwards, safely. The steps to accomplish this are:
+ #
+ # 1. Check that all paired tokens are balanced and in order.
+ # 2. Rewrite the stream with a stack: if you see an `EXPRESSION_START`, add it
+ # to the stack. If you see an `EXPRESSION_END`, pop the stack and replace
+ # it with the inverse of what we've just popped.
+ # 3. Keep track of "debt" for tokens that we manufacture, to make sure we end
+ # up balanced in the end.
+ # 4. Be careful not to alter array or parentheses delimiters with overzealous
+ # rewriting.
+ rewriteClosingParens: ->
+ stack = []
+ debt = {}
+ (debt[key] = 0) for all key of INVERSES
+ @scanTokens (token, i, tokens) ->
+ if include EXPRESSION_START, tag = token[0]
+ stack.push token
+ return 1
+ return 1 unless include EXPRESSION_END, tag
+ if debt[inv = INVERSES[tag]] > 0
+ debt[inv] -= 1
+ tokens.splice i, 1
+ return 0
+ match = stack.pop()
+ mtag = match[0]
+ oppos = INVERSES[mtag]
+ return 1 if tag is oppos
+ debt[mtag] += 1
+ val = [oppos, if mtag is 'INDENT' then match[1] else oppos]
+ if @tag(i + 2) is mtag
+ tokens.splice i + 3, 0, val
+ stack.push match
+ else
+ tokens.splice i, 0, val
+ 1
+
+ # Generate the indentation tokens, based on another token on the same line.
+ indentation: (token) ->
+ [['INDENT', 2, token[2]], ['OUTDENT', 2, token[2]]]
+
+ # Look up a tag by token index.
+ tag: (i) -> @tokens[i]?[0]
+
+# Constants
+# ---------
+
+# List of the token pairs that must be balanced.
+BALANCED_PAIRS = [
+ ['(', ')']
+ ['[', ']']
+ ['{', '}']
+ ['INDENT', 'OUTDENT'],
+ ['CALL_START', 'CALL_END']
+ ['PARAM_START', 'PARAM_END']
+ ['INDEX_START', 'INDEX_END']
+]
+
+# The inverse mappings of `BALANCED_PAIRS` we're trying to fix up, so we can
+# look things up from either end.
+INVERSES = {}
+
+# The tokens that signal the start/end of a balanced pair.
+EXPRESSION_START = []
+EXPRESSION_END = []
+
+for [left, rite] in BALANCED_PAIRS
+ EXPRESSION_START.push INVERSES[rite] = left
+ EXPRESSION_END .push INVERSES[left] = rite
+
+# Tokens that indicate the close of a clause of an expression.
+EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat EXPRESSION_END
+
+# Tokens that, if followed by an `IMPLICIT_CALL`, indicate a function invocation.
+IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']
+
+# If preceded by an `IMPLICIT_FUNC`, indicates a function invocation.
+IMPLICIT_CALL = [
+ 'IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS'
+ 'IF', 'UNLESS', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'UNARY',
+ '@', '->', '=>', '[', '(', '{', '--', '++'
+]
+
+IMPLICIT_UNSPACED_CALL = ['+', '-']
+
+# Tokens indicating that the implicit call must enclose a block of expressions.
+IMPLICIT_BLOCK = ['->', '=>', '{', '[', ',']
+
+# Tokens that always mark the end of an implicit call for single-liners.
+IMPLICIT_END = ['POST_IF', 'POST_UNLESS', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'TERMINATOR', 'INDENT']
+
+# Single-line flavors of block expressions that have unclosed endings.
+# The grammar can't disambiguate them, so we insert the implicit indentation.
+SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']
+SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']
+
+# Tokens that end a line.
+LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT']
diff --git a/node_modules/jade/support/coffee-script/src/scope.coffee b/node_modules/jade/support/coffee-script/src/scope.coffee
new file mode 100644
index 0000000..3a1aad3
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/src/scope.coffee
@@ -0,0 +1,109 @@
+# The **Scope** class regulates lexical scoping within CoffeeScript. As you
+# generate code, you create a tree of scopes in the same shape as the nested
+# function bodies. Each scope knows about the variables declared within it,
+# and has a reference to its parent enclosing scope. In this way, we know which
+# variables are new and need to be declared with `var`, and which are shared
+# with the outside.
+
+# Import the helpers we plan to use.
+{extend, last} = require './helpers'
+
+exports.Scope = class Scope
+
+ # The top-level **Scope** object.
+ @root: null
+
+ # Initialize a scope with its parent, for lookups up the chain,
+ # as well as a reference to the **Expressions** node is belongs to, which is
+ # where it should declare its variables, and a reference to the function that
+ # it wraps.
+ constructor: (@parent, @expressions, @method) ->
+ @variables = {'arguments'}
+ if @parent
+ @garbage = @parent.garbage
+ else
+ @garbage = []
+ Scope.root = this
+
+ # Create a new garbage level
+ startLevel: ->
+ @garbage.push []
+
+ # Return to the previous garbage level and erase referenced temporary
+ # variables in current level from scope.
+ endLevel: ->
+ vars = @variables
+ (vars[name] = 'reuse') for name in @garbage.pop() when vars[name] is 'var'
+
+ # Look up a variable name in lexical scope, and declare it if it does not
+ # already exist.
+ find: (name, options) ->
+ return true if @check name, options
+ @variables[name] = 'var'
+ false
+
+ # Test variables and return true the first time fn(v, k) returns true
+ any: (fn) ->
+ for v, k of @variables when fn(v, k)
+ return true
+ return false
+
+ # Reserve a variable name as originating from a function parameter for this
+ # scope. No `var` required for internal references.
+ parameter: (name) ->
+ @variables[name] = 'param'
+
+ # Just check to see if a variable has already been declared, without reserving,
+ # walks up to the root scope.
+ check: (name, options) ->
+ immediate = Object::hasOwnProperty.call @variables, name
+ return immediate if immediate or options?.immediate
+ !!@parent?.check name
+
+ # Generate a temporary variable name at the given index.
+ temporary: (type, index) ->
+ if type.length > 1
+ '_' + type + if index > 1 then index else ''
+ else
+ '_' + (index + parseInt type, 36).toString(36).replace /\d/g, 'a'
+
+ # If we need to store an intermediate result, find an available name for a
+ # compiler-generated variable. `_var`, `_var2`, and so on...
+ freeVariable: (type) ->
+ index = 0
+ index++ while @check(temp = @temporary type, index) and @variables[temp] isnt 'reuse'
+ @variables[temp] = 'var'
+ last(@garbage).push temp if @garbage.length
+ temp
+
+ # Ensure that an assignment is made at the top of this scope
+ # (or at the top-level scope, if requested).
+ assign: (name, value) ->
+ @variables[name] = value: value, assigned: true
+
+ # Does this scope reference any variables that need to be declared in the
+ # given function body?
+ hasDeclarations: (body) ->
+ body is @expressions and @any (k, val) -> val in ['var', 'reuse']
+
+ # Does this scope reference any assignments that need to be declared at the
+ # top of the given function body?
+ hasAssignments: (body) ->
+ body is @expressions and @any (k, val) -> val.assigned
+
+ # Return the list of variables first declared in this scope.
+ declaredVariables: ->
+ (key for key, val of @variables when val in ['var', 'reuse']).sort()
+
+ # Return the list of assignments that are supposed to be made at the top
+ # of this scope.
+ assignedVariables: ->
+ "#{key} = #{val.value}" for key, val of @variables when val.assigned
+
+ # Compile the JavaScript for all of the variable declarations in this scope.
+ compiledDeclarations: ->
+ @declaredVariables().join ', '
+
+ # Compile the JavaScript forall of the variable assignments in this scope.
+ compiledAssignments: ->
+ @assignedVariables().join ', '
diff --git a/node_modules/jade/support/coffee-script/test/test.html b/node_modules/jade/support/coffee-script/test/test.html
new file mode 100644
index 0000000..fff780c
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test.html
@@ -0,0 +1,95 @@
+
+
+
+
+ CoffeeScript Test Suite
+
+
+
+
+
+
CoffeeScript Test Suite
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/test/test_arguments.coffee b/node_modules/jade/support/coffee-script/test/test_arguments.coffee
new file mode 100644
index 0000000..a45044b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_arguments.coffee
@@ -0,0 +1,43 @@
+area = (x, y, x1, y1) ->
+ (x - x1) * (x - y1)
+
+x = y = 10
+x1 = y1 = 20
+
+ok area(x, y, x1, y1) is 100
+
+# ok(area(x, y,
+# x1, y1) is 100)
+
+ok(area(
+ x
+ y
+ x1
+ y1
+) is 100)
+
+
+sumOfArgs = ->
+ sum = 0
+ sum += val for val in arguments
+ sum
+
+ok sumOfArgs(1, 2, 3, 4, 5) is 15
+
+
+((@arg) ->).call context = {}, 1
+ok context.arg is 1
+
+((splat..., @arg) ->).call context, 1, 2, 3
+ok context.arg is 3
+
+((@arg...) ->).call context, 1, 2, 3
+ok context.arg.join ' ' is '1 2 3'
+
+class Klass
+ constructor: (@one, @two) ->
+
+obj = new Klass 1, 2
+
+ok obj.one is 1
+ok obj.two is 2
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/test/test_assignment.coffee b/node_modules/jade/support/coffee-script/test/test_assignment.coffee
new file mode 100644
index 0000000..00d3e10
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_assignment.coffee
@@ -0,0 +1,33 @@
+# Can assign the result of a try/catch block.
+result = try
+ nonexistent * missing
+catch error
+ true
+
+result2 = try nonexistent * missing catch error then true
+
+ok result is true and result2 is true
+
+
+# Can assign a conditional statement.
+getX = -> 10
+
+if x = getX() then 100
+
+ok x is 10
+
+x = if getX() then 100
+
+ok x is 100
+
+
+# This-assignment.
+tester = ->
+ @example = -> 'example function'
+ this
+
+ok tester().example() is 'example function'
+
+
+try throw CoffeeScript.tokens 'in = 1'
+catch e then eq e.message, 'Reserved word "in" on line 1 can\'t be assigned'
diff --git a/node_modules/jade/support/coffee-script/test/test_break.coffee b/node_modules/jade/support/coffee-script/test/test_break.coffee
new file mode 100644
index 0000000..7a6219f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_break.coffee
@@ -0,0 +1,28 @@
+# Test with break at the top level.
+array = [1,2,3]
+callWithLambda = (l) -> null
+for i in array
+ result = callWithLambda(->)
+ if i == 2
+ puts "i = 2"
+ else
+ break
+
+ok result is null
+
+
+# Test with break *not* at the top level.
+someFunc = (input) ->
+ takesLambda = (l) -> null
+ for i in [1,2]
+ result = takesLambda(->)
+ if input == 1
+ return 1
+ else
+ break
+
+ return 2
+
+ok someFunc(1) is 1
+ok someFunc(2) is 2
+
diff --git a/node_modules/jade/support/coffee-script/test/test_chaining.coffee b/node_modules/jade/support/coffee-script/test/test_chaining.coffee
new file mode 100644
index 0000000..7154a83
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_chaining.coffee
@@ -0,0 +1,56 @@
+# Basic chained function calls.
+identityWrap = (x) ->
+ -> x
+
+result = identityWrap(identityWrap(true))()()
+
+ok result
+
+
+# Chained accesses split on period/newline, backwards and forwards.
+str = 'god'
+
+result = str.
+ split('').
+ reverse().
+ reverse().
+ reverse()
+
+ok result.join('') is 'dog'
+
+result = str
+ .split('')
+ .reverse()
+ .reverse()
+ .reverse()
+
+ok result.join('') is 'dog'
+
+
+# Newline suppression for operators.
+six =
+ 1 +
+ 2 +
+ 3
+
+ok six is 6
+
+
+# Ensure that indented array literals don't trigger whitespace rewriting.
+func = () ->
+ ok arguments.length is 1
+
+func(
+ [[[[[],
+ []],
+ [[]]]],
+ []])
+
+id = (x) -> x
+
+greeting = id(
+ """
+ Hello
+ """)
+
+ok greeting is "Hello"
diff --git a/node_modules/jade/support/coffee-script/test/test_classes.coffee b/node_modules/jade/support/coffee-script/test/test_classes.coffee
new file mode 100644
index 0000000..ea1df23
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_classes.coffee
@@ -0,0 +1,291 @@
+# Test classes with a four-level inheritance chain.
+class Base
+ func: (string) ->
+ "zero/#{string}"
+
+ @static: (string) ->
+ "static/#{string}"
+
+class FirstChild extends Base
+ func: (string) ->
+ super('one/') + string
+
+SecondChild = class extends FirstChild
+ func: (string) ->
+ super('two/') + string
+
+thirdCtor = ->
+ @array = [1, 2, 3]
+
+class ThirdChild extends SecondChild
+ constructor: thirdCtor
+
+ # Gratuitous comment for testing.
+ func: (string) ->
+ super('three/') + string
+
+result = (new ThirdChild).func 'four'
+
+ok result is 'zero/one/two/three/four'
+ok Base.static('word') is 'static/word'
+
+FirstChild::func = (string) ->
+ super('one/').length + string
+
+result = (new ThirdChild).func 'four'
+
+ok result is '9two/three/four'
+
+ok (new ThirdChild).array.join(' ') is '1 2 3'
+
+
+class TopClass
+ constructor: (arg) ->
+ @prop = 'top-' + arg
+
+class SuperClass extends TopClass
+ constructor: (arg) ->
+ super 'super-' + arg
+
+class SubClass extends SuperClass
+ constructor: ->
+ super 'sub'
+
+ok (new SubClass).prop is 'top-super-sub'
+
+
+class OneClass
+ @new: 'new'
+ function: 'function'
+ constructor: (name) -> @name = name
+
+class TwoClass extends OneClass
+
+Function.prototype.new = -> new this arguments...
+
+ok (TwoClass.new('three')).name is 'three'
+ok (new OneClass).function is 'function'
+ok OneClass.new is 'new'
+
+delete Function.prototype.new
+
+
+# And now the same tests, but written in the manual style:
+Base = ->
+Base::func = (string) ->
+ 'zero/' + string
+Base::['func-func'] = (string) ->
+ "dynamic-#{string}"
+
+FirstChild = ->
+FirstChild extends Base
+FirstChild::func = (string) ->
+ super('one/') + string
+
+SecondChild = ->
+SecondChild extends FirstChild
+SecondChild::func = (string) ->
+ super('two/') + string
+
+ThirdChild = ->
+ @array = [1, 2, 3]
+ this
+ThirdChild extends SecondChild
+ThirdChild::func = (string) ->
+ super('three/') + string
+
+result = (new ThirdChild).func 'four'
+
+ok result is 'zero/one/two/three/four'
+
+ok (new ThirdChild)['func-func']('thing') is 'dynamic-thing'
+
+
+TopClass = (arg) ->
+ @prop = 'top-' + arg
+ this
+
+SuperClass = (arg) ->
+ super 'super-' + arg
+ this
+
+SubClass = ->
+ super 'sub'
+ this
+
+SuperClass extends TopClass
+SubClass extends SuperClass
+
+ok (new SubClass).prop is 'top-super-sub'
+
+
+# '@' referring to the current instance, and not being coerced into a call.
+class ClassName
+ amI: ->
+ @ instanceof ClassName
+
+obj = new ClassName
+ok obj.amI()
+
+
+# super() calls in constructors of classes that are defined as object properties.
+class Hive
+ constructor: (name) -> @name = name
+
+class Hive.Bee extends Hive
+ constructor: (name) -> super
+
+maya = new Hive.Bee 'Maya'
+ok maya.name is 'Maya'
+
+
+# Class with JS-keyword properties.
+class Class
+ class: 'class'
+ name: -> @class
+
+instance = new Class
+ok instance.class is 'class'
+ok instance.name() is 'class'
+
+
+# Classes with methods that are pre-bound to the instance.
+# ... or statically, to the class.
+class Dog
+
+ constructor: (name) ->
+ @name = name
+
+ bark: =>
+ "#{@name} woofs!"
+
+ @static: =>
+ new this('Dog')
+
+spark = new Dog('Spark')
+fido = new Dog('Fido')
+fido.bark = spark.bark
+
+ok fido.bark() is 'Spark woofs!'
+
+obj = func: Dog.static
+
+ok obj.func().name is 'Dog'
+
+
+# Testing a bound function in a bound function.
+class Mini
+ num: 10
+ generate: =>
+ for i in [1..3]
+ =>
+ @num
+
+m = new Mini
+ok (func() for func in m.generate()).join(' ') is '10 10 10'
+
+
+# Testing a contructor called with varargs.
+class Connection
+ constructor: (one, two, three) ->
+ [@one, @two, @three] = [one, two, three]
+
+ out: ->
+ "#{@one}-#{@two}-#{@three}"
+
+list = [3, 2, 1]
+conn = new Connection list...
+ok conn instanceof Connection
+ok conn.out() is '3-2-1'
+
+
+# Test calling super and passing along all arguments.
+class Parent
+ method: (args...) -> @args = args
+
+class Child extends Parent
+ method: -> super
+
+c = new Child
+c.method 1, 2, 3, 4
+ok c.args.join(' ') is '1 2 3 4'
+
+
+# Test `extended` callback.
+class Base
+ @extended: (subclass) ->
+ for key, value of @
+ subclass[key] = value
+
+class Element extends Base
+ @fromHTML: (html) ->
+ node = "..."
+ new @(node)
+
+ constructor: (node) ->
+ @node = node
+
+ok Element.extended is Base.extended
+ok Element.__super__ is Base.prototype
+
+class MyElement extends Element
+
+ok MyElement.extended is Base.extended
+ok MyElement.fromHTML is Element.fromHTML
+ok MyElement.__super__ is Element.prototype
+
+
+# Test classes wrapped in decorators.
+func = (klass) ->
+ klass::prop = 'value'
+ klass
+
+func class Test
+ prop2: 'value2'
+
+ok (new Test).prop is 'value'
+ok (new Test).prop2 is 'value2'
+
+
+# Test anonymous classes.
+obj =
+ klass: class
+ method: -> 'value'
+
+instance = new obj.klass
+ok instance.method() is 'value'
+
+
+# Implicit objects as static properties.
+class Static
+ @static:
+ one: 1
+ two: 2
+
+ok Static.static.one is 1
+ok Static.static.two is 2
+
+
+# Nothing classes.
+c = class
+ok c instanceof Function
+
+
+# Classes with value'd constructors.
+counter = 0
+classMaker = ->
+ counter += 1
+ inner = counter
+ ->
+ @value = inner
+
+class One
+ constructor: classMaker()
+
+class Two
+ constructor: classMaker()
+
+ok (new One).value is 1
+ok (new Two).value is 2
+ok (new One).value is 1
+ok (new Two).value is 2
diff --git a/node_modules/jade/support/coffee-script/test/test_comments.coffee b/node_modules/jade/support/coffee-script/test/test_comments.coffee
new file mode 100644
index 0000000..7743e1b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_comments.coffee
@@ -0,0 +1,166 @@
+# comment before a ...
+
+###
+... block comment.
+###
+
+
+ # comment
+func = ->
+# comment
+ false
+ false # comment
+ false
+
+# comment
+ true
+
+switch 'string'
+ # comment
+ when false then something()
+ # comment
+ when null
+ somethingElse()
+
+->
+ code()
+ # comment
+
+ok func()
+
+func
+func
+# Line3
+
+obj = {
+# comment
+ # comment
+ # comment
+ one: 1
+# comment
+ two: 2
+ # comment
+}
+
+result = if true # comment
+ false
+
+ok not result
+
+result = if false
+ false
+else # comment
+ 45
+
+ok result is 45
+
+
+test =
+ 'test ' +
+ 'test ' + # comment
+ 'test'
+
+ok test is 'test test test'
+
+###
+ This is a here-comment.
+ Kind of like a heredoc.
+###
+
+func = ->
+ ###
+ Another block comment.
+ ###
+ code
+
+func = ->
+ one = ->
+ two = ->
+ three = ->
+ ###
+ block.
+ ###
+ four = ->
+
+fn1 = ->
+ oneLevel = null
+###
+This isn't fine.
+###
+
+ok ok
+
+obj = {
+ a: 'b'
+ ###
+ comment
+ ###
+ c: 'd'
+}
+
+arr = [
+ 1, 2, 3,
+ ###
+ four
+ ###
+ 5, 6, 7
+]
+
+# Spaced comments in if / elses.
+result = if false
+ 1
+
+# comment
+else if false
+ 2
+
+# comment
+else
+ 3
+
+ok result is 3
+
+
+result = switch 'z'
+ when 'z' then 7
+# comment
+ok result is 7
+
+
+# Trailing-line comment before an outdent.
+func = ->
+ if true
+ true # comment
+ 7
+
+ok func() is 7
+
+
+# Trailing herecomment in a function.
+fn = ->
+ code
+ ###
+ debug code commented
+ ###
+
+fn2 = ->
+
+
+class A
+ b: ->
+
+ ###
+ Comment
+ ###
+ c: ->
+
+ok A.prototype.c instanceof Function
+
+class A
+ ###
+ Comment
+ ###
+ b: ->
+ c: ->
+
+ok A.prototype.b instanceof Function
diff --git a/node_modules/jade/support/coffee-script/test/test_compilation.coffee b/node_modules/jade/support/coffee-script/test/test_compilation.coffee
new file mode 100644
index 0000000..ad8c65b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_compilation.coffee
@@ -0,0 +1,11 @@
+# Ensure that carriage returns don't break compilation on Windows.
+eq CoffeeScript.compile('one\r\ntwo', bare: on), 'one;\ntwo;'
+
+# `globals: on` removes `var`s
+eq CoffeeScript.compile('x = y', bare: on, globals: on), 'x = y;'
+
+ok 'passed' is CoffeeScript.eval '"passed"', bare: on, fileName: 'test'
+
+#750
+try ok not CoffeeScript.nodes 'f(->'
+catch e then eq e.message, 'unclosed CALL_START on line 1'
diff --git a/node_modules/jade/support/coffee-script/test/test_compound_assignment.coffee b/node_modules/jade/support/coffee-script/test/test_compound_assignment.coffee
new file mode 100644
index 0000000..cc2fe58
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_compound_assignment.coffee
@@ -0,0 +1,26 @@
+num = 10
+num -= 5
+eq num, 5
+
+num *= 10
+eq num, 50
+
+num /= 10
+eq num, 5
+
+num %= 3
+eq num, 2
+
+val = false
+val ||= 'value'
+val ||= 'eulav'
+eq val, 'value'
+
+val &&= 'rehto'
+val &&= 'other'
+eq val, 'other'
+
+val = null
+val ?= 'value'
+val ?= 'eulav'
+eq val, 'value'
diff --git a/node_modules/jade/support/coffee-script/test/test_comprehensions.coffee b/node_modules/jade/support/coffee-script/test/test_comprehensions.coffee
new file mode 100644
index 0000000..2aff0bf
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_comprehensions.coffee
@@ -0,0 +1,172 @@
+# Basic array comprehensions.
+nums = n * n for n in [1, 2, 3] when n % 2 isnt 0
+results = n * 2 for n in nums
+
+ok results.join(',') is '2,18'
+
+
+# Basic object comprehensions.
+obj = {one: 1, two: 2, three: 3}
+names = prop + '!' for prop of obj
+odds = prop + '!' for prop, value of obj when value % 2 isnt 0
+
+ok names.join(' ') is "one! two! three!"
+ok odds.join(' ') is "one! three!"
+
+
+# Basic range comprehensions.
+nums = i * 3 for i in [1..3]
+
+negs = x for x in [-20..-5*2]
+negs = negs[0..2]
+
+result = nums.concat(negs).join(', ')
+
+ok result is '3, 6, 9, -20, -19, -18'
+ok i is 3
+ok x is -10
+
+
+# With range comprehensions, you can loop in steps.
+results = x for x in [0...15] by 5
+ok results.join(' ') is '0 5 10'
+
+results = x for x in [0..100] by 10
+ok results.join(' ') is '0 10 20 30 40 50 60 70 80 90 100'
+
+
+# And can loop downwards, with a negative step.
+results = x for x in [5..1]
+
+ok results.join(' ') is '5 4 3 2 1'
+ok results.join(' ') is [(10-5)..(-2+3)].join(' ')
+
+results = x for x in [10..1]
+ok results.join(' ') is [10..1].join(' ')
+
+results = x for x in [10...0] by -2
+ok results.join(' ') is [10, 8, 6, 4, 2].join(' ')
+
+
+# Multiline array comprehension with filter.
+evens = for num in [1, 2, 3, 4, 5, 6] when num % 2 is 0
+ num *= -1
+ num -= 2
+ num * -1
+
+ok evens.join(', ') is '4, 6, 8'
+
+
+# The in operator still works, standalone.
+ok 2 of evens
+
+
+# Ensure that the closure wrapper preserves local variables.
+obj = {}
+
+for method in ['one', 'two', 'three']
+ obj[method] = ->
+ "I'm " + method
+
+ok obj.one() is "I'm one"
+ok obj.two() is "I'm two"
+ok obj.three() is "I'm three"
+
+i = 0
+for i in [1..3]
+ -> 'func'
+ break if false
+ok i is 3
+
+
+# Ensure that local variables are closed over for range comprehensions.
+funcs = for i in [1..3]
+ -> -i
+
+ok (func() for func in funcs).join(' ') is '-1 -2 -3'
+ok i is 3
+
+
+# Ensure that closing over local variables doesn't break scoping laws.
+for i in [0]
+ count = 0
+ i = 50
+ ->
+ok count is 0
+ok i is 50
+
+
+# Even when referenced in the filter.
+list = ['one', 'two', 'three']
+
+methods = for num, i in list when num isnt 'two' and i isnt 1
+ -> num + ' ' + i
+
+ok methods.length is 2
+ok methods[0]() is 'one 0'
+ok methods[1]() is 'three 2'
+
+
+# Naked ranges are expanded into arrays.
+array = [0..10]
+ok(num % 2 is 0 for num in array by 2)
+
+
+# Nested comprehensions.
+multiLiner =
+ for x in [3..5]
+ for y in [3..5]
+ [x, y]
+
+singleLiner =
+ [x, y] for y in [3..5] for x in [3..5]
+
+ok multiLiner.length is singleLiner.length
+ok 5 is multiLiner[2][2][1]
+ok 5 is singleLiner[2][2][1]
+
+
+# Comprehensions within parentheses.
+result = null
+store = (obj) -> result = obj
+store (x * 2 for x in [3, 2, 1])
+
+ok result.join(' ') is '6 4 2'
+
+
+# Closure-wrapped comprehensions that refer to the "arguments" object.
+expr = ->
+ result = item * item for item in arguments
+
+ok expr(2, 4, 8).join(' ') is '4 16 64'
+
+
+# Fast object comprehensions over all properties, including prototypal ones.
+class Cat
+ constructor: -> @name = 'Whiskers'
+ breed: 'tabby'
+ hair: 'cream'
+
+whiskers = new Cat
+own = value for key, value of whiskers
+all = value for all key, value of whiskers
+
+ok own.join(' ') is 'Whiskers'
+ok all.sort().join(' ') is 'Whiskers cream tabby'
+
+
+# Optimized range comprehensions.
+exxes = 'x' for [0...10]
+ok exxes.join(' ') is 'x x x x x x x x x x'
+
+
+# Comprehensions safely redeclare parameters if they're not present in closest
+# scope.
+rule = (x) -> x
+
+learn = ->
+ rule for rule in [1, 2, 3]
+
+ok learn().join(' ') is '1 2 3'
+
+ok rule(101) is 101
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/test/test_existence.coffee b/node_modules/jade/support/coffee-script/test/test_existence.coffee
new file mode 100644
index 0000000..e0687bf
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_existence.coffee
@@ -0,0 +1,145 @@
+ok(if mySpecialVariable? then false else true)
+
+mySpecialVariable = false
+
+ok(if mySpecialVariable? then true else false)
+
+
+# Existential assignment.
+a = 5
+a = null
+a ?= 10
+b ?= 10
+
+ok a is 10 and b is 10
+
+
+# The existential operator.
+z = null
+x = z ? "EX"
+ok z is null and x is "EX"
+
+i = 9
+func = -> i += 1
+result = func() ? 101
+ok result is 10
+
+# Only evaluate once.
+counter = 0
+getNextNode = ->
+ throw "up" if counter
+ counter++
+
+ok(if getNextNode()? then true else false)
+
+
+# Existence chains, soaking up undefined properties:
+obj =
+ prop: "hello"
+
+eq obj?.prop, "hello"
+eq obj?['prop'], "hello"
+eq obj.prop?.length, 5
+eq obj?.prop?['length'], 5
+eq obj?.prop?.non?.existent?.property, undefined
+
+
+# Soaks and caches method calls as well.
+arr = ["--", "----"]
+
+eq arr.pop()?.length, 4
+eq arr.pop()?.length, 2
+eq arr.pop()?.length, undefined
+eq arr.pop()?.length?.non?.existent()?.property, undefined
+
+
+# Soaks method calls safely.
+value = null
+eq value?.toString().toLowerCase(), undefined
+
+value = 10
+eq value?.toString().toLowerCase(), '10'
+
+eq 0.nothing?.property() or 101, 101
+
+counter = 0
+func = ->
+ counter += 1
+ 'prop'
+obj =
+ prop: -> this
+ value: 25
+
+ok obj[func()]()[func()]()[func()]()?.value is 25
+ok counter is 3
+
+
+ident = (obj) -> obj
+eq ident(non?.existent().method()), undefined, 'soaks inner values'
+
+
+# Soaks constructor invocations.
+a = 0
+class Foo
+ constructor: -> a += 1
+ bar: "bat"
+
+ok (new Foo())?.bar is 'bat'
+ok a is 1
+
+
+ok not value?.property?, 'safely checks existence on soaks'
+
+
+eq nothing?.value, undefined, 'safely calls values off of non-existent variables'
+eq !nothing?.value and 1, 1, 'corresponding operators work as expected'
+
+
+# Assign to the result of an exsitential operation with a minus.
+x = null ? - 1
+ok x is - 1
+
+
+# Things that compile to ternaries should force parentheses, like operators do.
+duration = if options?.animated then 150 else 0
+ok duration is 0
+
+
+# Function soaks.
+plus1 = (x) -> x + 1
+count = 0
+obj = {
+ counter: -> count += 1; this
+ returnThis: -> this
+}
+
+eq plus1?(41), 42
+eq (plus1? 41), 42
+eq plus2?(41), undefined
+eq (plus2? 41), undefined
+eq obj.returnThis?(), obj
+eq obj.returnSelf?(), undefined
+eq obj.returnThis?().flag = on, on
+eq obj.returnSelf?().flag = on, undefined
+eq obj.counter().counter().returnThis?(), obj
+eq count, 2
+
+maybe_close = (f, arg) -> if typeof f is 'function' then () -> f(arg) else -1
+
+eq maybe_close(plus1, 41)?(), 42
+eq (maybe_close plus1, 41)?(), 42
+eq (maybe_close 'string', 41)?(), undefined
+
+eq 2?(3), undefined
+eq new Number?(42) | 0, 42
+eq new Bumper?(42) | 0, 0
+
+#726
+eq calendar?[Date()], undefined
+
+#733
+a = b: {c: null}
+eq a.b?.c?(), undefined
+a.b?.c or= (it) -> it
+eq a.b?.c?(1), 1
+eq a.b?.c?([2, 3]...), 2
diff --git a/node_modules/jade/support/coffee-script/test/test_expressions.coffee b/node_modules/jade/support/coffee-script/test/test_expressions.coffee
new file mode 100644
index 0000000..9572a6c
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_expressions.coffee
@@ -0,0 +1,40 @@
+# Ensure that we don't wrap Nodes that are "pureStatement" in a closure.
+items = [1, 2, 3, "bacon", 4, 5]
+
+for item in items
+ break if item is "bacon"
+
+findit = (items) ->
+ for item in items
+ return item if item is "bacon"
+
+ok findit(items) is "bacon"
+
+
+# When when a closure wrapper is generated for expression conversion, make sure
+# that references to "this" within the wrapper are safely converted as well.
+obj = {
+ num: 5
+ func: ->
+ this.result = if false
+ 10
+ else
+ "a"
+ "b"
+ this.num
+}
+
+ok obj.num is obj.func()
+ok obj.num is obj.result
+
+
+# Should be able to look at prototypes on keywords.
+obj =
+ withAt: -> @::prop
+ withThis: -> this::prop
+ proto:
+ prop: 100
+
+obj.prototype = obj.proto
+ok obj.withAt() is 100
+ok obj.withThis() is 100
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/test/test_functions.coffee b/node_modules/jade/support/coffee-script/test/test_functions.coffee
new file mode 100644
index 0000000..c39e6c0
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_functions.coffee
@@ -0,0 +1,346 @@
+x = 1
+y = {}
+y.x = -> 3
+
+ok x is 1
+ok typeof(y.x) is 'function'
+ok y.x instanceof Function
+ok y.x() is 3
+
+
+# The empty function should not cause a syntax error.
+->
+() ->
+
+
+# Multiple nested function declarations mixed with implicit calls should not
+# cause a syntax error.
+(one) -> (two) -> three four, (five) -> six seven, eight, (nine) ->
+
+
+obj = {
+ name: 'Fred'
+
+ bound: ->
+ (=> eq this, obj)()
+
+ unbound: ->
+ (-> ok this isnt obj)()
+
+ nested: ->
+ (=>
+ (=>
+ (=>
+ eq this, obj
+ )()
+ )()
+ )()
+}
+
+obj.unbound()
+obj.bound()
+obj.nested()
+
+
+# Python decorator style wrapper that memoizes any function
+memoize = (fn) ->
+ cache = {}
+ self = this
+ (args...) ->
+ key = args.toString()
+ return cache[key] if cache[key]
+ cache[key] = fn.apply(self, args)
+
+Math = {
+ Add: (a, b) -> a + b
+ AnonymousAdd: ((a, b) -> a + b)
+ FastAdd: memoize (a, b) -> a + b
+}
+
+ok Math.Add(5, 5) is 10
+ok Math.AnonymousAdd(10, 10) is 20
+ok Math.FastAdd(20, 20) is 40
+
+
+# Parens are optional on simple function calls.
+ok 100 > 1 if 1 > 0
+ok true unless false
+ok true for i in [1..3]
+
+okFunc = (f) -> ok(f())
+okFunc -> true
+
+# Optional parens can be used in a nested fashion.
+call = (func) -> func()
+
+result = call ->
+ inner = call ->
+ Math.Add(5, 5)
+
+ok result is 10
+
+
+# More fun with optional parens.
+fn = (arg) -> arg
+
+ok fn(fn {prop: 101}).prop is 101
+
+
+# Multi-blocks with optional parens.
+result = fn( ->
+ fn ->
+ "Wrapped"
+)
+
+ok result()() is 'Wrapped'
+
+
+# And even with strange things like this:
+funcs = [((x) -> x), ((x) -> x * x)]
+result = funcs[1] 5
+
+ok result is 25
+
+result = ("hello".slice) 3
+
+ok result is 'lo'
+
+
+# And with multiple single-line functions on the same line.
+func = (x) -> (x) -> (x) -> x
+ok func(1)(2)(3) is 3
+
+
+# Ensure that functions with the same name don't clash with helper functions.
+del = -> 5
+ok del() is 5
+
+# Ensure that functions can have a trailing comma in their argument list
+mult = (x, mids..., y) ->
+ x *= n for n in mids
+ x *= y
+
+ok mult(1, 2,) is 2
+ok mult(1, 2, 3,) is 6
+ok mult(10,[1..6]...,) is 7200
+
+
+# Test for inline functions with parentheses and implicit calls.
+combine = (func, num) -> func() * num
+result = combine (-> 1 + 2), 3
+
+ok result is 9
+
+
+# Test for calls/parens/multiline-chains.
+f = (x) -> x
+result = (f 1).toString()
+ .length
+
+ok result is 1
+
+
+# Test implicit calls in functions in parens:
+result = ((val) ->
+ [].push val
+ val
+)(10)
+
+ok result is 10
+
+
+# More paren compilation tests:
+reverse = (obj) -> obj.reverse()
+ok reverse([1, 2].concat 3).join(' ') is '3 2 1'
+
+# Passing multiple functions without paren-wrapping is legal, and should compile.
+sum = (one, two) -> one() + two()
+result = sum ->
+ 7 + 9
+, ->
+ 1 + 3
+
+ok result is 20
+
+
+# Implicit call with a trailing if statement as a param.
+func = -> arguments[1]
+result = func 'one', if false then 100 else 13
+ok result is 13
+
+
+# Test more function passing:
+result = sum( ->
+ 1 + 2
+, ->
+ 2 + 1
+)
+ok result is 6
+
+sum = (a, b) -> a + b
+result = sum(1
+, 2)
+
+ok result is 3
+
+
+# This is a crazy one.
+x = (obj, func) -> func obj
+ident = (x) -> x
+
+result = x {one: ident 1}, (obj) ->
+ inner = ident(obj)
+ ident inner
+
+ok result.one is 1
+
+
+# Assignment to a Object.prototype-named variable should not leak to outer scope.
+# FIXME: fails on IE
+(->
+ constructor = 'word'
+)()
+
+ok constructor isnt 'word'
+
+
+# Trying an implicit object call with a trailing function.
+a = null
+meth = (arg, obj, func) -> a = [obj.a, arg, func()].join ' '
+
+meth 'apple', b: 1, a: 13, ->
+ 'orange'
+
+ok a is '13 apple orange'
+
+
+# Ensure that empty functions don't return mistaken values.
+obj =
+ func: (@param, @rest...) ->
+
+ok obj.func(101, 102, 103, 104) is undefined
+ok obj.param is 101
+ok obj.rest.join(' ') is '102 103 104'
+
+
+# `@` and `this` should both be able to invoke a method.
+func = (arg) -> ok arg is true
+func.withAt = -> @ true
+func.withThis = -> this true
+
+func.withAt()
+func.withThis()
+
+
+# Ensure that constructors invoked with splats return a new object.
+args = [1, 2, 3]
+Type = (@args) ->
+type = new Type args
+
+ok type and type instanceof Type
+ok type.args and type.args instanceof Array
+ok v is args[i] for v, i in type.args
+
+Type1 = (@a, @b, @c) ->
+type1 = new Type1 args...
+
+ok type1 instanceof Type1
+eq type1.constructor, Type1
+ok type1.a is args[0] and type1.b is args[1] and type1.c is args[2]
+
+
+# Ensure that constructors invoked with splats cache the function.
+called = 0
+get = -> if called++ then false else class Type
+new get() args...
+
+
+# Chained blocks, with proper indentation levels:
+counter =
+ results: []
+ tick: (func) ->
+ @results.push func()
+ this
+
+counter
+ .tick ->
+ 3
+ .tick ->
+ 2
+ .tick ->
+ 1
+
+eq counter.results.join(' '), '3 2 1'
+
+
+# Make incorrect indentation safe.
+func = ->
+ obj = {
+ key: 10
+ }
+ obj.key - 5
+
+eq func(), 5
+
+
+# Ensure that chained calls with indented implicit object literals below are
+# alright.
+result = null
+obj =
+ method: (val) -> this
+ second: (hash) -> result = hash.three
+
+
+obj
+ .method(
+ 101
+ ).second(
+ one:
+ two: 2
+ three: 3
+ )
+
+eq result, 3
+
+
+# Test newline-supressed call chains with nested functions.
+obj =
+ call: -> this
+func = ->
+ obj
+ .call ->
+ one two
+ .call ->
+ three four
+ 101
+
+eq func(), 101
+
+
+# `new` shouldn't add extra parens
+ok new Date().constructor is Date
+
+
+# `new` works against bare function
+eq Date, new ->
+ eq this, new => this
+ Date
+
+
+# Implicit objects with number arguments.
+func = (x, y) -> y
+obj =
+ prop: func "a", 1
+
+ok obj.prop is 1
+
+
+# Non-spaced unary and binary operators should cause a function call.
+func = (val) -> val + 1
+ok (func +5) is 6
+ok (func -5) is -4
+
+
+# Prefix unary assignment operators are allowed in parenless calls.
+val = 5
+ok (func --val) is 5
diff --git a/node_modules/jade/support/coffee-script/test/test_helpers.coffee b/node_modules/jade/support/coffee-script/test/test_helpers.coffee
new file mode 100644
index 0000000..56a8017
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_helpers.coffee
@@ -0,0 +1,49 @@
+{indexOf, include, starts, ends, compact, count, merge, extend, flatten, del, last} = CoffeeScript.helpers
+
+array = [0..4]
+string = array.join ''
+object = {}
+
+# Test `indexOf`
+eq 0, indexOf array, 0
+eq 2, indexOf array, 2
+eq 4, indexOf array, 4
+eq(-1, indexOf array, 6)
+
+# Test `include`
+ok include array, 0
+ok include array, 2
+ok include array, 4
+ok not include array, 6
+
+# Test `starts`
+ok starts string, '012'
+ok starts string, '34', 3
+ok not starts string, '42'
+ok not starts string, '42', 6
+
+# Test `ends`
+ok ends string, '234'
+ok ends string, '01', 3
+ok not ends string, '42'
+ok not ends string, '42', 6
+
+# Test `merge`
+merged = merge object, array
+ok merged isnt object
+eq merged[3], 3
+
+# Test `extend`
+ok object is extend object, array
+eq object[3], 3
+
+# Test `flatten`
+eq "#{ flatten [0, [1, 2], 3, [4]] }", "#{ array }"
+
+# Test `del`
+eq 1, del object, 1
+ok 1 not of object
+
+# Test `last`
+eq 4, last array
+eq 2, last array, 2
diff --git a/node_modules/jade/support/coffee-script/test/test_heredocs.coffee b/node_modules/jade/support/coffee-script/test/test_heredocs.coffee
new file mode 100644
index 0000000..330ecdf
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_heredocs.coffee
@@ -0,0 +1,111 @@
+a = """
+ basic heredoc
+ on two lines
+ """
+
+ok a is "basic heredoc\non two lines"
+
+
+a = '''
+ a
+ "b
+ c
+ '''
+
+ok a is "a\n \"b\nc"
+
+
+a = """
+a
+ b
+ c
+"""
+
+ok a is "a\n b\n c"
+
+
+a = '''one-liner'''
+
+ok a is 'one-liner'
+
+
+a = """
+ out
+ here
+"""
+
+ok a is "out\nhere"
+
+
+a = '''
+ a
+ b
+ c
+ '''
+
+ok a is " a\n b\nc"
+
+
+a = '''
+a
+
+
+b c
+'''
+
+ok a is "a\n\n\nb c"
+
+
+a = '''more"than"one"quote'''
+
+ok a is 'more"than"one"quote'
+
+
+val = 10
+
+a = """
+ basic heredoc #{val}
+ on two lines
+ """
+
+b = '''
+ basic heredoc #{val}
+ on two lines
+ '''
+
+ok a is "basic heredoc 10\non two lines"
+ok b is "basic heredoc \#{val}\non two lines"
+
+
+a = '''here's an apostrophe'''
+ok a is "here's an apostrophe"
+
+
+# The indentation detector ignores blank lines without trailing whitespace
+a = """
+ one
+ two
+
+ """
+ok a is "one\ntwo\n"
+
+eq ''' line 0
+ should not be relevant
+ to the indent level
+''', '
+ line 0\n
+should not be relevant\n
+ to the indent level
+'
+
+eq ''' '\\\' ''', " '\\' "
+eq """ "\\\" """, ' "\\" '
+
+eq ''' <- keep these spaces -> ''', ' <- keep these spaces -> '
+
+eq 'multiline nested "interpolations" work', """multiline #{
+ "nested #{(->
+ ok yes
+ "\"interpolations\""
+ )()}"
+} work"""
diff --git a/node_modules/jade/support/coffee-script/test/test_if.coffee b/node_modules/jade/support/coffee-script/test/test_if.coffee
new file mode 100644
index 0000000..42ba54b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_if.coffee
@@ -0,0 +1,146 @@
+a = b = d = true
+c = false
+
+result = if a
+ if b
+ if c then false else
+ if d
+ true
+
+ok result
+
+
+first = if false then false else second = if false then false else true
+
+ok first
+ok second
+
+
+result = if false
+ false
+else if NaN
+ false
+else
+ true
+
+ok result
+
+
+# Testing unless.
+result = unless true
+ 10
+else
+ 11
+
+ok result is 11
+
+
+# Nested inline if statements.
+echo = (x) -> x
+result = if true then echo((if false then 'xxx' else 'y') + 'a')
+ok result is 'ya'
+
+
+# Testing inline funcs with inline if-elses.
+func = -> if 1 < 0.5 then 1 else -1
+ok func() is -1
+
+
+# Testing empty or commented if statements ... should compile:
+result = if false
+else if false
+else
+
+ok result is undefined
+
+result = if false
+ # comment
+else if true
+ # comment
+else
+
+ok result is undefined
+
+
+# Return an if with no else.
+func = ->
+ return if false then callback()
+
+ok func() is undefined
+
+func = ->
+ return unless false then 100 else -100
+
+ok func() is 100
+
+ident = (x) -> x
+result = ident if false then 300 else 100
+
+ok result is 100
+
+
+# If-to-ternary with instanceof requires parentheses (no comment).
+if {} instanceof Object
+ ok yes
+else
+ ok no
+
+try
+ {} + {}
+ ok yes
+catch e
+ ok no
+
+
+# If-to-ternary as part of a larger operation requires parens.
+x = 1
+result = x + if false then 10 else 1
+ok result is 2
+
+
+# If/else indented within an assignment.
+func = ->
+ a =
+ if false
+ 3
+ else
+ 5
+ 101
+ a
+
+ok func() is 5
+
+
+# Unmatched 'then' should catch implicit calls.
+i = 1
+isTrue = (x) -> x is true
+
+if isTrue yes then i += 1
+
+ok i is 2
+
+# If/else with a suppressed indentation via assignment.
+result =
+ if false then 10
+ else if no then 20
+ else if 0 then 30
+ else if NaN then 40
+ else 50 +
+ if false then 10
+ else 20
+
+ok result is 70
+
+
+# Issue #738
+func = if true then -> 1
+eq func(), 1
+
+
+# Issue #748. Trailing reserved identifiers.
+obj = delete: true
+
+result = if obj.delete
+ 101
+
+ok result is 101
diff --git a/node_modules/jade/support/coffee-script/test/test_importing.coffee b/node_modules/jade/support/coffee-script/test/test_importing.coffee
new file mode 100644
index 0000000..e069938
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_importing.coffee
@@ -0,0 +1,3 @@
+# Check if we can import and execute a CoffeeScript-only module successfully.
+if require?.extensions? or require?.registerExtension?
+ ok require('./test_module').func() is "from over there"
diff --git a/node_modules/jade/support/coffee-script/test/test_literals.coffee b/node_modules/jade/support/coffee-script/test/test_literals.coffee
new file mode 100644
index 0000000..b753b45
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_literals.coffee
@@ -0,0 +1,247 @@
+a = [((x) -> x), ((x) -> x * x)]
+
+ok a.length is 2
+
+
+neg = (3 -4)
+
+ok neg is -1
+
+
+# Decimal number literals.
+value = .25 + .75
+ok value is 1
+value = 0.0 + -.25 - -.75 + 0.0
+ok value is 0.5
+
+# Decimals don't interfere with ranges.
+ok [0..10].join(' ') is '0 1 2 3 4 5 6 7 8 9 10'
+ok [0...10].join(' ') is '0 1 2 3 4 5 6 7 8 9'
+
+
+# Can call methods directly on numbers.
+4.valueOf() is 4
+
+
+func = ->
+ return if true
+
+ok func() is undefined
+
+
+trailingComma = [1, 2, 3,]
+ok (trailingComma[0] is 1) and (trailingComma[2] is 3) and (trailingComma.length is 3)
+
+trailingComma = [
+ 1, 2, 3,
+ 4, 5, 6
+ 7, 8, 9,
+]
+(sum = (sum or 0) + n) for n in trailingComma
+
+trailingComma = {k1: "v1", k2: 4, k3: (-> true),}
+ok trailingComma.k3() and (trailingComma.k2 is 4) and (trailingComma.k1 is "v1")
+
+
+ok {a: (num) -> num is 10 }.a 10
+
+
+moe = {
+ name: 'Moe'
+ greet: (salutation) ->
+ salutation + " " + @name
+ hello: ->
+ @['greet'] "Hello"
+ 10: 'number'
+}
+
+ok moe.hello() is "Hello Moe"
+ok moe[10] is 'number'
+
+moe.hello = ->
+ this['greet'] "Hello"
+
+ok moe.hello() is 'Hello Moe'
+
+
+obj = {
+ is: -> yes,
+ 'not': -> no,
+}
+
+ok obj.is()
+ok not obj.not()
+
+
+# Top-level object literal doesn't break things.
+obj: 1
+
+
+# Funky indentation within non-comma-seperated arrays.
+result = [['a']
+ {b: 'c'}]
+
+ok result[0][0] is 'a'
+ok result[1]['b'] is 'c'
+
+
+# Object literals should be able to include keywords.
+obj = {class: 'höt'}
+obj.function = 'dog'
+
+ok obj.class + obj.function is 'hötdog'
+
+
+# But keyword assignment should be smart enough not to stringify variables.
+func = ->
+ this == 'this'
+
+ok func() is false
+
+
+# New fancy implicit objects:
+config =
+ development:
+ server: 'localhost'
+ timeout: 10
+
+ production:
+ server: 'dreamboat'
+ timeout: 1000
+
+ok config.development.server is 'localhost'
+ok config.production.server is 'dreamboat'
+ok config.development.timeout is 10
+ok config.production.timeout is 1000
+
+obj =
+ a: 1
+ b: 2
+
+ok obj.a is 1
+ok obj.b is 2
+
+obj =
+ a: 1,
+ b: 2,
+
+ok obj.a is 1
+ok obj.b is 2
+
+
+# Implicit objects nesting.
+obj =
+ options:
+ value: yes
+
+ fn: ->
+ {}
+ null
+
+ok obj.options.value is yes
+ok obj.fn() is null
+
+
+# Implicit arguments to function calls:
+func = (obj) -> obj.a
+
+result = func
+ a: 10
+
+ok result is 10
+
+result = func
+ "a": 20
+
+ok result is 20
+
+third = (a, b, c) -> c
+obj =
+ one: 'one'
+ two: third 'one', 'two', 'three'
+
+ok obj.one is 'one'
+ok obj.two is 'three'
+
+
+# Implicit objects with wacky indentation:
+obj =
+ 'reverse': (obj) ->
+ Array.prototype.reverse.call obj
+ abc: ->
+ @reverse(
+ @reverse @reverse ['a', 'b', 'c'].reverse()
+ )
+ one: [1, 2,
+ a: 'b'
+ 3, 4]
+ red:
+ orange:
+ yellow:
+ green: 'blue'
+ indigo: 'violet'
+ misdent: [[],
+ [],
+ [],
+ []]
+
+ok obj.abc().join(' ') is 'a b c'
+ok obj.one.length is 5
+ok obj.one[4] is 4
+ok obj.one[2].a is 'b'
+ok (key for key of obj.red).length is 2
+ok obj.red.orange.yellow.green is 'blue'
+ok obj.red.indigo is 'violet'
+ok obj.misdent.toString() is ',,,'
+
+second = (x, y) -> y
+obj = then second 'the',
+ 1: 1
+ two:
+ three: ->
+ four five,
+ six: seven
+ three: 3
+
+ok obj[1] is 1
+ok obj.three is 3
+
+
+# Implicit objects as part of chained calls.
+identity = (x) -> x.a
+
+b = identity identity identity
+ a:
+ a:
+ a: 100
+
+ok b is 100
+
+
+# Inline JS
+eq '\\`', `
+ "\\\`"
+`
+
+
+# Shorthand objects with property references.
+obj =
+ one: 1
+ two: 2
+ object: -> {@one, @two}
+ list: -> [@one, @two]
+
+
+result = obj.object()
+eq result.one, 1
+eq result.two, 2
+eq result.two, obj.list()[1]
+
+
+#542: Objects leading expression statement should be parenthesized.
+{f: -> ok yes }.f() + 1
+
+
+#764: Boolean/Number should be indexable.
+ok 42['toString']
+ok on['toString']
diff --git a/node_modules/jade/support/coffee-script/test/test_module.coffee b/node_modules/jade/support/coffee-script/test/test_module.coffee
new file mode 100644
index 0000000..c6f1f1b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_module.coffee
@@ -0,0 +1,4 @@
+# This file is imported by `testImporting.coffee`
+if exports?
+ local = "from over there"
+ exports.func = -> local
diff --git a/node_modules/jade/support/coffee-script/test/test_operations.coffee b/node_modules/jade/support/coffee-script/test/test_operations.coffee
new file mode 100644
index 0000000..0ba5cd6
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_operations.coffee
@@ -0,0 +1,154 @@
+# CoffeeScript's operations should be chainable, like Python's.
+ok 500 > 50 > 5 > -5
+
+ok true is not false is true is not false
+
+ok 0 is 0 isnt 50 is 50
+
+ok 10 < 20 > 10
+
+ok 50 > 10 > 5 is parseInt('5', 10)
+
+i = 0
+ok 1 > i++ < 1, 'chained operations should evaluate each value only once'
+
+
+# `==` and `is` should be interchangeable.
+a = b = 1
+
+ok a is 1 and b is 1
+ok a == b
+ok a is b
+
+
+# Allow "if x not in y"
+obj = {a: true}
+ok 'a' of obj
+ok 'b' not of obj
+
+# And for "a in b" with array presence.
+ok 200 in [100, 200, 300]
+array = [100, 200, 300]
+ok 200 in array
+ok 1 not in array
+ok array[0]++ in [99, 100], 'should cache testee'
+
+# And with array presence on an instance variable.
+obj = {
+ list: [1, 2, 3, 4, 5]
+ in_list: (value) -> value in @list
+}
+ok obj.in_list 4
+ok not obj.in_list 0
+
+# Non-spaced values still work.
+x = 10
+y = -5
+
+ok x*-y is 50
+ok x*+y is -50
+
+
+# Compound operators.
+one = 1
+two = 0
+one or= 2
+two or= 2
+
+eq one, 1
+eq two, 2
+
+zero = 0
+
+zero and= 'one'
+one and= 'one'
+
+eq zero, 0
+eq one , 'one'
+
+
+# Compound assignment should be careful about caching variables.
+count = 0
+list = []
+
+list[++count] or= 1
+eq list[1], 1
+eq count, 1
+
+list[++count] ?= 2
+eq list[2], 2
+eq count, 2
+
+list[count++] and= 'two'
+eq list[2], 'two'
+eq count, 3
+
+base = -> ++count; base
+
+base().four or= 4
+eq base.four, 4
+eq count, 4
+
+base().five ?= 5
+eq base.five, 5
+eq count, 5
+
+
+# Ensure that RHS is treated as a group.
+a = b = false
+a and= b or true
+ok a is false
+
+
+# Bitwise operators:
+ok (10 & 3) is 2
+ok (10 | 3) is 11
+ok (10 ^ 3) is 9
+ok (10 << 3) is 80
+ok (10 >> 3) is 1
+ok (10 >>> 3) is 1
+
+num = 10; ok (num <<= 3) is 80
+num = 10; ok (num >>= 3) is 1
+num = 10; ok (num >>>= 3) is 1
+num = 10; ok (num &= 3) is 2
+num = 10; ok (num ^= 3) is 9
+num = 10; ok (num |= 3) is 11
+
+
+# Compound assignment with implicit objects.
+obj = undefined
+obj ?=
+ one: 1
+
+ok obj.one is 1
+
+obj and=
+ two: 2
+
+ok not obj.one
+ok obj.two is 2
+
+
+# Compound assignment as a sub expression.
+[a, b, c] = [1, 2, 3]
+ok (a + b += c) is 6
+ok a is 1
+ok b is 5
+ok c is 3
+
+
+# Instanceof.
+ok new String instanceof String
+ok new Number not instanceof String
+
+
+#737: `in` should have higher precedence than logical operators
+eq 1, 1 in [1] and 1
+
+#768: `in` should preserve evaluation order
+share = 0
+a = -> share++ if share is 0
+b = -> share++ if share is 1
+c = -> share++ if share is 2
+ok a() not in [b(),c()] and share is 3
diff --git a/node_modules/jade/support/coffee-script/test/test_option_parser.coffee b/node_modules/jade/support/coffee-script/test/test_option_parser.coffee
new file mode 100644
index 0000000..2f66623
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_option_parser.coffee
@@ -0,0 +1,27 @@
+# Ensure that the OptionParser handles arguments correctly.
+return unless require?
+{OptionParser} = require './../lib/optparse'
+
+opt = new OptionParser [
+ ['-r', '--required [DIR]', 'desc required']
+ ['-o', '--optional', 'desc optional']
+ ['-l', '--list [FILES*]', 'desc list']
+]
+
+result = opt.parse ['one', 'two', 'three', '-r', 'dir']
+
+ok result.arguments.length is 5
+ok result.arguments[3] is '-r'
+
+result = opt.parse ['--optional', '-r', 'folder', 'one', 'two']
+
+ok result.optional is true
+ok result.required is 'folder'
+ok result.arguments.join(' ') is 'one two'
+
+result = opt.parse ['-l', 'one.txt', '-l', 'two.txt', 'three']
+
+ok result.list instanceof Array
+ok result.list.join(' ') is 'one.txt two.txt'
+ok result.arguments.join(' ') is 'three'
+
diff --git a/node_modules/jade/support/coffee-script/test/test_pattern_matching.coffee b/node_modules/jade/support/coffee-script/test/test_pattern_matching.coffee
new file mode 100644
index 0000000..e323814
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_pattern_matching.coffee
@@ -0,0 +1,160 @@
+# Simple variable swapping.
+a = -1
+b = -2
+
+[a, b] = [b, a]
+
+eq a, -2
+eq b, -1
+
+func = ->
+ [a, b] = [b, a]
+
+eq func().join(' '), '-1 -2'
+eq a, -1
+eq b, -2
+
+#713
+eq (onetwo = [1, 2]), [a, b] = [c, d] = onetwo
+ok a is c is 1 and b is d is 2
+
+
+# Array destructuring, including splats.
+[x,y...,z] = [1,2,3,4,5]
+
+ok x is 1
+ok y.length is 3
+ok z is 5
+
+[x, [y, mids..., last], z..., end] = [1, [10, 20, 30, 40], 2,3,4, 5]
+
+ok x is 1
+ok y is 10
+ok mids.length is 2 and mids[1] is 30
+ok last is 40
+ok z.length is 3 and z[2] is 4
+ok end is 5
+
+
+# Object destructuring.
+obj = {x: 10, y: 20, z: 30}
+
+{x: a, y: b, z: c} = obj
+
+ok a is 10
+ok b is 20
+ok c is 30
+
+person = {
+ name: "Moe"
+ family: {
+ 'elder-brother': {
+ addresses: [
+ "first"
+ {
+ street: "101 Deercreek Ln."
+ city: "Moquasset NY, 10021"
+ }
+ ]
+ }
+ }
+}
+
+{name: a, family: {'elder-brother': {addresses: [one, {city: b}]}}} = person
+
+ok a is "Moe"
+ok b is "Moquasset NY, 10021"
+
+test = {
+ person: {
+ address: [
+ "------"
+ "Street 101"
+ "Apt 101"
+ "City 101"
+ ]
+ }
+}
+
+{person: {address: [ignore, addr...]}} = test
+
+ok addr.join(', ') is "Street 101, Apt 101, City 101"
+
+
+# Pattern matching against an expression.
+[a, b] = if true then [2, 1] else [1, 2]
+
+ok a is 2
+ok b is 1
+
+
+# Pattern matching with object shorthand.
+
+person = {
+ name: "Bob"
+ age: 26
+ dogs: ["Prince", "Bowie"]
+}
+
+{name, age, dogs: [first, second]} = person
+
+ok name is "Bob"
+ok age is 26
+ok first is "Prince"
+ok second is "Bowie"
+
+# Pattern matching within for..loops
+
+persons = {
+ George: { name: "Bob" },
+ Bob: { name: "Alice" }
+ Christopher: { name: "Stan" }
+}
+
+join1 = "#{key}: #{name}" for key, { name } of persons
+
+eq join1.join(' / '), "George: Bob / Bob: Alice / Christopher: Stan"
+
+persons = [
+ { name: "Bob", parent: { name: "George" } },
+ { name: "Alice", parent: { name: "Bob" } },
+ { name: "Stan", parent: { name: "Christopher" } }
+]
+
+join2 = "#{parent}: #{name}" for { name, parent: { name: parent } } in persons
+
+eq join1.join(' '), join2.join(' ')
+
+persons = [['Bob', ['George']], ['Alice', ['Bob']], ['Stan', ['Christopher']]]
+join3 = "#{parent}: #{name}" for [name, [parent]] in persons
+
+eq join2.join(' '), join3.join(' ')
+
+
+# Pattern matching doesn't clash with implicit block objects.
+obj = a: 101
+func = -> true
+
+if func func
+ {a} = obj
+
+ok a is 101
+
+[x] = {0: y} = {'0': z} = [Math.random()]
+ok x is y is z, 'destructuring in multiple'
+
+
+# Destructuring into an object.
+obj =
+ func: (list, object) ->
+ [@one, @two] = list
+ {@a, @b} = object
+ {@a} = object # must not unroll this
+ null
+
+obj.func [1, 2], a: 'a', b: 'b'
+
+eq obj.one, 1
+eq obj.two, 2
+eq obj.a, 'a'
+eq obj.b, 'b'
diff --git a/node_modules/jade/support/coffee-script/test/test_ranges_slices_and_splices.coffee b/node_modules/jade/support/coffee-script/test/test_ranges_slices_and_splices.coffee
new file mode 100644
index 0000000..3e07f8c
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_ranges_slices_and_splices.coffee
@@ -0,0 +1,75 @@
+# Slice.
+array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+a = array[7..9]
+b = array[2...4]
+
+result = a.concat(b).join(' ')
+
+ok result is "7 8 9 2 3"
+
+a = [0, 1, 2, 3, 4, 5, 6, 7]
+eq a[2...6].join(' '), '2 3 4 5'
+
+
+# Ranges.
+countdown = [10..1].join(' ')
+ok countdown is "10 9 8 7 6 5 4 3 2 1"
+
+a = 1
+b = 5
+nums = [a...b]
+ok nums.join(' ') is '1 2 3 4'
+
+b = -5
+nums = [a..b]
+ok nums.join(' ') is '1 0 -1 -2 -3 -4 -5'
+
+
+# Expression-based range.
+array = [(1+5)..1+9]
+ok array.join(' ') is "6 7 8 9 10"
+
+array = [5..1]
+ok array.join(' ') is '5 4 3 2 1'
+
+array = [30...0]
+ok (len = array.length) is 30
+ok array[len - 1] is 1
+
+
+
+# String slicing (at least on Node).
+hello = "Hello World"
+
+ok hello[1...1] is ""
+ok hello[1..1] is "e"
+ok hello[1...5] is "ello"
+ok hello[0..4] is "Hello"
+
+
+# Splice literals.
+array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+
+array[5..10] = [0, 0, 0]
+
+ok array.join(' ') is '0 1 2 3 4 0 0 0'
+
+
+# Slices and splices that omit their beginning or end.
+array = [0..10]
+
+ok array[7..].join(' ') is '7 8 9 10'
+ok array[-2..].join(' ') is '9 10'
+
+ok array[...3].join(' ') is '0 1 2'
+ok array[..-5].join(' ') is '0 1 2 3 4 5 6'
+
+array[3..] = [9, 8, 7]
+
+ok array.join(' ') is '0 1 2 9 8 7'
+
+array[...3] = [7, 8, 9]
+
+ok array.join(' ') is '7 8 9 9 8 7'
+
diff --git a/node_modules/jade/support/coffee-script/test/test_regexps.coffee b/node_modules/jade/support/coffee-script/test/test_regexps.coffee
new file mode 100644
index 0000000..709709a
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_regexps.coffee
@@ -0,0 +1,45 @@
+# Regular expression literals.
+ok 'x'.match(/x/g)
+ok 'x'.match /x/g
+ok 'x'.match(/x/)
+ok 'x'.match /x/
+
+ok 4 / 2 / 1 is 2
+
+y = 4
+x = 2
+g = 1
+
+ok y / x/g is 2
+
+obj = {
+ width: -> 10
+ height: -> 20
+}
+id = 2
+
+ok (obj.width()/id - obj.height()/id) is -5
+
+eq /\\/.source, "\\\\"
+
+
+eq /^I'm\s+Heregex?\/\/\//gim + '', ///
+ ^ I'm \s+ Heregex? / // # or not
+///gim + ''
+eq '\\\\#{}\\\\\\\"', ///
+ #{
+ "#{ '\\' }" # normal comment
+ }
+ # regex comment
+ \#{}
+ \\ \"
+///.source
+eq /// /// + '', '/(?:)/'
+
+
+#584: Unescaped slashes in character classes.
+ok /:\/[/]goog/.test 'http://google.com'
+
+
+#764: Should be indexable.
+eq /0/['source'], ///#{0}///['source']
diff --git a/node_modules/jade/support/coffee-script/test/test_returns.coffee b/node_modules/jade/support/coffee-script/test/test_returns.coffee
new file mode 100644
index 0000000..92f5ab0
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_returns.coffee
@@ -0,0 +1,33 @@
+# Expression conversion under explicit returns.
+first = ->
+ return 'do' for x in [1,2,3]
+
+second = ->
+ return ['re' for x in [1,2,3]]
+
+third = ->
+ return ('mi' for x in [1,2,3])
+
+ok first().join(' ') is 'do do do'
+ok second()[0].join(' ') is 're re re'
+ok third().join(' ') is 'mi mi mi'
+
+
+# Testing returns with multiple branches.
+func = ->
+ if false
+ for a in b
+ return c if d
+ else
+ "word"
+
+ok func() is 'word'
+
+
+# And with switches.
+func = ->
+ switch 'a'
+ when 'a' then 42
+ else return 23
+
+ok func() is 42
\ No newline at end of file
diff --git a/node_modules/jade/support/coffee-script/test/test_splats.coffee b/node_modules/jade/support/coffee-script/test/test_splats.coffee
new file mode 100644
index 0000000..006c80f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_splats.coffee
@@ -0,0 +1,125 @@
+func = (first, second, rest...) ->
+ rest.join ' '
+
+result = func 1, 2, 3, 4, 5
+
+ok result is "3 4 5"
+
+
+gold = silver = bronze = theField = last = null
+
+medalists = (first, second, third, rest..., unlucky) ->
+ gold = first
+ silver = second
+ bronze = third
+ theField = rest.concat([last])
+ last = unlucky
+
+contenders = [
+ "Michael Phelps"
+ "Liu Xiang"
+ "Yao Ming"
+ "Allyson Felix"
+ "Shawn Johnson"
+ "Roman Sebrle"
+ "Guo Jingjing"
+ "Tyson Gay"
+ "Asafa Powell"
+ "Usain Bolt"
+]
+
+medalists "Mighty Mouse", contenders...
+
+ok gold is "Mighty Mouse"
+ok silver is "Michael Phelps"
+ok bronze is "Liu Xiang"
+ok last is "Usain Bolt"
+ok theField.length is 8
+
+contenders.reverse()
+medalists contenders[0...2]..., "Mighty Mouse", contenders[2...contenders.length]...
+
+ok gold is "Usain Bolt"
+ok silver is "Asafa Powell"
+ok bronze is "Mighty Mouse"
+ok last is "Michael Phelps"
+ok theField.length is 8
+
+medalists contenders..., 'Tim', 'Moe', 'Jim'
+ok last is 'Jim'
+
+
+obj =
+ name: 'moe'
+ accessor: (args...) ->
+ [@name].concat(args).join(' ')
+ getNames: ->
+ args = ['jane', 'ted']
+ @accessor(args...)
+ index: 0
+ 0: {method: -> this is obj[0]}
+
+ok obj.getNames() is 'moe jane ted'
+ok obj[obj.index++].method([]...), 'should cache base value'
+
+crowd = [
+ contenders...
+ "Mighty Mouse"
+]
+
+bests = [
+ "Mighty Mouse"
+ contenders[0..3]...
+]
+
+ok crowd[0] is contenders[0]
+ok crowd[10] is "Mighty Mouse"
+
+ok bests[1] is contenders[0]
+ok bests[4] is contenders[3]
+
+
+# Finally, splats with super() within classes.
+
+class Parent
+ meth: (args...) ->
+ args
+
+class Child extends Parent
+ meth: ->
+ nums = [3, 2, 1]
+ super nums...
+
+ok (new Child).meth().join(' ') is '3 2 1'
+
+
+# Functions with splats being called with too few arguments.
+pen = null
+method = (first, variable..., penultimate, ultimate) ->
+ pen = penultimate
+
+method 1, 2, 3, 4, 5, 6, 7, 8, 9
+ok pen is 8
+
+method 1, 2, 3
+ok pen is 2
+
+method 1, 2
+ok pen is 2
+
+
+# Array splat expansions with assigns.
+nums = [1, 2, 3]
+list = [a = 0, nums..., b = 4]
+ok a is 0
+ok b is 4
+ok list.join(' ') is '0 1 2 3 4'
+
+
+# Splat on a line by itself is invalid.
+failed = true
+try
+ CoffeeScript.compile "x 'a'\n...\n"
+ failed = false
+catch err
+ok failed
diff --git a/node_modules/jade/support/coffee-script/test/test_strings.coffee b/node_modules/jade/support/coffee-script/test/test_strings.coffee
new file mode 100644
index 0000000..51d32dc
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_strings.coffee
@@ -0,0 +1,101 @@
+eq '(((dollars)))', '\(\(\(dollars\)\)\)'
+eq 'one two three', "one
+ two
+ three"
+eq "four five", 'four
+
+ five'
+
+#647
+eq "''Hello, World\\''", '''
+'\'Hello, World\\\''
+'''
+eq '""Hello, World\\""', """
+"\"Hello, World\\\""
+"""
+eq 'Hello, World\n', '''
+Hello, World\
+
+'''
+
+
+hello = 'Hello'
+world = 'World'
+ok '#{hello} #{world}!' is '#{hello} #{world}!'
+ok "#{hello} #{world}!" is 'Hello World!'
+ok "[#{hello}#{world}]" is '[HelloWorld]'
+ok "#{hello}##{world}" is 'Hello#World'
+ok "Hello #{ 1 + 2 } World" is 'Hello 3 World'
+ok "#{hello} #{ 1 + 2 } #{world}" is "Hello 3 World"
+
+
+[s, t, r, i, n, g] = ['s', 't', 'r', 'i', 'n', 'g']
+ok "#{s}#{t}#{r}#{i}#{n}#{g}" is 'string'
+ok "\#{s}\#{t}\#{r}\#{i}\#{n}\#{g}" is '#{s}#{t}#{r}#{i}#{n}#{g}'
+ok "\#{string}" is '#{string}'
+
+
+ok "\#{Escaping} first" is '#{Escaping} first'
+ok "Escaping \#{in} middle" is 'Escaping #{in} middle'
+ok "Escaping \#{last}" is 'Escaping #{last}'
+
+
+ok "##" is '##'
+ok "#{}" is ''
+ok "#{}A#{} #{} #{}B#{}" is 'A B'
+ok "\\\#{}" is '\\#{}'
+
+
+ok "I won ##{20} last night." is 'I won #20 last night.'
+ok "I won ##{'#20'} last night." is 'I won ##20 last night.'
+
+
+ok "#{hello + world}" is 'HelloWorld'
+ok "#{hello + ' ' + world + '!'}" is 'Hello World!'
+
+
+list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ok "values: #{list.join(', ')}, length: #{list.length}." is 'values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, length: 10.'
+ok "values: #{list.join ' '}" is 'values: 0 1 2 3 4 5 6 7 8 9'
+
+
+obj = {
+ name: 'Joe'
+ hi: -> "Hello #{@name}."
+ cya: -> "Hello #{@name}.".replace('Hello','Goodbye')
+}
+ok obj.hi() is "Hello Joe."
+ok obj.cya() is "Goodbye Joe."
+
+
+ok "With #{"quotes"}" is 'With quotes'
+ok 'With #{"quotes"}' is 'With #{"quotes"}'
+
+ok "Where is #{obj["name"] + '?'}" is 'Where is Joe?'
+
+ok "Where is #{"the nested #{obj["name"]}"}?" is 'Where is the nested Joe?'
+ok "Hello #{world ? "#{hello}"}" is 'Hello World'
+
+ok "Hello #{"#{"#{obj["name"]}" + '!'}"}" is 'Hello Joe!'
+
+
+a = """
+ Hello #{ "Joe" }
+ """
+ok a is "Hello Joe"
+
+
+a = 1
+b = 2
+c = 3
+ok "#{a}#{b}#{c}" is '123'
+
+
+result = null
+stash = (str) -> result = str
+stash "a #{ ('aa').replace /a/g, 'b' } c"
+ok result is 'a bb c'
+
+
+foo = "hello"
+ok "#{foo.replace("\"", "")}" is 'hello'
diff --git a/node_modules/jade/support/coffee-script/test/test_switch.coffee b/node_modules/jade/support/coffee-script/test/test_switch.coffee
new file mode 100644
index 0000000..f3307d9
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_switch.coffee
@@ -0,0 +1,98 @@
+num = 10
+
+result = switch num
+ when 5 then false
+ when 'a'
+ true
+ true
+ false
+ when 10 then true
+
+
+ # Mid-switch comment with whitespace
+ # and multi line
+ when 11 then false
+ else false
+
+ok result
+
+
+func = (num) ->
+ switch num
+ when 2, 4, 6
+ true
+ when 1, 3, 5
+ false
+ else false
+
+ok func(2)
+ok func(6)
+ok !func(3)
+ok !func(8)
+
+
+# Should cache the switch value, if anything fancier than a literal.
+num = 5
+result = switch num += 5
+ when 5 then false
+ when 15 then false
+ when 10 then true
+ else false
+
+ok result
+
+
+# Ensure that trailing switch elses don't get rewritten.
+result = false
+switch "word"
+ when "one thing"
+ doSomething()
+ else
+ result = true unless false
+
+ok result
+
+result = false
+switch "word"
+ when "one thing"
+ doSomething()
+ when "other thing"
+ doSomething()
+ else
+ result = true unless false
+
+ok result
+
+
+# Should be able to handle switches sans-condition.
+result = switch
+ when null then 1
+ when 'truthful string' then 2
+ else 3
+
+ok result is 2
+
+
+# Should be able to use "@properties" within the switch clause.
+obj = {
+ num: 101
+ func: ->
+ switch @num
+ when 101 then '101!'
+ else 'other'
+}
+
+ok obj.func() is '101!'
+
+
+# Should be able to use "@properties" within the switch cases.
+obj = {
+ num: 101
+ func: (yesOrNo) ->
+ result = switch yesOrNo
+ when yes then @num
+ else 'other'
+ result
+}
+
+ok obj.func(yes) is 101
diff --git a/node_modules/jade/support/coffee-script/test/test_try_catch.coffee b/node_modules/jade/support/coffee-script/test/test_try_catch.coffee
new file mode 100644
index 0000000..e98657b
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_try_catch.coffee
@@ -0,0 +1,45 @@
+# Basic exception throwing.
+block = -> throw 'up'
+throws block, 'up'
+
+
+# Basic try/catch.
+result = try
+ 10
+finally
+ 15
+
+ok result is 10
+
+result = try
+ throw 'up'
+catch err
+ err.length
+
+ok result is 2
+
+
+result = try throw 'error' catch err then err.length
+
+ok result is 5
+
+try throw 'catch is optional'
+
+# try/catch with empty clauses still compiles.
+try
+
+try
+ # nothing
+catch err
+ # nothing
+
+try
+ # nothing
+finally
+ # nothing
+
+try
+catch err
+finally
+
+ok yes
diff --git a/node_modules/jade/support/coffee-script/test/test_while.coffee b/node_modules/jade/support/coffee-script/test/test_while.coffee
new file mode 100644
index 0000000..3e3a83f
--- /dev/null
+++ b/node_modules/jade/support/coffee-script/test/test_while.coffee
@@ -0,0 +1,53 @@
+i = 5
+list = while i -= 1
+ i * 2
+
+ok list.join(' ') is "8 6 4 2"
+
+
+i = 5
+list = (i * 3 while i -= 1)
+
+ok list.join(' ') is "12 9 6 3"
+
+
+i = 5
+func = (num) -> i -= num
+assert = -> ok i < 5 > 0
+
+results = while func 1
+ assert()
+ i
+
+ok results.join(' ') is '4 3 2 1'
+
+
+i = 10
+results = while i -= 1 when i % 2 is 0
+ i * 2
+
+ok results.join(' ') is '16 12 8 4'
+
+
+value = false
+i = 0
+results = until value
+ value = true if i is 5
+ i += 1
+
+ok i is 6
+
+
+# And, the loop form of while.
+i = 5
+list = []
+loop
+ i -= 1
+ break if i is 0
+ list.push i * 2
+
+ok list.join(' ') is '8 6 4 2'
+
+
+#759: `if` within `while` condition
+2 while if 1 then 0
diff --git a/node_modules/jade/support/compile.js b/node_modules/jade/support/compile.js
new file mode 100644
index 0000000..4a70058
--- /dev/null
+++ b/node_modules/jade/support/compile.js
@@ -0,0 +1,173 @@
+
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs');
+
+/**
+ * Arguments.
+ */
+
+var args = process.argv.slice(2)
+ , pending = args.length
+ , files = {};
+
+console.log('');
+
+// parse arguments
+
+args.forEach(function(file){
+ var mod = file.replace('lib/', '');
+ fs.readFile(file, 'utf8', function(err, js){
+ if (err) throw err;
+ console.log(' \033[90mcompile : \033[0m\033[36m%s\033[0m', file);
+ files[file] = parse(js);
+ --pending || compile();
+ });
+});
+
+/**
+ * Parse the given `js`.
+ */
+
+function parse(js) {
+ return parseInheritance(parseConditionals(js));
+}
+
+/**
+ * Parse __proto__.
+ */
+
+function parseInheritance(js) {
+ return js
+ .replace(/^ *(\w+)\.prototype\.__proto__ * = *(\w+)\.prototype *;?/gm, function(_, child, parent){
+ return child + '.prototype = new ' + parent + ';\n'
+ + child + '.prototype.constructor = '+ child + ';\n';
+ });
+}
+
+/**
+ * Parse the given `js`, currently supporting:
+ *
+ * 'if' ['node' | 'browser']
+ * 'end'
+ *
+ */
+
+function parseConditionals(js) {
+ var lines = js.split('\n')
+ , len = lines.length
+ , buffer = true
+ , browser = false
+ , buf = []
+ , line
+ , cond;
+
+ for (var i = 0; i < len; ++i) {
+ line = lines[i];
+ if (/^ *\/\/ *if *(node|browser)/gm.exec(line)) {
+ cond = RegExp.$1;
+ buffer = browser = 'browser' == cond;
+ } else if (/^ *\/\/ *end/.test(line)) {
+ buffer = true;
+ browser = false;
+ } else if (browser) {
+ buf.push(line.replace(/^( *)\/\//, '$1'));
+ } else if (buffer) {
+ buf.push(line);
+ }
+ }
+
+ return buf.join('\n');
+}
+
+/**
+ * Compile the files.
+ */
+
+function compile() {
+ var buf = '';
+ buf += '\n// CommonJS require()\n\n';
+ buf += browser.require + '\n\n';
+ buf += 'require.modules = {};\n\n';
+ buf += 'require.resolve = ' + browser.resolve + ';\n\n';
+ buf += 'require.register = ' + browser.register + ';\n\n';
+ buf += 'require.relative = ' + browser.relative + ';\n\n';
+ args.forEach(function(file){
+ var js = files[file];
+ file = file.replace('lib/', '');
+ buf += '\nrequire.register("' + file + '", function(module, exports, require){\n';
+ buf += js;
+ buf += '\n}); // module: ' + file + '\n';
+ });
+ fs.writeFile('jade.js', buf, function(err){
+ if (err) throw err;
+ console.log(' \033[90m create : \033[0m\033[36m%s\033[0m', 'jade.js');
+ console.log();
+ });
+}
+
+// refactored version of weepy's
+// https://github.com/weepy/brequire/blob/master/browser/brequire.js
+
+var browser = {
+
+ /**
+ * Require a module.
+ */
+
+ require: function require(p){
+ var path = require.resolve(p)
+ , mod = require.modules[path];
+ if (!mod) throw new Error('failed to require "' + p + '"');
+ if (!mod.exports) {
+ mod.exports = {};
+ mod.call(mod.exports, mod, mod.exports, require.relative(path));
+ }
+ return mod.exports;
+ },
+
+ /**
+ * Resolve module path.
+ */
+
+ resolve: function(path){
+ var orig = path
+ , reg = path + '.js'
+ , index = path + '/index.js';
+ return require.modules[reg] && reg
+ || require.modules[index] && index
+ || orig;
+ },
+
+ /**
+ * Return relative require().
+ */
+
+ relative: function(parent) {
+ return function(p){
+ if ('.' != p[0]) return require(p);
+
+ var path = parent.split('/')
+ , segs = p.split('/');
+ path.pop();
+
+ for (var i = 0; i < segs.length; i++) {
+ var seg = segs[i];
+ if ('..' == seg) path.pop();
+ else if ('.' != seg) path.push(seg);
+ }
+
+ return require(path.join('/'));
+ };
+ },
+
+ /**
+ * Register a module.
+ */
+
+ register: function(path, fn){
+ require.modules[path] = fn;
+ }
+};
\ No newline at end of file
diff --git a/node_modules/jade/support/expresso/.gitignore b/node_modules/jade/support/expresso/.gitignore
new file mode 100644
index 0000000..432563f
--- /dev/null
+++ b/node_modules/jade/support/expresso/.gitignore
@@ -0,0 +1,3 @@
+.DS_Store
+lib-cov
+*.seed
\ No newline at end of file
diff --git a/node_modules/jade/support/expresso/.gitmodules b/node_modules/jade/support/expresso/.gitmodules
new file mode 100644
index 0000000..191ddeb
--- /dev/null
+++ b/node_modules/jade/support/expresso/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "deps/jscoverage"]
+ path = deps/jscoverage
+ url = git://github.com/visionmedia/node-jscoverage.git
diff --git a/node_modules/jade/support/expresso/History.md b/node_modules/jade/support/expresso/History.md
new file mode 100644
index 0000000..1989eca
--- /dev/null
+++ b/node_modules/jade/support/expresso/History.md
@@ -0,0 +1,97 @@
+
+0.6.2 / 2010-09-17
+==================
+
+ * Added _node-jsocoverage_ to package.json (aka will respect npm's binroot)
+ * Added _-t, --timeout_ MS option, defaulting to 2000 ms
+ * Added _-s, --serial_
+ * __PREFIX__ clobberable
+ * Fixed `assert.response()` for latest node
+ * Fixed cov reporting from exploding on empty files
+
+0.6.2 / 2010-08-03
+==================
+
+ * Added `assert.type()`
+ * Renamed `assert.isNotUndefined()` to `assert.isDefined()`
+ * Fixed `assert.includes()` param ordering
+
+0.6.0 / 2010-07-31
+==================
+
+ * Added _docs/api.html_
+ * Added -w, --watch
+ * Added `Array` support to `assert.includes()`
+ * Added; outputting exceptions immediately. Closes #19
+ * Fixed `assert.includes()` param ordering
+ * Fixed `assert.length()` param ordering
+ * Fixed jscoverage links
+
+0.5.0 / 2010-07-16
+==================
+
+ * Added support for async exports
+ * Added timeout support to `assert.response()`. Closes #3
+ * Added 4th arg callback support to `assert.response()`
+ * Added `assert.length()`
+ * Added `assert.match()`
+ * Added `assert.isUndefined()`
+ * Added `assert.isNull()`
+ * Added `assert.includes()`
+ * Added growlnotify support via -g, --growl
+ * Added -o, --only TESTS. Ex: --only "test foo()" --only "test foo(), test bar()"
+ * Removed profanity
+
+0.4.0 / 2010-07-09
+==================
+
+ * Added reporting source coverage (respects --boring for color haters)
+ * Added callback to assert.response(). Closes #12
+ * Fixed; putting exceptions to stderr. Closes #13
+
+0.3.1 / 2010-06-28
+==================
+
+ * Faster assert.response()
+
+0.3.0 / 2010-06-28
+==================
+
+ * Added -p, --port NUM flags
+ * Added assert.response(). Closes #11
+
+0.2.1 / 2010-06-25
+==================
+
+ * Fixed issue with reporting object assertions
+
+0.2.0 / 2010-06-21
+==================
+
+ * Added `make uninstall`
+ * Added better readdir() failure message
+ * Fixed `make install` for kiwi
+
+0.1.0 / 2010-06-15
+==================
+
+ * Added better usage docs via --help
+ * Added better conditional color support
+ * Added pre exit assertion support
+
+0.0.3 / 2010-06-02
+==================
+
+ * Added more room for filenames in test coverage
+ * Added boring output support via --boring (suppress colored output)
+ * Fixed async failure exit status
+
+0.0.2 / 2010-05-30
+==================
+
+ * Fixed exit status for CI support
+
+0.0.1 / 2010-05-30
+==================
+
+ * Initial release
\ No newline at end of file
diff --git a/node_modules/jade/support/expresso/Makefile b/node_modules/jade/support/expresso/Makefile
new file mode 100644
index 0000000..8acfe56
--- /dev/null
+++ b/node_modules/jade/support/expresso/Makefile
@@ -0,0 +1,53 @@
+
+PREFIX ?= /usr/local
+BIN = bin/expresso
+JSCOV = deps/jscoverage/node-jscoverage
+DOCS = docs/index.md
+HTMLDOCS = $(DOCS:.md=.html)
+
+test: $(BIN)
+ @./$(BIN) -I lib --growl $(TEST_FLAGS) test/*.test.js
+
+test-cov:
+ @./$(BIN) -I lib --cov $(TEST_FLAGS) test/*.test.js
+
+test-serial:
+ @./$(BIN) --serial -I lib $(TEST_FLAGS) test/serial/*.test.js
+
+install: install-jscov install-expresso
+
+uninstall:
+ rm -f $(PREFIX)/bin/expresso
+ rm -f $(PREFIX)/bin/node-jscoverage
+
+install-jscov: $(JSCOV)
+ install $(JSCOV) $(PREFIX)/bin
+
+install-expresso:
+ install $(BIN) $(PREFIX)/bin
+
+$(JSCOV):
+ cd deps/jscoverage && ./configure && make && mv jscoverage node-jscoverage
+
+clean:
+ @cd deps/jscoverage && git clean -fd
+
+docs: docs/api.html $(HTMLDOCS)
+
+%.html: %.md
+ @echo "... $< > $@"
+ @ronn -5 --pipe --fragment $< \
+ | cat docs/layout/head.html - docs/layout/foot.html \
+ > $@
+
+docs/api.html: bin/expresso
+ dox \
+ --title "Expresso" \
+ --ribbon "http://github.com/visionmedia/expresso" \
+ --desc "Insanely fast TDD framework for [node](http://nodejs.org) featuring code coverage reporting." \
+ $< > $@
+
+docclean:
+ rm -f docs/*.html
+
+.PHONY: test test-cov install uninstall install-expresso install-jscov clean docs docclean
\ No newline at end of file
diff --git a/node_modules/jade/support/expresso/Readme.md b/node_modules/jade/support/expresso/Readme.md
new file mode 100644
index 0000000..dcc1c85
--- /dev/null
+++ b/node_modules/jade/support/expresso/Readme.md
@@ -0,0 +1,39 @@
+
+# Expresso
+
+ TDD framework for [nodejs](http://nodejs.org).
+
+## Features
+
+ - light-weight
+ - intuitive async support
+ - intuitive test runner executable
+ - test coverage support and reporting
+ - uses the _assert_ module
+ - `assert.eql()` alias of `assert.deepEqual()`
+ - `assert.response()` http response utility
+ - `assert.includes()`
+ - `assert.type()`
+ - `assert.isNull()`
+ - `assert.isUndefined()`
+ - `assert.isNotNull()`
+ - `assert.isDefined()`
+ - `assert.match()`
+ - `assert.length()`
+
+## Installation
+
+To install both expresso _and_ node-jscoverage run:
+
+ $ make install
+
+To install expresso alone (no build required) run:
+
+ $ make install-expresso
+
+Install via npm:
+
+ $ npm install expresso
+
+
+
diff --git a/node_modules/jade/support/expresso/bin/expresso b/node_modules/jade/support/expresso/bin/expresso
new file mode 100755
index 0000000..8366c61
--- /dev/null
+++ b/node_modules/jade/support/expresso/bin/expresso
@@ -0,0 +1,837 @@
+#!/usr/bin/env node
+
+/*!
+ * Expresso
+ * Copyright(c) TJ Holowaychuk
+ * (MIT Licensed)
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var assert = require('assert'),
+ childProcess = require('child_process'),
+ http = require('http'),
+ path = require('path'),
+ sys = require('sys'),
+ cwd = process.cwd(),
+ fs = require('fs'),
+ defer;
+
+/**
+ * Expresso version.
+ */
+
+var version = '0.6.2';
+
+/**
+ * Failure count.
+ */
+
+var failures = 0;
+
+
+/**
+ * Number of tests executed.
+ */
+
+var testcount = 0;
+
+/**
+ * Whitelist of tests to run.
+ */
+
+var only = [];
+
+/**
+ * Boring output.
+ */
+
+var boring = false;
+
+/**
+ * Growl notifications.
+ */
+
+var growl = false;
+
+/**
+ * Server port.
+ */
+
+var port = 5555;
+
+/**
+ * Watch mode.
+ */
+
+var watch = false;
+
+/**
+ * Execute serially.
+ */
+
+var serial = false;
+
+/**
+ * Default timeout.
+ */
+
+var timeout = 2000;
+
+/**
+ * Usage documentation.
+ */
+
+var usage = ''
+ + '[bold]{Usage}: expresso [options] '
+ + '\n'
+ + '\n[bold]{Options}:'
+ + '\n -w, --watch Watch for modifications and re-execute tests'
+ + '\n -g, --growl Enable growl notifications'
+ + '\n -c, --coverage Generate and report test coverage'
+ + '\n -t, --timeout MS Timeout in milliseconds, defaults to 2000'
+ + '\n -r, --require PATH Require the given module path'
+ + '\n -o, --only TESTS Execute only the comma sperated TESTS (can be set several times)'
+ + '\n -I, --include PATH Unshift the given path to require.paths'
+ + '\n -p, --port NUM Port number for test servers, starts at 5555'
+ + '\n -s, --serial Execute tests serially'
+ + '\n -b, --boring Suppress ansi-escape colors'
+ + '\n -v, --version Output version number'
+ + '\n -h, --help Display help information'
+ + '\n';
+
+// Parse arguments
+
+var files = [],
+ args = process.argv.slice(2);
+
+while (args.length) {
+ var arg = args.shift();
+ switch (arg) {
+ case '-h':
+ case '--help':
+ print(usage + '\n');
+ process.exit(1);
+ break;
+ case '-v':
+ case '--version':
+ sys.puts(version);
+ process.exit(1);
+ break;
+ case '-i':
+ case '-I':
+ case '--include':
+ if (arg = args.shift()) {
+ require.paths.unshift(arg);
+ } else {
+ throw new Error('--include requires a path');
+ }
+ break;
+ case '-o':
+ case '--only':
+ if (arg = args.shift()) {
+ only = only.concat(arg.split(/ *, */));
+ } else {
+ throw new Error('--only requires comma-separated test names');
+ }
+ break;
+ case '-p':
+ case '--port':
+ if (arg = args.shift()) {
+ port = parseInt(arg, 10);
+ } else {
+ throw new Error('--port requires a number');
+ }
+ break;
+ case '-r':
+ case '--require':
+ if (arg = args.shift()) {
+ require(arg);
+ } else {
+ throw new Error('--require requires a path');
+ }
+ break;
+ case '-t':
+ case '--timeout':
+ if (arg = args.shift()) {
+ timeout = parseInt(arg, 10);
+ } else {
+ throw new Error('--timeout requires an argument');
+ }
+ break;
+ case '-c':
+ case '--cov':
+ case '--coverage':
+ defer = true;
+ childProcess.exec('rm -fr lib-cov && node-jscoverage lib lib-cov', function(err){
+ if (err) throw err;
+ require.paths.unshift('lib-cov');
+ run(files);
+ })
+ break;
+ case '-b':
+ case '--boring':
+ boring = true;
+ break;
+ case '-w':
+ case '--watch':
+ watch = true;
+ break;
+ case '-g':
+ case '--growl':
+ growl = true;
+ break;
+ case '-s':
+ case '--serial':
+ serial = true;
+ break;
+ default:
+ if (/\.js$/.test(arg)) {
+ files.push(arg);
+ }
+ break;
+ }
+}
+
+/**
+ * Colorized sys.error().
+ *
+ * @param {String} str
+ */
+
+function print(str){
+ sys.error(colorize(str));
+}
+
+/**
+ * Colorize the given string using ansi-escape sequences.
+ * Disabled when --boring is set.
+ *
+ * @param {String} str
+ * @return {String}
+ */
+
+function colorize(str){
+ var colors = { bold: 1, red: 31, green: 32, yellow: 33 };
+ return str.replace(/\[(\w+)\]\{([^]*?)\}/g, function(_, color, str){
+ return boring
+ ? str
+ : '\x1B[' + colors[color] + 'm' + str + '\x1B[0m';
+ });
+}
+
+// Alias deepEqual as eql for complex equality
+
+assert.eql = assert.deepEqual;
+
+/**
+ * Assert that `val` is null.
+ *
+ * @param {Mixed} val
+ * @param {String} msg
+ */
+
+assert.isNull = function(val, msg) {
+ assert.strictEqual(null, val, msg);
+};
+
+/**
+ * Assert that `val` is not null.
+ *
+ * @param {Mixed} val
+ * @param {String} msg
+ */
+
+assert.isNotNull = function(val, msg) {
+ assert.notStrictEqual(null, val, msg);
+};
+
+/**
+ * Assert that `val` is undefined.
+ *
+ * @param {Mixed} val
+ * @param {String} msg
+ */
+
+assert.isUndefined = function(val, msg) {
+ assert.strictEqual(undefined, val, msg);
+};
+
+/**
+ * Assert that `val` is not undefined.
+ *
+ * @param {Mixed} val
+ * @param {String} msg
+ */
+
+assert.isDefined = function(val, msg) {
+ assert.notStrictEqual(undefined, val, msg);
+};
+
+/**
+ * Assert that `obj` is `type`.
+ *
+ * @param {Mixed} obj
+ * @param {String} type
+ * @api public
+ */
+
+assert.type = function(obj, type, msg){
+ var real = typeof obj;
+ msg = msg || 'typeof ' + sys.inspect(obj) + ' is ' + real + ', expected ' + type;
+ assert.ok(type === real, msg);
+};
+
+/**
+ * Assert that `str` matches `regexp`.
+ *
+ * @param {String} str
+ * @param {RegExp} regexp
+ * @param {String} msg
+ */
+
+assert.match = function(str, regexp, msg) {
+ msg = msg || sys.inspect(str) + ' does not match ' + sys.inspect(regexp);
+ assert.ok(regexp.test(str), msg);
+};
+
+/**
+ * Assert that `val` is within `obj`.
+ *
+ * Examples:
+ *
+ * assert.includes('foobar', 'bar');
+ * assert.includes(['foo', 'bar'], 'foo');
+ *
+ * @param {String|Array} obj
+ * @param {Mixed} val
+ * @param {String} msg
+ */
+
+assert.includes = function(obj, val, msg) {
+ msg = msg || sys.inspect(obj) + ' does not include ' + sys.inspect(val);
+ assert.ok(obj.indexOf(val) >= 0, msg);
+};
+
+/**
+ * Assert length of `val` is `n`.
+ *
+ * @param {Mixed} val
+ * @param {Number} n
+ * @param {String} msg
+ */
+
+assert.length = function(val, n, msg) {
+ msg = msg || sys.inspect(val) + ' has length of ' + val.length + ', expected ' + n;
+ assert.equal(n, val.length, msg);
+};
+
+/**
+ * Assert response from `server` with
+ * the given `req` object and `res` assertions object.
+ *
+ * @param {Server} server
+ * @param {Object} req
+ * @param {Object|Function} res
+ * @param {String} msg
+ */
+
+assert.response = function(server, req, res, msg){
+ // Callback as third or fourth arg
+ var callback = typeof res === 'function'
+ ? res
+ : typeof msg === 'function'
+ ? msg
+ : function(){};
+
+ // Default messate to test title
+ if (typeof msg === 'function') msg = null;
+ msg = msg || assert.testTitle;
+ msg += '. ';
+
+ // Pending responses
+ server.__pending = server.__pending || 0;
+ server.__pending++;
+
+ // Create client
+ if (!server.fd) {
+ server.listen(server.__port = port++, '127.0.0.1');
+ server.client = http.createClient(server.__port);
+ }
+
+ // Issue request
+ var timer,
+ client = server.client,
+ method = req.method || 'GET',
+ status = res.status || res.statusCode,
+ data = req.data || req.body,
+ timeout = req.timeout || 0;
+
+ var request = client.request(method, req.url, req.headers);
+
+ // Timeout
+ if (timeout) {
+ timer = setTimeout(function(){
+ --server.__pending || server.close();
+ delete req.timeout;
+ assert.fail(msg + 'Request timed out after ' + timeout + 'ms.');
+ }, timeout);
+ }
+
+ if (data) request.write(data);
+ request.addListener('response', function(response){
+ response.body = '';
+ response.setEncoding('utf8');
+ response.addListener('data', function(chunk){ response.body += chunk; });
+ response.addListener('end', function(){
+ --server.__pending || server.close();
+ if (timer) clearTimeout(timer);
+
+ // Assert response body
+ if (res.body !== undefined) {
+ var eql = res.body instanceof RegExp
+ ? res.body.test(response.body)
+ : res.body === response.body;
+ assert.ok(
+ eql,
+ msg + 'Invalid response body.\n'
+ + ' Expected: ' + sys.inspect(res.body) + '\n'
+ + ' Got: ' + sys.inspect(response.body)
+ );
+ }
+
+ // Assert response status
+ if (typeof status === 'number') {
+ assert.equal(
+ response.statusCode,
+ status,
+ msg + colorize('Invalid response status code.\n'
+ + ' Expected: [green]{' + status + '}\n'
+ + ' Got: [red]{' + response.statusCode + '}')
+ );
+ }
+
+ // Assert response headers
+ if (res.headers) {
+ var keys = Object.keys(res.headers);
+ for (var i = 0, len = keys.length; i < len; ++i) {
+ var name = keys[i],
+ actual = response.headers[name.toLowerCase()],
+ expected = res.headers[name];
+ assert.equal(
+ actual,
+ expected,
+ msg + colorize('Invalid response header [bold]{' + name + '}.\n'
+ + ' Expected: [green]{' + expected + '}\n'
+ + ' Got: [red]{' + actual + '}')
+ );
+ }
+ }
+
+ // Callback
+ callback(response);
+ });
+ });
+ request.end();
+};
+
+/**
+ * Pad the given string to the maximum width provided.
+ *
+ * @param {String} str
+ * @param {Number} width
+ * @return {String}
+ */
+
+function lpad(str, width) {
+ str = String(str);
+ var n = width - str.length;
+ if (n < 1) return str;
+ while (n--) str = ' ' + str;
+ return str;
+}
+
+/**
+ * Pad the given string to the maximum width provided.
+ *
+ * @param {String} str
+ * @param {Number} width
+ * @return {String}
+ */
+
+function rpad(str, width) {
+ str = String(str);
+ var n = width - str.length;
+ if (n < 1) return str;
+ while (n--) str = str + ' ';
+ return str;
+}
+
+/**
+ * Report test coverage.
+ *
+ * @param {Object} cov
+ */
+
+function reportCoverage(cov) {
+ populateCoverage(cov);
+ // Stats
+ print('\n [bold]{Test Coverage}\n');
+ var sep = ' +------------------------------------------+----------+------+------+--------+',
+ lastSep = ' +----------+------+------+--------+';
+ sys.puts(sep);
+ sys.puts(' | filename | coverage | LOC | SLOC | missed |');
+ sys.puts(sep);
+ for (var name in cov) {
+ var file = cov[name];
+ if (Array.isArray(file)) {
+ sys.print(' | ' + rpad(name, 40));
+ sys.print(' | ' + lpad(file.coverage.toFixed(2), 8));
+ sys.print(' | ' + lpad(file.LOC, 4));
+ sys.print(' | ' + lpad(file.SLOC, 4));
+ sys.print(' | ' + lpad(file.totalMisses, 6));
+ sys.print(' |\n');
+ }
+ }
+ sys.puts(sep);
+ sys.print(' ' + rpad('', 40));
+ sys.print(' | ' + lpad(cov.coverage.toFixed(2), 8));
+ sys.print(' | ' + lpad(cov.LOC, 4));
+ sys.print(' | ' + lpad(cov.SLOC, 4));
+ sys.print(' | ' + lpad(cov.totalMisses, 6));
+ sys.print(' |\n');
+ sys.puts(lastSep);
+ // Source
+ for (var name in cov) {
+ if (name.match(/\.js$/)) {
+ var file = cov[name];
+ print('\n [bold]{' + name + '}:');
+ print(file.source);
+ sys.print('\n');
+ }
+ }
+}
+
+/**
+ * Populate code coverage data.
+ *
+ * @param {Object} cov
+ */
+
+function populateCoverage(cov) {
+ cov.LOC =
+ cov.SLOC =
+ cov.totalFiles =
+ cov.totalHits =
+ cov.totalMisses =
+ cov.coverage = 0;
+ for (var name in cov) {
+ var file = cov[name];
+ if (Array.isArray(file)) {
+ // Stats
+ ++cov.totalFiles;
+ cov.totalHits += file.totalHits = coverage(file, true);
+ cov.totalMisses += file.totalMisses = coverage(file, false);
+ file.totalLines = file.totalHits + file.totalMisses;
+ cov.SLOC += file.SLOC = file.totalLines;
+ if (!file.source) file.source = [];
+ cov.LOC += file.LOC = file.source.length;
+ file.coverage = (file.totalHits / file.totalLines) * 100;
+ // Source
+ var width = file.source.length.toString().length;
+ file.source = file.source.map(function(line, i){
+ ++i;
+ var hits = file[i] === 0 ? 0 : (file[i] || ' ');
+ if (!boring) {
+ if (hits === 0) {
+ hits = '\x1b[31m' + hits + '\x1b[0m';
+ line = '\x1b[41m' + line + '\x1b[0m';
+ } else {
+ hits = '\x1b[32m' + hits + '\x1b[0m';
+ }
+ }
+ return '\n ' + lpad(i, width) + ' | ' + hits + ' | ' + line;
+ }).join('');
+ }
+ }
+ cov.coverage = (cov.totalHits / cov.SLOC) * 100;
+}
+
+/**
+ * Total coverage for the given file data.
+ *
+ * @param {Array} data
+ * @return {Type}
+ */
+
+function coverage(data, val) {
+ var n = 0;
+ for (var i = 0, len = data.length; i < len; ++i) {
+ if (data[i] !== undefined && data[i] == val) ++n;
+ }
+ return n;
+}
+
+/**
+ * Run the given test `files`, or try _test/*_.
+ *
+ * @param {Array} files
+ */
+
+function run(files) {
+ if (!files.length) {
+ try {
+ files = fs.readdirSync('test').map(function(file){
+ return 'test/' + file;
+ });
+ } catch (err) {
+ print('\n failed to load tests in [bold]{./test}\n');
+ ++failures;
+ process.exit(1);
+ }
+ }
+ if (watch) watchFiles(files);
+ runFiles(files);
+}
+
+/**
+ * Show the cursor when `show` is true, otherwise hide it.
+ *
+ * @param {Boolean} show
+ */
+
+function cursor(show) {
+ if (show) {
+ sys.print('\x1b[?25h');
+ } else {
+ sys.print('\x1b[?25l');
+ }
+}
+
+/**
+ * Run the given test `files`.
+ *
+ * @param {Array} files
+ */
+
+function runFiles(files) {
+ files.forEach(runFile);
+}
+
+/**
+ * Run tests for the given `file`.
+ *
+ * @param {String} file
+ */
+
+function runFile(file) {
+ if (file.match(/\.js$/)) {
+ var title = path.basename(file),
+ file = path.join(cwd, file),
+ mod = require(file.replace(/\.js$/, ''));
+ (function check(){
+ var len = Object.keys(mod).length;
+ if (len) {
+ runSuite(title, mod);
+ } else {
+ setTimeout(check, 20);
+ }
+ })();
+ }
+}
+
+/**
+ * Clear the module cache for the given `file`.
+ *
+ * @param {String} file
+ */
+
+function clearCache(file) {
+ var keys = Object.keys(module.moduleCache);
+ for (var i = 0, len = keys.length; i < len; ++i) {
+ var key = keys[i];
+ if (key.indexOf(file) === key.length - file.length) {
+ delete module.moduleCache[key];
+ }
+ }
+}
+
+/**
+ * Watch the given `files` for changes.
+ *
+ * @param {Array} files
+ */
+
+function watchFiles(files) {
+ var p = 0,
+ c = ['▫ ', '▫▫ ', '▫▫▫ ', ' ▫▫▫',
+ ' ▫▫', ' ▫', ' ▫', ' ▫▫',
+ '▫▫▫ ', '▫▫ ', '▫ '],
+ l = c.length;
+ cursor(false);
+ setInterval(function(){
+ sys.print(colorize(' [green]{' + c[p++ % l] + '} watching\r'));
+ }, 100);
+ files.forEach(function(file){
+ fs.watchFile(file, { interval: 100 }, function(curr, prev){
+ if (curr.mtime > prev.mtime) {
+ print(' [yellow]{◦} ' + file);
+ clearCache(file);
+ runFile(file);
+ }
+ });
+ });
+}
+
+/**
+ * Report `err` for the given `test` and `suite`.
+ *
+ * @param {String} suite
+ * @param {String} test
+ * @param {Error} err
+ */
+
+function error(suite, test, err) {
+ ++failures;
+ var name = err.name,
+ stack = err.stack.replace(err.name, ''),
+ label = test === 'uncaught'
+ ? test
+ : suite + ' ' + test;
+ print('\n [bold]{' + label + '}: [red]{' + name + '}' + stack + '\n');
+ if (watch) notify(label + ' failed');
+}
+
+/**
+ * Run the given tests.
+ *
+ * @param {String} title
+ * @param {Object} tests
+ */
+
+var dots = 0;
+function runSuite(title, tests) {
+ // Keys
+ var keys = only.length
+ ? only.slice(0)
+ : Object.keys(tests);
+
+ // Setup
+ var setup = tests.setup || function(fn){ fn(); };
+
+ // Iterate tests
+ (function next(){
+ if (keys.length) {
+ var key,
+ test = tests[key = keys.shift()];
+ // Non-tests
+ if (key === 'setup') return next();
+
+ // Run test
+ if (test) {
+ try {
+ ++testcount;
+ assert.testTitle = key;
+ if (serial) {
+ if (!watch) {
+ sys.print('.');
+ if (++dots % 25 === 0) sys.print('\n');
+ }
+ setup(function(){
+ if (test.length < 2) {
+ test(assert);
+ next();
+ } else {
+ var id = setTimeout(function(){
+ throw new Error("'" + key + "' timed out");
+ }, timeout);
+ test(assert, function(){
+ clearTimeout(id);
+ next();
+ });
+ }
+ });
+ } else {
+ test(assert, function(fn){
+ process.addListener('beforeExit', function(){
+ try {
+ fn();
+ } catch (err) {
+ error(title, key, err);
+ }
+ });
+ });
+ }
+ } catch (err) {
+ error(title, key, err);
+ }
+ }
+ if (!serial) next();
+ }
+ })();
+}
+
+/**
+ * Report exceptions.
+ */
+
+function report() {
+ process.emit('beforeExit');
+ if (failures) {
+ print('\n [bold]{Failures}: [red]{' + failures + '}\n\n');
+ notify('Failures: ' + failures);
+ } else {
+ if (serial) print('');
+ print('\n [green]{100%} ' + testcount + ' tests\n');
+ notify('100% ok');
+ }
+ if (typeof _$jscoverage === 'object') {
+ reportCoverage(_$jscoverage);
+ }
+}
+
+/**
+ * Growl notify the given `msg`.
+ *
+ * @param {String} msg
+ */
+
+function notify(msg) {
+ if (growl) {
+ childProcess.exec('growlnotify -name Expresso -m "' + msg + '"');
+ }
+}
+
+// Report uncaught exceptions
+
+process.addListener('uncaughtException', function(err){
+ error('uncaught', 'uncaught', err);
+});
+
+// Show cursor
+
+['INT', 'TERM', 'QUIT'].forEach(function(sig){
+ process.addListener('SIG' + sig, function(){
+ cursor(true);
+ process.exit(1);
+ });
+});
+
+// Report test coverage when available
+// and emit "beforeExit" event to perform
+// final assertions
+
+var orig = process.emit;
+process.emit = function(event){
+ if (event === 'exit') {
+ report();
+ process.reallyExit(failures);
+ }
+ orig.apply(this, arguments);
+};
+
+// Run test files
+
+if (!defer) run(files);
diff --git a/node_modules/jade/support/expresso/docs/api.html b/node_modules/jade/support/expresso/docs/api.html
new file mode 100644
index 0000000..8718732
--- /dev/null
+++ b/node_modules/jade/support/expresso/docs/api.html
@@ -0,0 +1,1048 @@
+
+
+ Expresso
+
+
+
+
+
+
Expresso
Insanely fast TDD framework for node featuring code coverage reporting.
functionnotify(msg) {
+ if (growl) {
+ childProcess.exec('growlnotify -name Expresso -m "' + msg + '"');
+ }
+}
+
+// Report uncaught exceptions
+
+process.addListener('uncaughtException', function(err){
+ error('uncaught', 'uncaught', err);
+});
+
+// Show cursor
+
+['INT', 'TERM', 'QUIT'].forEach(function(sig){
+ process.addListener('SIG' + sig, function(){
+ cursor(true);
+ process.exit(1);
+ });
+});
+
+// Report test coverage when available
+// and emit "beforeExit" event to perform
+// final assertions
+
+varorig = process.emit;
+process.emit = function(event){
+ if (event === 'exit') {
+ report();
+ process.reallyExit(failures);
+ }
+ orig.apply(this, arguments);
+};
+
+// Run test files
+
+if (!defer) run(files);
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/jade/support/expresso/docs/index.html b/node_modules/jade/support/expresso/docs/index.html
new file mode 100644
index 0000000..49d8148
--- /dev/null
+++ b/node_modules/jade/support/expresso/docs/index.html
@@ -0,0 +1,373 @@
+
+
+ Expresso - TDD Framework For Node
+
+
+
+
+
+
+
+
Expresso
+
+
Expresso is a JavaScript TDD framework written for nodejs. Expresso is extremely fast, and is packed with features such as additional assertion methods, code coverage reporting, CI support, and more.
Assert that object b is equal to object a. This is an
+alias for the core assert.deepEqual() method which does complex
+comparisons, opposed to assert.equal() which uses ==.
Performs assertions on the given server, which should not call
+listen(), as this is handled internally by expresso and the server
+is killed after all responses have completed. This method works with
+any http.Server instance, so Connect and Express servers will work
+as well.
+
+
The req object may contain:
+
+
+
url request url
+
timeout timeout in milliseconds
+
method HTTP method
+
data request body
+
headers headers object
+
+
+
+
The res object may be a callback function which
+receives the response for assertions, or an object
+which is then used to perform several assertions
+on the response with the following properties:
+
+
+
body assert response body
+
status assert response status code
+
header assert that all given headers match (unspecified are ignored)
+
+
+
+
When providing res you may then also pass a callback function
+as the fourth argument for additional assertions.
To run several suites we may simply append another:
+
+
$ expresso test/a.test.js test/b.test.js
+
+
+
We can also pass a whitelist of tests to run within all suites:
+
+
$ expresso --only "foo()" --only "bar()"
+
+
+
Or several with one call:
+
+
$ expresso --only "foo(), bar()"
+
+
+
Globbing is of course possible as well:
+
+
$ expresso test/*
+
+
+
When expresso is called without any files, test/* is the default,
+so the following is equivalent to the command above:
+
+
$ expresso
+
+
+
If you wish to unshift a path to require.paths before
+running tests, you may use the -I or --include flag.
+
+
$ expresso --include lib test/*
+
+
+
The previous example is typically what I would recommend, since expresso
+supports test coverage via node-jscoverage (bundled with expresso),
+so you will need to expose an instrumented version of you library.
+
+
To instrument your library, simply run node-jscoverage,
+passing the src and dest directories:
+
+
$ node-jscoverage lib lib-cov
+
+
+
Now we can run our tests again, using the lib-cov directory that has been
+instrumented with coverage statements:
+
+
$ expresso -I lib-cov test/*
+
+
+
The output will look similar to below, depending on your test coverage of course :)
+
+
+
+
To make this process easier expresso has the -c or --cov which essentially
+does the same as the two commands above. The following two commands will
+run the same tests, however one will auto-instrument, and unshift lib-cov,
+and the other will run tests normally:
Currently coverage is bound to the lib directory, however in the
+future --cov will most likely accept a path.
+
+
Async Exports
+
+
Sometimes it is useful to postpone running of tests until a callback or event has fired, currently the exports.foo = function(){}; syntax is supported for this:
+
+
\ No newline at end of file
diff --git a/node_modules/jade/support/expresso/docs/index.md b/node_modules/jade/support/expresso/docs/index.md
new file mode 100644
index 0000000..5376e59
--- /dev/null
+++ b/node_modules/jade/support/expresso/docs/index.md
@@ -0,0 +1,290 @@
+
+[Expresso](http://github.com/visionmedia/expresso) is a JavaScript [TDD](http://en.wikipedia.org/wiki/Test-driven_development) framework written for [nodejs](http://nodejs.org). Expresso is extremely fast, and is packed with features such as additional assertion methods, code coverage reporting, CI support, and more.
+
+## Features
+
+ - light-weight
+ - intuitive async support
+ - intuitive test runner executable
+ - test coverage support and reporting via [node-jscoverage](http://github.com/visionmedia/node-jscoverage)
+ - uses and extends the core _assert_ module
+ - `assert.eql()` alias of `assert.deepEqual()`
+ - `assert.response()` http response utility
+ - `assert.includes()`
+ - `assert.isNull()`
+ - `assert.isUndefined()`
+ - `assert.isNotNull()`
+ - `assert.isDefined()`
+ - `assert.match()`
+ - `assert.length()`
+
+## Installation
+
+To install both expresso _and_ node-jscoverage run
+the command below, which will first compile node-jscoverage:
+
+ $ make install
+
+To install expresso alone without coverage reporting run:
+
+ $ make install-expresso
+
+Install via npm:
+
+ $ npm install expresso
+
+## Examples
+
+To define tests we simply export several functions:
+
+ exports['test String#length'] = function(assert){
+ assert.equal(6, 'foobar'.length);
+ };
+
+Alternatively for large numbers of tests you may want to
+export your own object containing the tests, however this
+is essentially the as above:
+
+ module.exports = {
+ 'test String#length': function(assert){
+ assert.equal(6, 'foobar'.length);
+ }
+ };
+
+If you prefer not to use quoted keys:
+
+ exports.testsStringLength = function(assert){
+ assert.equal(6, 'foobar'.length);
+ };
+
+The second argument passed to each callback is _beforeExit_,
+which is typically used to assert that callbacks have been
+invoked.
+
+ exports.testAsync = function(assert, beforeExit){
+ var n = 0;
+ setTimeout(function(){
+ ++n;
+ assert.ok(true);
+ }, 200);
+ setTimeout(function(){
+ ++n;
+ assert.ok(true);
+ }, 200);
+ beforeExit(function(){
+ assert.equal(2, n, 'Ensure both timeouts are called');
+ });
+ };
+
+## Assert Utilities
+
+### assert.isNull(val[, msg])
+
+Asserts that the given _val_ is _null_.
+
+ assert.isNull(null);
+
+### assert.isNotNull(val[, msg])
+
+Asserts that the given _val_ is not _null_.
+
+ assert.isNotNull(undefined);
+ assert.isNotNull(false);
+
+### assert.isUndefined(val[, msg])
+
+Asserts that the given _val_ is _undefined_.
+
+ assert.isUndefined(undefined);
+
+### assert.isDefined(val[, msg])
+
+Asserts that the given _val_ is not _undefined_.
+
+ assert.isDefined(null);
+ assert.isDefined(false);
+
+### assert.match(str, regexp[, msg])
+
+Asserts that the given _str_ matches _regexp_.
+
+ assert.match('foobar', /^foo(bar)?/);
+ assert.match('foo', /^foo(bar)?/);
+
+### assert.length(val, n[, msg])
+
+Assert that the given _val_ has a length of _n_.
+
+ assert.length([1,2,3], 3);
+ assert.length('foo', 3);
+
+### assert.type(obj, type[, msg])
+
+Assert that the given _obj_ is typeof _type_.
+
+ assert.type(3, 'number');
+
+### assert.eql(a, b[, msg])
+
+Assert that object _b_ is equal to object _a_. This is an
+alias for the core _assert.deepEqual()_ method which does complex
+comparisons, opposed to _assert.equal()_ which uses _==_.
+
+ assert.eql('foo', 'foo');
+ assert.eql([1,2], [1,2]);
+ assert.eql({ foo: 'bar' }, { foo: 'bar' });
+
+### assert.includes(obj, val[, msg])
+
+Assert that _obj_ is within _val_. This method supports _Array_s
+and _Strings_s.
+
+ assert.includes([1,2,3], 3);
+ assert.includes('foobar', 'foo');
+ assert.includes('foobar', 'bar');
+
+### assert.response(server, req, res|fn[, msg|fn])
+
+Performs assertions on the given _server_, which should _not_ call
+listen(), as this is handled internally by expresso and the server
+is killed after all responses have completed. This method works with
+any _http.Server_ instance, so _Connect_ and _Express_ servers will work
+as well.
+
+The _req_ object may contain:
+
+ - _url_ request url
+ - _timeout_ timeout in milliseconds
+ - _method_ HTTP method
+ - _data_ request body
+ - _headers_ headers object
+
+The _res_ object may be a callback function which
+receives the response for assertions, or an object
+which is then used to perform several assertions
+on the response with the following properties:
+
+ - _body_ assert response body
+ - _status_ assert response status code
+ - _header_ assert that all given headers match (unspecified are ignored)
+
+When providing _res_ you may then also pass a callback function
+as the fourth argument for additional assertions.
+
+Below are some examples:
+
+ assert.response(server, {
+ url: '/', timeout: 500
+ }, {
+ body: 'foobar'
+ });
+
+ assert.response(server, {
+ url: '/',
+ method: 'GET'
+ },{
+ body: '{"name":"tj"}',
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json; charset=utf8',
+ 'X-Foo': 'bar'
+ }
+ });
+
+ assert.response(server, {
+ url: '/foo',
+ method: 'POST',
+ data: 'bar baz'
+ },{
+ body: '/foo bar baz',
+ status: 200
+ }, 'Test POST');
+
+ assert.response(server, {
+ url: '/foo',
+ method: 'POST',
+ data: 'bar baz'
+ },{
+ body: '/foo bar baz',
+ status: 200
+ }, function(res){
+ // All done, do some more tests if needed
+ });
+
+ assert.response(server, {
+ url: '/'
+ }, function(res){
+ assert.ok(res.body.indexOf('tj') >= 0, 'Test assert.response() callback');
+ });
+
+
+## expresso(1)
+
+To run a single test suite (file) run:
+
+ $ expresso test/a.test.js
+
+To run several suites we may simply append another:
+
+ $ expresso test/a.test.js test/b.test.js
+
+We can also pass a whitelist of tests to run within all suites:
+
+ $ expresso --only "foo()" --only "bar()"
+
+Or several with one call:
+
+ $ expresso --only "foo(), bar()"
+
+Globbing is of course possible as well:
+
+ $ expresso test/*
+
+When expresso is called without any files, _test/*_ is the default,
+so the following is equivalent to the command above:
+
+ $ expresso
+
+If you wish to unshift a path to `require.paths` before
+running tests, you may use the `-I` or `--include` flag.
+
+ $ expresso --include lib test/*
+
+The previous example is typically what I would recommend, since expresso
+supports test coverage via [node-jscoverage](http://github.com/visionmedia/node-jscoverage) (bundled with expresso),
+so you will need to expose an instrumented version of you library.
+
+To instrument your library, simply run [node-jscoverage](http://github.com/visionmedia/node-jscoverage),
+passing the _src_ and _dest_ directories:
+
+ $ node-jscoverage lib lib-cov
+
+Now we can run our tests again, using the _lib-cov_ directory that has been
+instrumented with coverage statements:
+
+ $ expresso -I lib-cov test/*
+
+The output will look similar to below, depending on your test coverage of course :)
+
+![node coverage](http://dl.dropbox.com/u/6396913/cov.png)
+
+To make this process easier expresso has the _-c_ or _--cov_ which essentially
+does the same as the two commands above. The following two commands will
+run the same tests, however one will auto-instrument, and unshift _lib-cov_,
+and the other will run tests normally:
+
+ $ expresso -I lib test/*
+ $ expresso -I lib --cov test/*
+
+Currently coverage is bound to the _lib_ directory, however in the
+future `--cov` will most likely accept a path.
+
+## Async Exports
+
+Sometimes it is useful to postpone running of tests until a callback or event has fired, currently the _exports.foo = function(){};_ syntax is supported for this:
+
+ setTimeout(function(){
+ exports['test async exports'] = function(assert){
+ assert.ok('wahoo');
+ };
+ }, 100);
diff --git a/node_modules/jade/support/expresso/docs/layout/foot.html b/node_modules/jade/support/expresso/docs/layout/foot.html
new file mode 100644
index 0000000..44d85e9
--- /dev/null
+++ b/node_modules/jade/support/expresso/docs/layout/foot.html
@@ -0,0 +1,3 @@
+
+