diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cf96174 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +*.DS_Store \ No newline at end of file diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 0000000..fdd705c --- /dev/null +++ b/.yarnrc @@ -0,0 +1 @@ +save-prefix "" diff --git a/Cakefile b/Cakefile index 951d120..867e95f 100644 --- a/Cakefile +++ b/Cakefile @@ -1,9 +1,11 @@ -{spawn, exec} = require 'child_process' -fs = require 'fs' -jison = require 'jison' -stitch = require 'stitch' +require 'iced-coffee-script/register' +{spawn, exec} = require 'child_process' +fs = require 'fs' +jison = require 'jison' +path = require 'path' +express_test = require './test/generate_express_test' -task 'build', 'build the whole jam', (cb) -> +task 'build', 'build the whole jam', (cb) -> console.log "Building" files = fs.readdirSync 'src' files = ('src/' + file for file in files when file.match(/\.coffee$/)) @@ -11,26 +13,23 @@ task 'build', 'build the whole jam', (cb) -> buildParser -> runCoffee ['-c', '-o', 'lib/'].concat(files), -> runCoffee ['-c', 'index.coffee'], -> - stitchIt -> - console.log "Done building." - cb() if typeof cb is 'function' + buildCommonBrowserHeaders -> + express_test.generate -> + console.log "Done building." + cb() if typeof cb is 'function' + +task 'test', 'test server and browser support', (cb) -> + run_cases = require './test/run_cases.iced' + run_cases.test -> + console.log "Done." runCoffee = (args, cb) -> - proc = spawn 'coffee', args - console.log args + proc = spawn './node_modules/.bin/coffee', args proc.stderr.on 'data', (buffer) -> console.log buffer.toString() proc.on 'exit', (status) -> - process.exit(1) if status != 0 + process.exit(1) if status isnt 0 cb() if typeof cb is 'function' -stitchIt = (cb) -> - s = stitch.createPackage { paths: ['lib'] } - s.compile (err, source) -> - fs.writeFile 'toffee.js', source, (err) -> - if err then throw err - console.log "Stitched." - cb() - clearLibJs = (cb) -> files = fs.readdirSync 'lib' files = ("lib/#{file}" for file in files when file.match(/\.js$/)) @@ -46,4 +45,10 @@ buildParser = (cb) -> moduleName: 'toffee_lang' } fs.writeFileSync "./lib/#{file_name}", source - cb() \ No newline at end of file + cb() + +buildCommonBrowserHeaders = (cb) -> + {getCommonHeadersJs} = require './lib/view' + headers = getCommonHeadersJs true, true + fs.writeFileSync "./toffee.js", headers, "utf8" + cb() diff --git a/README.md b/README.md index 2e09b35..fa54c1b 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,83 @@ -TOFFEE -========= -A templating language based on CoffeeScript with slick nesting, tokens, and automatic indentation. -Compatible with Express 2.x, 3.x, and the browser. In Express 3.x, the Toffee engine handles partials/includes -and smart view caching. +# TOFFEE -status -====== -Beta! And in very usable shape. +**_Toffee_ is barely maintained. Please consider another templating language.** -examples -======== -Printing variables is easy. Just use CoffeeScript's #{} syntax: -``` -

- Hey, #{user.name}. - #{flirty_welcome_msg} -

+_Toffee_ is a templating language, based on the simplicity and beauty of CoffeeScript. + +- it works with Node.js +- it works in the browser, too -- even the advanced features. + +Newest feature: + +- post-processing! You can let Toffee do your server-side code highighting, and other magic. + +Toffee has many cool features. Keep on reading. + +# Table of Contents + +- [1. Language Basics](#section_1) +- [2. Notes on Escaping](#section_2) +- [3. Common Questions](#section_3) +- [4. Installation & Usage (Node, Express, and the browser)](#section_4) + +## Language Basics + +Printing variables in Toffee is easy. Just use CoffeeScript's #{} syntax: + +```html +
+ Hey, #{user.name}. #{flirty_welcome_msg} +
``` The `#{}` syntax is powerful, so be responsible. -``` -You have #{(f for f in friends when f.gender is "f").length} female friends. +```html +

+ You have #{(sheep for sheep in flock when sheep.color is 'black').length} + black sheep in the flock. +

``` -Including other files is possible thanks to the function `partial`. This works in Express 3.0, too. +Including other files is possible thanks to the function `partial`. This works in both Express and the browser. -``` +```html

- #{partial "navigation.toffee", {username: user.name, age: 22} } + #{partial "navigation.toffee", {username: user.name, age: 22} }

``` But the greatest pleasure arises when you enter -`coffee mode`. Note the `{# ... #}` region. +`coffee mode`. Note the `{# ... #}` region, where you can write multiple lines of CoffeeScript. -``` +```html

- {# - ten_numbers = (Math.random() for i in [0...10]) - ten_numbers.sort (a,b) -> b - a - #} - The largest number I can even think of is #{ten_numbers[0]}. + {# ten_numbers = [1,3,2,4,5,8,6,7,69, Math.random()] ten_numbers.sort (a,b) -> + b - a #} The largest number I can even think of is #{ten_numbers[0]}.

``` -Further, inside `coffee mode`, you can switch back to `toffee mode` with `{: ... :}`. It's endlessly nestable. +Against all odds, inside `coffee mode`, you can switch back to `toffee mode` with `{: ... :}`. It's endlessly nestable. -``` -
-
- {# - if projects.length - for project in projects {: -
- #{project.title} | - #{project.description} - Read more -
- :} - #} -
+```html +
+
+ {# if projects.length for project in projects {: + + :} #} +
``` This bracket and nesting syntax avoids a lot of large, ugly regions, such -as EJS's unsavory and unethical `<% } %>`. Compare: +as EJS's unethical `<% } %>`. It's been wrong for thousands of years +to have control markers surrounded by other control +markers, and it is still wrong. Witness: EJS, verbose and weak. + ``` <% for(var i=0; i
  • <%= supplies[i] %>
  • @@ -75,345 +85,346 @@ EJS, verbose and weak. ``` TOFFEE, so elegant and proud. -``` -{# - for supply in supplies {:
  • #{supply}
  • :} -#} -``` -Or, using the built-in `print`: +```html +{# for supply in supplies {: +
  • #{supply}
  • +:} #} ``` -{# - for supply in supplies - print "
  • #{supply}
  • " -#} + +Or, using Toffee's `print`: + +```html +{# for supply in supplies print " +
  • #{supply}
  • +" #} ``` -These are slightly different, as `print` outputs raw text, while `#{}` used in toffee mode safely escapes for HTML. This escaping -is customizable. More on that below. +These are slightly different, as `print` outputs raw text, while `#{}` used in toffee mode safely escapes HTML or JSON. This escaping +escaping is customizable. More on that below. -With nested code, indentation is inferred. +With nested code, indentation of your CoffeeScript is magically maintained. -``` -{# - for name, info of friends when info.age < 21 {: -

    - You know, #{name} would make a great designated driver. - And she only lives #{info.distance} miles away. - {# - info.cars.sort (a,b) -> b.speed - a.speed - if info.cars.length {: And wow, she drives a #{info.cars[0].model} :} - else {: But, alas, she has no wheels. :} - #} -

    - :} -#} +```html +{# if user.is_drunk for name, profile of friends when profile.is_responsible {: +

    + You know, #{name} would make a great designated driver. And she only lives + #{profile.distance}km away. {# if profile.car? {: And wow, she drives a + #{profile.car.model} :} else {: But, alas, she has no wheels. :} #} +

    +:} #} ``` -Switching to toffee mode without indenting ------ -By default, when you enter `{: ... :}`, the Toffee compiler assumes you're entering an indented region, -probably because of a loop or conditional. -If you ever want to cut into toffee mode without indenting, use `-{: ... :}`. For example: +### Partials (including other files), both for output and configuration -``` -{# - name = "Hans Gruber" - -{:You're a hell of a thief, #{name}:} -#} +Including other files in Toffee is easy with the `partial` function, which includes another template file. + +```html +
    + #{partial '../main_navigation.toffee'} +
    ``` -The above is identical to: +Shallow copies of variables are passed through from the parent document, however you can pass additional variables with a dictionary. +```html +
    + #{partial '../main_navigation.toffee', {user: elon_musk, iq: 180} } +
    ``` -{# - name = "Hans Gruber" - print "You're a hell of a thief, #{name}" -#} + +Again, toffee's `print` function allows you to use partials when in coffeescript mode: + +```html +{# if user? print partial "logged_in_template.toffee" #} ``` -Well, it's not exactly identical. Let's talk about escaping. +For your safety and convenience, variables are shallow-copied into a template. This means if you redefine or create a variable in a +child template, it won't be available back in the parent template. However, you can relay variables by modifying the special `passback` dictionary +in a the child template. +```html + +{# partial './config.toffee' #} +

    Our site's name is #{site_name}.

    -escaping: how it works -============== -In coffee mode, the `print` function lets you print the raw value of a variable. + +{# passback.site_name = "gittub.com" #} +``` -However, for safety, in toffee mode, `#{some_expression}` output is escaped for HTML, with some desired exceptions. +For your naming convenience, you can also use the `load` function, which is identical to `partial` but withholds output. -If certain functions are called leftmost in a `#{` token, their -output will be unmolested: +### Post-processing - * `#{json foo}`: this outputs foo as JSON. - * `#{raw foo}`: this outputs foo in raw text. - * `#{html foo}`: this outputs foo, escaped as HTML. It's the same as `#{foo}`, but it's available in case you (1) override the default escaping or (2) turn off auto-escaping (both explained below). - * `#{partial "foo.toffee"}` and `#{snippet "foo.toffee"}`: unescaped, since you don't want to escape your own templates +New in the latest version of Toffee, you can pass a `postProcess` function to Toffee. This works for individual partials or even +an entire document. The `postProcess` function performs a final transformation on your output. -The functions mentioned above are also available to you in coffee mode. +One smart use of postProcess is to find anything inside triple tick marks and perform a code higlighting. +```html +{# print partial './something.toffee', { foo: 1000 postProcess: (s) -> +find_and_higlight_code_in s } #} ``` + +You could define `find_and_highlight_code_in` anywhere in your publishing stack. You can pass it from your webserver, define it above, whatever. If you're +doing this server-side, consider the popular Node module _highlight.js_. In that case, define a highlight function that hunts for +triple tick marks and then uses highlight's highlighter to transform it. + +Your users shouldn't have to wait for client-side JS to re-process your pages. + +### Indentation + +Since CoffeeScript is sensitive to indenting, so is Toffee. + +But...Toffee doesn't care where you start your CoffeeScript. When you want to create a coffee block, +you can indent it however you like, and all that matters is that the internal, +relative indenting is correct. For example, these are identical: + +```html +

    + {# if user.is_awesome {: YAY! :} #} +

    - Want to read some JSON? - {# - foo = [1,2,3, {bar: "none"}] - foo_as_json_as_html = html json foo - print foo_as_json_as_html - #} + {# if user.is_awesome {: YAY! :} #}

    ``` -*Note!* if you pass a variable to the template called `json`, `raw`, or `html`, Toffee won't create these helper functions, which would override your vars. -In this case, you can access the escape functions through their official titles, `__toffee.raw`, etc. +In other words, feel free to pick whatever indentation baseline you want when entering a region of CoffeeScript. -Overriding the default `escape`: - * If you pass a variable to your template called `escape`, this will be used as the default escape. In toffee mode, everything inside `#{}` that isn't subject to an above-mentioned exception will go through your `escape` function. +Note that where you put your toffee mode tokens (`{:`) is important, as the following illustrates: -Turning off autoescaping entirely: - * If you set `autoEscape: false` when creating the engine, the default will be raw across your project. (See more on that below under Express 3.x settings.) - * Alternatively, you could pass the var `escape: (x) -> x` to turn off escaping for a given template. +```html +

    + {# if x is true if y is true if z is true w = true {: x is true! Dunno + anything about y or z, though. :} #} +

    +``` -questions -======== +Why? Because this is roughly the same as saying: -How does it compare to eco? --------------------------- -Eco is another CoffeeScript templating language and inspiration for Toffee. -The syntaxes are pretty different, so pick the one you prefer. +```html +

    + {# if x is true if y is true if z is true w = true print "\n x is true! Dunno + anything about y or z, though.\n " #} +

    +``` -One big Toffee advantage: multiple lines of CoffeeScript just look like CoffeeScript. Compare: +One syntactic convenience: if you start a `{:` on the same line as some preceeding CoffeeScript, it's +treated the same as putting it on a new line and indenting one level. +So the following three conditionals are the same: -ECO +```html +{# if x is true {:yay:} #} ``` -<% if @projects.length: %> - <% for project in @projects: %> - <% if project.is_active: %> -

    <%= project.name %> | <%= project.description %>

    - <% end %> - <% end %> -<% end %> + +```html +{# if x is true {:yay:} #} ``` -TOFFEE +```html +{# if x is true {: yay :} #} ``` -{# - if @projects.length - for project in @projects - if project.is_active {: -

    #{project.name} | #{project.description}

    - :} -#} + +The third example has extra whitespace around the "yay," but otherwise the three are logically identical. + +### One gotcha with indenting + +THIS IS AN ERROR + +```html +{# if x is 0 {:Yay!:} else {:Burned:} #} ``` -With Toffee's syntax, brackets enclose regions not directives, so your editor -will let you collapse and expand sections of code. And if you click on one of the brackets in most -editors, it will highlight the matching bracket. +Note that the indentations before the 'if' and the 'else' are technically different, +as the `if` has only 1 space before it, and the `else` has 2. This is better style anyway: -Does it cache templates? ------------------------- -In Express 2.0, that's up to Express. When used in Express 3.0, Toffee asynchronously monitors known templates and recompiles them in the background when necessary. So you don't need to restart your production webserver whenever you edit a template. +GOOD -Does it find line numbers in errors? ------------------------------------ -Yes, Toffee does a very good job of that. There are 3 possible places you can hit an error in Toffee: - * in the language itself, say a parse error - * in the CoffeeScript, preventing it from compiling to JS - * runtime, in the final JS +```html +{# if x is 0 {:Yay!:} else {:Burned:} #} +``` -Stack traces are converted to lines in Toffee and show you where the problem is. -By default when Toffee hits an error it replies with some pretty-printed HTML showing you the problem. -This can be overridden, as explained below in the Express 3.0 section. +With a single line of CoffeeScript, feel free to keep it all on one line: -Does it support partials? (a.k.a includes) -------------------------- -Yes. In Express 2.0, Express itself is responsible for including other files, and they call this system "partials." In Express 3.0, Toffee defines the `partial` function, and it -works as you'd expect. +GOOD ```html -
    #{partial '../foo/bar.toffee', name: "Chris"}
    +
    {# foo = "bar" #}
    ``` -Inside a region of CoffeeScript, you can print or capture the result of a partial. +## Commenting out a block of toffee + +In toffee mode, you can comment out a region with `{##` and `##}`. + ```html
    -{# - if session - print partial 'user_menu.toffee', info: session.info - else - print partial 'guest_menu.toffee' -#} + I don't want to output this anymore... {## +

    An ode to Ruby on Rails

    +

    #{partial 'ode.toffee'}

    + ##}
    ``` -Like Express's `partial` function, Toffee's function passes all available vars to the child template. -For example, in the above code, `session` would also be available in the user_menu.toffee file. If you don't want this scoping, use Toffee's `snippet` function, which sandboxes it: +## Escaping + +In your CoffeeScript, the `print` function lets you print the raw value of a variable: ``` {# - if session - print partial 'user.toffee', info: session.info # session will also be passed - print snippet 'user.toffee', info: session.info # session will not be passed + danger_code = "" + print danger_code #} ``` -Does it support `layout`? -------------------------- -Yes, this works in Express 3.0, emulating the Express 2.0 way. If you publish a file `foo.toffee` and pass a `layout` filename to it as a var, `foo.toffee` is rendered, and the results are put into -a var called `body`. Then your layout is rendered, using all your vars plus the new `body` var. +But in toffee mode, `#{some_expression}` output is escaped intelligently by default: + +```html + +

    #{danger_code}

    +``` +You can control the escaping, but here are the defaults: -How does the indentation work? ------ -Toffee realigns all your coffeescript inside a `{# region #}` by normalizing the indentation of that region. -So it doesn't matter how you indent things, as long as it makes local sense inside that region. +- if it's a string or scalar, it is escaped for HTML safety. +- it's an array or object, it is converted to JSON. -For example, these are all identical: +### Custom Escaping -``` -

    {# if x is 0 {:Yay!:} else {:Burned:} #}

    -``` +You can bypass the above rules. -``` -

    {# - if x is 0 {:Yay!:} else {:Burned:} -#}

    -``` +- `#{json foo}`: this outputs foo as JSON. +- `#{raw foo}`: this outputs foo in raw text. +- `#{html foo}`: this outputs foo, escaped as HTML. For a scalar, it's the same as `#{foo}`, but it's available in case you + (1) override the default escaping or (2) turn off auto-escaping (both explained below). +- `#{partial "foo.toffee"}` and `#{snippet "foo.toffee"}`: unescaped, since you don't want to escape your own templates -``` -

    -{# - if x is 0 {:Yay!:} - else {:Burned:} -#}

    -``` +When any of the functions mentioned above are leftmost in a `#{}` token in toffee mode, their output is left untouched by the +built in escape function. -However, this would cause an error: +These functions are also available to you in coffee mode. -ERROR -``` +```html

    -{# - if x is 0 {:Yay!:} - else {:Burned:} -#}

    + Want to read some JSON, human? {# foo = [1,2,3, {bar: "none"}] + foo_as_json_as_html = html json foo print foo_as_json_as_html #} +

    ``` -As would this more subtle case: +_Note!_ if you pass a variable to the template called `json`, `raw`, or `html`, Toffee won't create these helper functions, which would override your vars. +In this case, you can access the escape functions through their official titles, `__toffee.raw`, etc. -ERROR -``` -

    -{# if x is 0 {:Yay!:} - else {:Burned:} -#}

    -``` +Overriding the default `escape`: -In the above 2 cases, note that the leading whitespaces before the `if` and `else` are different, which is a CoffeeScript error. +- If you pass a variable to your template called `escape`, this will be used as the default escape. In toffee mode, everything inside `#{}` that isn't subject to an above-mentioned exception will go through your `escape` function. +Turning off autoescaping entirely: +- If you set `autoEscape: false` when creating the engine, the default will be raw across your project. (See more on that below under Express 3.x settings.) +- Alternatively, you could pass the var `escape: (x) -> x` to turn off escaping for a given template. +## Common Questions -Comments ------ -Inside a region of coffee, you can use coffee's `#` or `###` syntax to comment. -Inside toffee mode, you can comment with `{## ... ##}`. +#### How does it compare to eco? -``` -{## This isn't output ##} -But this is. -``` +Eco is another CoffeeScript templating language and inspiration for Toffee. +The syntaxes are pretty different, so pick the one you prefer. +One big Toffee advantage: multiple lines of CoffeeScript just look like CoffeeScript. Compare: -installation & usage -=========== -``` -npm install -g toffee -``` +ECO -In Express 3.x to make it your default engine: ``` -app.set 'view engine', 'toffee' +<% if @projects.length: %> + <% for project in @projects: %> + <% if project.is_active: %> +

    <%= project.name %> | <%= project.description %>

    + <% end %> + <% end %> +<% end %> ``` -In Express 3.x to use it just for .toffee files: -``` -toffee = require 'toffee' -app.engine 'toffee', toffee.__express -``` +TOFFEE -Express 2.x: -``` -toffee = require 'toffee' -app.register '.toffee', toffee +```html +{# if projects.length for project in projects if project.is_active {: +

    #{project.name} | #{project.description}

    +:} #} ``` -express 3.x options -=================== +With Toffee's syntax, brackets enclose regions not directives, so your editor +will let you collapse and expand sections of code. And if you click on one of the brackets in most +editors, it will highlight the matching bracket. -Pretty-print errors ------ +#### Does it cache templates? -Express's default error page is great for stack traces but not so great for pretty-printing template errors. -So by default, when Toffee hits any kind of error (in your templates, in your CoffeeScript, or even at runtime), -it fakes an okay result by returning some pretty HTML showing the error. If you don't like this - say you want to catch render errors - -you can turn it off. +In Express 2.0, that's up to Express. When used in Express 3.0, Toffee asynchronously monitors known templates and recompiles them in the background when necessary. So you don't need to restart your production webserver whenever you edit a template. -``` -toffee = require 'toffee' -toffee.expressEngine.prettyPrintErrors = false -``` +#### Does it find line numbers in errors? -Turning off auto-escaping for HTML ---------- -By default, Toffee escapes `#{}` output for HTML. You can turn this off in your engine with: -``` -toffee = require 'toffee' -toffee.expressEngine.autoEscape = false -``` +Yes, Toffee does a very good job of that. There are 3 possible places you can hit an error in Toffee: +- in the language itself, say a parse error +- in the CoffeeScript, preventing it from compiling to JS +- runtime, in the final JS -known issues -=============== -1. comments in `{## ##}` cannot contain other toffee code. Hope to have this fixed soon, as these tokens should -be useful for temporarily commenting off a region of a template. +Stack traces are converted to lines in Toffee and show you where the problem is. +By default when Toffee hits an error it replies with some pretty-printed HTML showing you the problem. +This can be overridden, as explained below in the Express 3.0 section. -3. There's a case where line numbers aren't right. +### Does it support partials? (a.k.a includes) -command-line -============ -Soon I'll have browser compilation working. I'd like partials and everything to work before I release this. In the meantime, if you're -curious to see the CoffeeScript that's compiled from a template: +Yes. In Express 2.0, Express itself is responsible for including other files, and they call this system "partials." In Express 3.0 and in the browser, +Toffee defines the `partial` function, and it works as you'd expect. +```html +
    #{partial '../foo/bar.toffee', name: "Chris"}
    ``` -toffee -c foo.toffee + +Inside a region of CoffeeScript, you can print or capture the result of a partial. + +```html +
    + {# if session print partial 'user_menu.toffee', info: session.info else print + partial 'guest_menu.toffee' #} +
    ``` -Or to see it in JS: +Like Express's `partial` function, Toffee's function passes all available vars to the child template. +For example, in the above code, `session` would also be available in the user_menu.toffee file. If you don't want this scoping, use Toffee's `snippet` function, which sandboxes it: + ``` -toffee foo.toffee +{# + if session + print partial 'user.toffee', info: session.info # session will also be passed + print snippet 'user.toffee', info: session.info # session will not be passed +#} ``` -contributing -============= -I'm likely to accept good pull requests. +#### Does it support `layout`? + +Yes, this works in NodeJS and Express 3.0, emulating the Express 2.0 way. The var `layout` is considered special, and should +be the path to your layout file. + +## Installation & Usage + +- [Using Toffee in NodeJS](https://github.com/malgorithms/toffee/wiki/NodeJS-Usage) +- [Using Toffee in Express 3](https://github.com/malgorithms/toffee/wiki/Express3-Usage) +- [Using Toffee in Express 2](https://github.com/malgorithms/toffee/wiki/Express2-Usage) +- [Using Toffee in the Browser](https://github.com/malgorithms/toffee/wiki/Browser-Usage) + +# contributing & asking for fixes. + +If you have a problem with Toffee let me know, and I'll fix it ASAP. + +Also, I'm likely to accept good pull requests. If you'd like to edit code for this project, note that you should always edit the `.coffee` files, -as the `.js` files as generated automatically by building. +as the `.js` files are generated automatically by building. -To build -``` -> cake build -``` +To build and test your changes -To make sure you didn't break something ``` -> coffee tests/run_cases.coffee +# icake is iced-coffee-script's version of cake +> icake build +> icake test ``` - -I'm also very interested in someone building a Sublime/Textmate package for Toffee. - -todo -====== -- finish browser-side include and command-line compiler -- ...then add instructions on how to use it -- continue to add to unit tests -- stack trace conversion improvement diff --git a/bin/toffee b/bin/toffee old mode 100644 new mode 100755 diff --git a/index.coffee b/index.coffee index 3a6b2c5..84605af 100644 --- a/index.coffee +++ b/index.coffee @@ -1,13 +1,89 @@ # expose the render function -eclass = require('./lib/engine').engine -e = new eclass { verbose: false, prettyPrintErrors: true } -exports.expressEngine = e +{engine} = require('./lib/engine') +{view, getCommonHeaders, getCommonHeadersJs} = require('./lib/view') -# a pretty name for general usage -exports.render = e.run +exports.engine = engine +exports.view = view +exports.getCommonHeaders = getCommonHeaders +exports.getCommonHeadersJs = getCommonHeadersJs -# express 3.x support -exports.__express = e.run +exports.expressEngine = e = new engine { verbose: false, prettyPrintErrors: true } +exports.render = e.run +cacheless_engine = new engine { verbose: false, prettyPrintErrors: true, cache: false} + +# given a template string, returns a function that can be called +# on an object to render it. +# -------------------------------------------- + +exports.compileStr = (template_str, options) -> + v = new view template_str, options + return (x) -> v.run x + +# express 3.x support from a custom engine; +# this function takes a toffee engine +# and returns a function that matches the __express +# standard. +# -------------------------------------------- + +to_express = exports.toExpress = (eng) -> + return (filename, options, cb) -> + eng.run filename, options, (err, res) -> + if err + if typeof(err) is "string" + err = new Error err + cb err + else + cb null, res + +# express 3.x support using the default engine +# -------------------------------------------- + +__express = exports.__express = to_express e + +# consolidate.js support, which doesn't want caching on by default +# -------------------------------------------- + +exports.__consolidate_engine_render = (filename, options, cb) -> + eng = if options.cache then e else cacheless_engine + eng.run filename, options, (err, res) -> + cb err, res + +# consolidate.js wants this, but it might generally be useful +# -------------------------------------------- + +exports.str_render = exports.strRender = (template_str, options, cb) -> + v = new view template_str, options + [err, res] = v.run options + cb err, res # express 2.x support -exports.compile = require('./lib/view').expressCompile \ No newline at end of file +# -------------------------------------------- + +exports.compile = require('./lib/view').expressCompile + +# better support for string compiling +# -------------------------------------------- + +exports.configurable_compile = (source, opts) -> + opts = opts or {} + opts.headers = if opts.headers? then opts.headers else true + opts.filename = opts.filename or null + opts.to_coffee = opts.to_coffee or false + err = null + + # this compiles an individual template that you've read while recursing: + v = new view source, { + filename: opts.filename + bundlePath: opts.filename + browserMode: true + } + if opts.to_coffee + output = v.toCoffee() + else + output = v.toJavaScript() + if v.error then throw v.error.e + if opts.headers + header = getCommonHeadersJs true, true, true + if opts.coffee then output = "`#{header}`\n\n#{output}" + else output = "#{header}\n;\n#{output}" + return output diff --git a/index.js b/index.js index 5d397bc..ca2da7c 100644 --- a/index.js +++ b/index.js @@ -1,20 +1,103 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.12.7 (function() { - var e, eclass; + var __express, cacheless_engine, e, engine, getCommonHeaders, getCommonHeadersJs, ref, to_express, view; - eclass = require('./lib/engine').engine; + engine = require('./lib/engine').engine; - e = new eclass({ + ref = require('./lib/view'), view = ref.view, getCommonHeaders = ref.getCommonHeaders, getCommonHeadersJs = ref.getCommonHeadersJs; + + exports.engine = engine; + + exports.view = view; + + exports.getCommonHeaders = getCommonHeaders; + + exports.getCommonHeadersJs = getCommonHeadersJs; + + exports.expressEngine = e = new engine({ verbose: false, prettyPrintErrors: true }); - exports.expressEngine = e; - exports.render = e.run; - exports.__express = e.run; + cacheless_engine = new engine({ + verbose: false, + prettyPrintErrors: true, + cache: false + }); + + exports.compileStr = function(template_str, options) { + var v; + v = new view(template_str, options); + return function(x) { + return v.run(x); + }; + }; + + to_express = exports.toExpress = function(eng) { + return function(filename, options, cb) { + return eng.run(filename, options, function(err, res) { + if (err) { + if (typeof err === "string") { + err = new Error(err); + } + return cb(err); + } else { + return cb(null, res); + } + }); + }; + }; + + __express = exports.__express = to_express(e); + + exports.__consolidate_engine_render = function(filename, options, cb) { + var eng; + eng = options.cache ? e : cacheless_engine; + return eng.run(filename, options, function(err, res) { + return cb(err, res); + }); + }; + + exports.str_render = exports.strRender = function(template_str, options, cb) { + var err, ref1, res, v; + v = new view(template_str, options); + ref1 = v.run(options), err = ref1[0], res = ref1[1]; + return cb(err, res); + }; exports.compile = require('./lib/view').expressCompile; + exports.configurable_compile = function(source, opts) { + var err, header, output, v; + opts = opts || {}; + opts.headers = opts.headers != null ? opts.headers : true; + opts.filename = opts.filename || null; + opts.to_coffee = opts.to_coffee || false; + err = null; + v = new view(source, { + filename: opts.filename, + bundlePath: opts.filename, + browserMode: true + }); + if (opts.to_coffee) { + output = v.toCoffee(); + } else { + output = v.toJavaScript(); + } + if (v.error) { + throw v.error.e; + } + if (opts.headers) { + header = getCommonHeadersJs(true, true, true); + if (opts.coffee) { + output = "`" + header + "`\n\n" + output; + } else { + output = header + "\n;\n" + output; + } + } + return output; + }; + }).call(this); diff --git a/lib/command_line.js b/lib/command_line.js index 5d994a7..dddf3ae 100644 --- a/lib/command_line.js +++ b/lib/command_line.js @@ -1,44 +1,154 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.12.7 (function() { - var engine, fs, getVersionNumber, printUsage, view; + var compile, fs, getCommonHeadersJs, getVersionNumber, maybeAttachHeaders, mkdirp, path, program, recurseRun, ref, run, view; - fs = require("fs"); + fs = require('fs'); - engine = require('../lib/engine').engine; + path = require('path'); - view = require('../lib/view').view; + ref = require('../lib/view'), view = ref.view, getCommonHeadersJs = ref.getCommonHeadersJs; - printUsage = function() { - console.log(" Usage: toffee [-c] input.toffee\n\n -c == output to CoffeeScript (instead of JS)\n\n TODO: make a more useful command line tool."); - return process.exit(1); - }; + program = require('commander'); + + mkdirp = require('mkdirp'); getVersionNumber = function() { - return JSON.parse(fs.readFileSync("" + __dirname + "/../package.json", "utf8")).version; + var o, p; + p = fs.readFileSync(__dirname + "/../package.json", "utf8"); + o = JSON.parse(p); + return o.version; }; - exports.run = function() { - var args, coffee, e, fname, source, v; - e = new engine(); - args = process.argv.slice(2); - if (args.length === 2) { - coffee = true; - if (args[0] !== "-c") { - printUsage(); - } - } else if (args.length !== 1) { - printUsage(); + program.on('--help', function() { + return console.log("\n Examples: \n \n toffee views # recurses through views and builds views.js \n toffee foo.toffee # builds foo.js \n toffee views -o templates # builds templates.js \n toffee -p foo.toffee # outputs JS to stdout \n \n \n Then use in your : \n \n \n \n"); + }); + + program.version(getVersionNumber()).option('-o, --output [path]', 'file (bundles all output into a single .js)').option('-d, --output_dir [path]', 'compiles templates into parallel .js files').option('-p, --print', 'print to stdout').option('-c, --coffee', 'output to CoffeeScript (not JS)').option('-b, --bundle_path [path]', 'bundle_path (instead of "/") for templates').option('-n, --no_headers', 'exclude boilerplate toffee (requires toffee.js included separately)').parse(process.argv); + + compile = function(start_path, full_path) { + + /* + e.g., if start_path is /foo/bar + and path is /foo/bar/car/thing.toffee + */ + var bundle_path, output, source, v; + source = fs.readFileSync(full_path, 'utf8'); + bundle_path = full_path.slice(start_path.length); + if (start_path === full_path) { + bundle_path = "/" + path.basename(full_path); + } + if (program.bundle_path) { + bundle_path = path.normalize(program.bundle_path + "/" + bundle_path); } - fname = args.slice(-1)[0]; - source = fs.readFileSync(fname, "utf8"); v = new view(source, { - fileName: fname + fileName: full_path, + bundlePath: bundle_path, + browserMode: true }); - if (coffee) { - return console.log(v._toCoffee()); + if (program.coffee) { + output = v.toCoffee(); + } else { + output = v.toJavaScript(); + } + if (v.error) { + process.stderr.write(v.error.getPrettyPrintText()); + process.exit(1); + } + return [output, bundle_path]; + }; + + recurseRun = function(start_path, curr_path, out_text) { + var comp, file, file_out_path, files, i, len, stats, sub_path, sub_stats; + stats = fs.statSync(curr_path); + if (stats.isDirectory()) { + files = fs.readdirSync(curr_path); + for (i = 0, len = files.length; i < len; i++) { + file = files[i]; + sub_path = path.normalize(curr_path + "/" + file); + if (file.match(/\.toffee$/)) { + out_text = recurseRun(start_path, sub_path, out_text); + } else if (!(file === '.' || file === '..')) { + sub_stats = fs.statSync(sub_path); + if (sub_stats.isDirectory()) { + out_text = recurseRun(start_path, sub_path, out_text); + } + } + } + } else { + comp = compile(start_path, curr_path); + out_text += "\n;\n" + comp[0]; + if (program.output_dir) { + file_out_path = path.normalize(program.output_dir + "/" + comp[1]); + file_out_path = (path.dirname(file_out_path)) + "/" + (path.basename(file_out_path, '.toffee')); + file_out_path += program.coffee ? '.coffee' : '.js'; + if (!program.print) { + console.log("Outputting " + file_out_path); + } + mkdirp.sync(path.dirname(file_out_path)); + fs.writeFileSync(file_out_path, maybeAttachHeaders(comp[0]), "utf8"); + } + } + return out_text; + }; + + maybeAttachHeaders = function(pre_output) { + var header_out; + if (program.no_headers) { + return pre_output; + } else { + header_out = getCommonHeadersJs(true, true, true); + if (program.coffee) { + return "`" + header_out + "`\n\n" + pre_output; + } else { + return header_out + "\n;\n" + pre_output; + } + } + }; + + run = exports.run = function() { + var e, out_text, start_path, template_out; + if (program.args.length !== 1) { + console.log("Unexpected input. toffee --help for examples"); + console.log(program.args); + return process.exit(1); } else { - return console.log(v._toJavaScript()); + try { + start_path = fs.realpathSync(program.args[0]); + } catch (error) { + e = error; + console.log("Input file/path not found. toffee --help for examples"); + process.exit(1); + } + if (program.output_dir) { + try { + mkdirp.sync(program.output_dir); + } catch (error) { + e = error; + console.log("Couldn't make/use " + program.output_dir + "; " + e); + process.exit(1); + } + } + start_path = path.normalize(start_path); + template_out = recurseRun(start_path, start_path, ''); + out_text = maybeAttachHeaders(template_out); + if (program.print) { + console.log(out_text); + } + if (program.output) { + try { + console.log("Writing " + program.output); + return fs.writeFileSync(program.output, out_text, "utf8"); + } catch (error) { + e = error; + console.log(e); + return process.exit(1); + } + } } }; + if (require.main === module) { + run(); + } + }).call(this); diff --git a/lib/consts.js b/lib/consts.js index cd77ed6..aed3d69 100644 --- a/lib/consts.js +++ b/lib/consts.js @@ -1,6 +1,5 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.12.7 (function() { - exports.states = { TOFFEE: 1, COFFEE: 2 @@ -8,4 +7,8 @@ exports.TAB_SPACES = 2; + exports.tweakables = { + MISSING_FILE_RECHECK: 1000 + }; + }).call(this); diff --git a/lib/engine.js b/lib/engine.js index b0ba08a..77ba860 100644 --- a/lib/engine.js +++ b/lib/engine.js @@ -1,11 +1,13 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.12.7 (function() { - var engine, fs, path, states, util, utils, view, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + var LockTable, MAX_CACHED_SANDBOXES, Pool, engine, fs, path, ref, sandboxCons, states, tweakables, util, utils, view, vm, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; view = require('./view').view; - states = require('./consts').states; + ref = require('./consts'), states = ref.states, tweakables = ref.tweakables; + + Pool = require('./pool').Pool; utils = require('./utils'); @@ -15,26 +17,42 @@ util = require('util'); - engine = (function() { + vm = require('vm'); - function engine(options) { - this._fn_partial = __bind(this._fn_partial, this); + LockTable = require('iced-lock').Table; - this._fn_snippet = __bind(this._fn_snippet, this); + MAX_CACHED_SANDBOXES = 100; - this._inlineInclude = __bind(this._inlineInclude, this); + sandboxCons = function() { + return vm.createContext({}); + }; - this.run = __bind(this.run, this); + engine = (function() { + function engine(options) { + this._fn_partial = bind(this._fn_partial, this); + this._fn_snippet = bind(this._fn_snippet, this); + this._fn_load = bind(this._fn_load, this); + this._inlineInclude = bind(this._inlineInclude, this); + this.run = bind(this.run, this); + this.render = bind(this.render, this); options = options || {}; this.verbose = options.verbose || false; + this.pool = new Pool(sandboxCons, options.poolSize || MAX_CACHED_SANDBOXES); this.prettyPrintErrors = options.prettyPrintErrors != null ? options.prettyPrintErrors : true; + this.prettyLogErrors = options.prettyLogErrors != null ? options.prettyLogErrors : true; + this.autoEscape = options.autoEscape != null ? options.autoEscape : true; + this.cache = options.cache != null ? options.cache : true; + this.additionalErrorHandler = options.additionalErrorHandler || null; this.viewCache = {}; + this.fsErrorCache = {}; + this.filenameCache = {}; + this.fileLockTable = new LockTable(); } engine.prototype._log = function(o) { - var _ref; + var ref1; if (this.verbose) { - if ((_ref = typeof o) === "string" || _ref === "number" || _ref === "boolean") { + if ((ref1 = typeof o) === "string" || ref1 === "number" || ref1 === "boolean") { return console.log("toffee: " + o); } else { return console.log("toffee: " + (util.inspect(o))); @@ -42,90 +60,200 @@ } }; + engine.prototype.normalizeFilename = function(dir, filename) { + var cache, normalized; + cache = this.filenameCache[dir]; + if (cache == null) { + this.filenameCache[dir] = {}; + cache = {}; + } + normalized = cache[filename]; + if (normalized == null) { + normalized = path.normalize(path.resolve(dir, filename)); + this.filenameCache[dir][filename] = normalized; + } + return normalized; + }; + + engine.prototype.render = function(filename, options, cb) { + return this.run(filename, options, cb); + }; + engine.prototype.run = function(filename, options, cb) { + /* - "options" contains the pub vars and may contain special items: - layout: path to a template expecting a body var (express 2.x style, but for use with express 3.x) - __toffee.dir: path to look relative to - __toffee.parent: parent file - __toffee.noInheritance: if true, don't pass variables through unless explicitly passed - __toffee.autoEscape: if set as false, don't escape output of #{} vars by default - */ - - var err, res, _ref, _ref1, _ref2, _ref3; - _ref = this.runSync(filename, options), err = _ref[0], res = _ref[1]; + "options" contains the pub vars and may contain special items: + layout: path to a template expecting a body var (express 2.x style, but for use with express 3.x) + postProcess: a function which takes the string of output and post processes it (returning new string) + __toffee.dir: path to look relative to + __toffee.parent: parent file + __toffee.noInheritance: if true, don't pass variables through unless explicitly passed + __toffee.repress if true, don't output anything; useful with including definition files with passback of vars + __toffee.autoEscape: if set as false, don't escape output of #{} vars by default + */ + var err, k, layout_options, post_process, ref1, ref2, ref3, ref4, ref5, res, v; + if (options.prettyPrintErrors == null) { + options.prettyPrintErrors = this.prettyPrintErrors; + } + if (options.prettyLogErrors == null) { + options.prettyLogErrors = this.prettyLogErrors; + } + if (options.additionalErrorHandler == null) { + options.additionalErrorHandler = this.additionalErrorHandler; + } + if (options.autoEscape == null) { + options.autoEscape = this.autoEscape; + } + post_process = options.postProcess; + options.postProcess = null; + if (options != null ? options.layout : void 0) { + layout_options = {}; + for (k in options) { + v = options[k]; + if (k !== "layout") { + layout_options[k] = v; + } + } + } + ref1 = this.runSync(filename, options), err = ref1[0], res = ref1[1]; if (err && this.prettyPrintErrors) { - _ref1 = [null, err], err = _ref1[0], res = _ref1[1]; + ref2 = [null, err], err = ref2[0], res = ref2[1]; } - if ((!err) && (options != null ? options.layout : void 0)) { - options.body = res; - _ref2 = this.runSync(options.layout, options), err = _ref2[0], res = _ref2[1]; + if ((!err) && (layout_options != null)) { + layout_options.body = res; + ref3 = this.runSync(options.layout, layout_options), err = ref3[0], res = ref3[1]; if (err && this.prettyPrintErrors) { - _ref3 = [null, err], err = _ref3[0], res = _ref3[1]; + ref4 = [null, err], err = ref4[0], res = ref4[1]; } } + if ((!err) && (typeof post_process === "function")) { + ref5 = this.postProcess(post_process, res), err = ref5[0], res = ref5[1]; + } return cb(err, res); }; + engine.prototype.postProcess = function(fn, res) { + var e, err; + err = null; + try { + res = fn(res); + } catch (error) { + e = error; + err = e; + } + return [err, res]; + }; + engine.prototype.runSync = function(filename, options) { - /* - "options" the same as run() above - */ - var err, pwd, realpath, res, start_time, v, _ref, _ref1, - _this = this; + /* + "options" the same as run() above + */ + var ctx, err, realpath, ref1, ref2, ref3, res, start_time, v; start_time = Date.now(); options = options || {}; options.__toffee = options.__toffee || {}; options.__toffee.dir = options.__toffee.dir || process.cwd(); - filename = filename[0] !== "/" ? "" + options.__toffee.dir + "/" + filename : filename; - realpath = path.normalize(filename); - pwd = path.dirname(realpath); - v = this.viewCache[realpath] || this._loadCacheAndMonitor(realpath, options); + realpath = this.normalizeFilename(options.__toffee.dir, filename); + if (this.cache) { + v = (this._viewCacheGet(realpath)) || (this._loadCacheAndMonitor(realpath, options)); + } else { + v = this._loadWithoutCache(realpath, options); + } if (v) { - options.__toffee.parent = realpath; - options.partial = options.partial || function(fname, lvars) { - return _this._fn_partial(fname, lvars, realpath, options); - }; - options.snippet = options.snippet || function(fname, lvars) { - return _this._fn_snippet(fname, lvars, realpath, options); - }; - options.print = options.print || function(txt) { - return _this._fn_print(txt, options); - }; - if (!(options.console != null)) { - options.console = { - log: console.log - }; + if (this.fsErrorCache[realpath]) { + ref1 = [new Error("Couldn't load " + realpath), null], err = ref1[0], res = ref1[1]; + } else { + options.__toffee.parent = realpath; + options.partial = options.partial || (function(_this) { + return function(fname, lvars) { + return _this._fn_partial(fname, lvars, realpath, options); + }; + })(this); + options.snippet = options.snippet || (function(_this) { + return function(fname, lvars) { + return _this._fn_snippet(fname, lvars, realpath, options); + }; + })(this); + options.load = options.load || (function(_this) { + return function(fname, lvars) { + return _this._fn_load(fname, lvars, realpath, options); + }; + })(this); + options.print = options.print || (function(_this) { + return function(txt) { + return _this._fn_print(txt, options); + }; + })(this); + if (options.console == null) { + options.console = { + log: console.log + }; + } + ctx = this.pool.get(); + ref2 = v.run(options, ctx), err = ref2[0], res = ref2[1]; + this.pool.release(ctx); } - _ref = v.run(options), err = _ref[0], res = _ref[1]; } else { - _ref1 = ["Couldn't load " + realpath, null], err = _ref1[0], res = _ref1[1]; + ref3 = [new Error("Couldn't load " + realpath), null], err = ref3[0], res = ref3[1]; } - this._log("" + realpath + " run in " + (Date.now() - start_time) + "ms"); + this._log(realpath + " run in " + (Date.now() - start_time) + "ms"); return [err, res]; }; + engine.prototype._viewCacheGet = function(filename) { + if (this.viewCache[filename] == null) { + return null; + } else if (this.fsErrorCache[filename] == null) { + return this.viewCache[filename]; + } else if ((Date.now() - this.fsErrorCache[filename]) < tweakables.MISSING_FILE_RECHECK) { + return this.viewCache[filename]; + } else { + return null; + } + }; + engine.prototype._inlineInclude = function(filename, local_vars, parent_realpath, parent_options) { - var err, k, options, res, v, _ref; + var err, i, k, len, noInheritance, options, ref1, ref2, ref3, repress, res, reserved, v; options = local_vars || {}; + options.passback = {}; options.__toffee = options.__toffee || {}; options.__toffee.dir = path.dirname(parent_realpath); options.__toffee.parent = parent_realpath; - if (!options.__toffee.noInheritance) { + noInheritance = options.__toffee.noInheritance; + repress = options.__toffee.repress; + reserved = {}; + ref1 = ["passback", "load", "print", "partial", "snippet", "layout", "__toffee", "postProcess"]; + for (i = 0, len = ref1.length; i < len; i++) { + k = ref1[i]; + reserved[k] = true; + } + if (!noInheritance) { for (k in parent_options) { v = parent_options[k]; - if (!((local_vars != null ? local_vars[k] : void 0) != null)) { - if (!(k === "print" || k === "partial" || k === "snippet" || k === "layout" || k === "__toffee")) { + if ((local_vars != null ? local_vars[k] : void 0) == null) { + if (reserved[k] == null) { options[k] = v; } } } } - _ref = this.runSync(filename, options), err = _ref[0], res = _ref[1]; + ref2 = this.runSync(filename, options), err = ref2[0], res = ref2[1]; + ref3 = options.passback; + for (k in ref3) { + v = ref3[k]; + parent_options[k] = v; + } return err || res; }; + engine.prototype._fn_load = function(fname, lvars, realpath, options) { + lvars = lvars != null ? lvars : {}; + lvars.__toffee = lvars.__toffee || {}; + lvars.__toffee.repress = true; + return this._inlineInclude(fname, lvars, realpath, options); + }; + engine.prototype._fn_snippet = function(fname, lvars, realpath, options) { lvars = lvars != null ? lvars : {}; lvars.__toffee = lvars.__toffee || {}; @@ -146,65 +274,137 @@ } }; + engine.prototype._loadWithoutCache = function(filename, options) { + var e, ref1, txt, v, view_options; + try { + txt = fs.readFileSync(filename, 'utf8'); + } catch (error) { + e = error; + txt = "Error: Could not read " + filename; + if (((ref1 = options.__toffee) != null ? ref1.parent : void 0) != null) { + txt += " first requested in " + options.__toffee.parent; + } + } + view_options = this._generateViewOptions(filename); + v = new view(txt, view_options); + return v; + }; + engine.prototype._loadCacheAndMonitor = function(filename, options) { - var txt, v, view_options, _ref; + var e, previous_fs_err, ref1, txt, v, view_options; + previous_fs_err = this.fsErrorCache[filename] != null; try { txt = fs.readFileSync(filename, 'utf8'); - } catch (e) { + if (this.fsErrorCache[filename] != null) { + delete this.fsErrorCache[filename]; + } + } catch (error) { + e = error; txt = "Error: Could not read " + filename; - if (((_ref = options.__toffee) != null ? _ref.parent : void 0) != null) { - txt += " requested in " + options.__toffee.parent; + if (((ref1 = options.__toffee) != null ? ref1.parent : void 0) != null) { + txt += " first requested in " + options.__toffee.parent; } + this.fsErrorCache[filename] = Date.now(); + } + if (this.fsErrorCache[filename] && previous_fs_err && this.viewCache[filename]) { + return this.viewCache[filename]; + } else { + view_options = this._generateViewOptions(filename); + v = new view(txt, view_options); + this.viewCache[filename] = v; + this._monitorForChanges(filename, options); + return v; } - view_options = { + }; + + engine.prototype._reloadFileInBkg = function(filename, options) { + this._log(filename + " acquiring lock to read"); + return this.fileLockTable.acquire2({ + name: filename + }, (function(_this) { + return function(lock) { + return fs.readFile(filename, 'utf8', function(err, txt) { + var ctx, ref1, v, view_options, waiting_for_view; + if (!err) { + _this._log((Date.now()) + " - " + filename + " changed to " + (txt != null ? txt.length : void 0) + " bytes. " + (txt != null ? typeof txt.replace === "function" ? txt.replace(/\n/g, '').slice(0, 80) : void 0 : void 0)); + } + waiting_for_view = false; + if (err || (txt !== _this.viewCache[filename].txt)) { + if (err) { + _this.fsErrorCache[filename] = Date.now(); + txt = "Error: Could not read " + filename; + if (((ref1 = options.__toffee) != null ? ref1.parent : void 0) != null) { + txt += " requested in " + options.__toffee.parent; + } + } + if (!(err && _this.viewCache[filename].fsError)) { + view_options = _this._generateViewOptions(filename); + ctx = _this.pool.get(); + view_options.ctx = ctx; + view_options.cb = function(v) { + _this._log(filename + " updated and ready"); + _this.viewCache[filename] = v; + _this.pool.release(ctx); + _this._log(filename + " lock releasing (view_options.cb)"); + return lock.release(); + }; + waiting_for_view = true; + if (err) { + view_options.fsError = true; + } + v = new view(txt, view_options); + } + } + if (!waiting_for_view) { + _this._log(filename + " lock releasing (not waiting for view)"); + return lock.release(); + } + }); + }; + })(this)); + }; + + engine.prototype._generateViewOptions = function(filename) { + return { fileName: filename, verbose: this.verbose, - prettyPrintErrors: this.prettyPrintErrors + prettyPrintErrors: this.prettyPrintErrors, + prettyLogErrors: this.prettyLogErrors, + autoEscape: this.autoEscape, + additionalErrorHandler: this.additionalErrorHandler }; - v = new view(txt, view_options); - this.viewCache[filename] = v; - this._monitorForChanges(filename, options); - return v; }; engine.prototype._monitorForChanges = function(filename, options) { + /* - we must continuously unwatch/rewatch because some editors/systems invoke a "rename" - event and we'll end up following the wrong, old 'file' as a new one - is dropped in its place. - */ - - var fsw, - _this = this; - fsw = null; - return fsw = fs.watch(filename, { - persistent: true - }, function(change) { - fsw.close(); - _this._log("Got an fs.watch hit on " + filename); - return fs.readFile(filename, 'utf8', function(err, txt) { - var v, view_options, _ref; - _this._monitorForChanges(filename, options); - if (txt !== _this.viewCache[filename].txt) { - if (err) { - txt = "Error: Could not read " + filename + " after fs.watch() hit."; - if (((_ref = options.__toffee) != null ? _ref.parent : void 0) != null) { - txt += " requested in " + options.__toffee.parent; - } - } - view_options = { - fileName: filename, - verbose: _this.verbose, - prettyPrintErrors: _this.prettyPrintErrors, - cb: function(v) { - _this._log("" + filename + " updated and ready"); - return _this.viewCache[filename] = v; - } + we must continuously unwatch/rewatch because some editors/systems invoke a "rename" + event and we'll end up following the wrong, old 'file' as a new one + is dropped in its place. + + Files that are missing are ignored here because they get picked up by new calls to _loadCacheAndMonitor + */ + var e, fsw; + if (this.fsErrorCache[filename] == null) { + fsw = null; + try { + this._log(filename + " starting fs.watch()"); + return fsw = fs.watch(filename, { + persistent: true + }, (function(_this) { + return function(change) { + _this._log(filename + " closing fs.watch()"); + fsw.close(); + _this._monitorForChanges(filename, options); + return _this._reloadFileInBkg(filename, options); }; - return v = new view(txt, view_options); - } - }); - }); + })(this)); + } catch (error) { + e = error; + this._log("fs.watch() failed for " + filename + "; settings fsErrorCache = true"); + return this.fsErrorCache[filename] = Date.now(); + } + } }; return engine; diff --git a/lib/errorHandler.js b/lib/errorHandler.js index 8f5a0e0..a575eba 100644 --- a/lib/errorHandler.js +++ b/lib/errorHandler.js @@ -1,6 +1,8 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.12.7 (function() { - var eh, errorTypes, path, toffeeError, util, _ppEscape; + var _ppEscape, errorTypes, path, toffeeError, util, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; path = require("path"); @@ -13,7 +15,8 @@ RUNTIME: 3 }; - toffeeError = (function() { + toffeeError = (function(superClass) { + extend(toffeeError, superClass); function toffeeError(view, err_type, e) { this.errType = err_type; @@ -38,6 +41,7 @@ } toffeeError.prototype.getConvertedError = function() { + /* -------------------------------------- returns a JS style error, but with some extras { @@ -48,9 +52,8 @@ ...etc... } ------------------------------------------ - */ - - var line, res, _ref; + */ + var line, ref, ref1, ref2, res; res = { stack: [], message: "", @@ -58,15 +61,20 @@ full_path: this.view.fileName, dir_name: path.dirname(this.view.fileName), file: path.basename(this.view.fileName), - line_range: [0, 0] + line_range: null }; - if (((_ref = this.e) != null ? _ref.message : void 0) != null) { + if (((ref = this.e) != null ? ref.message : void 0) != null) { res.message = this.e.message; } + if (((ref1 = this.e) != null ? (ref2 = ref1.location) != null ? ref2.first_line : void 0 : void 0) != null) { + res.line_range = this._convertJsErrorRangeToToffeeRange(this.e.location); + } switch (this.errType) { case errorTypes.PARSER: - line = this._extractOffensiveLineNo(this.e.message, /on line ([0-9]+)/); - res.line_range = [line, line + 1]; + if (res.line_range == null) { + line = this._extractOffensiveLineNo(this.e.message, /on line ([0-9]+)/); + res.line_range = [line, line + 1]; + } break; case errorTypes.STR_INTERPOLATE: res.line_range = [this.e.relayed_line_range[0], this.e.relayed_line_range[1]]; @@ -74,11 +82,20 @@ res.message = res.message.replace('missing }', 'unclosed `\#{}`'); break; case errorTypes.COFFEE_COMPILE: - line = this._extractOffensiveLineNo(this.e.message, /on line ([0-9]+)/); - res.line_range = this._convertOffensiveLineToToffeeRange(line); - res.message = res.message.replace(/on line [0-9]+/, this._lineRangeToPhrase(res.line_range)); + if (res.line_range == null) { + line = this._extractOffensiveLineNo(this.e.message, /on line ([0-9]+)/); + res.line_range = this._convertOffensiveLineToToffeeRange(line); + } + if (res.message.indexOf('on line') !== -1) { + res.message = res.message.replace(/on line [0-9]+/, this._lineRangeToPhrase(res.line_range)); + } else { + res.message += " " + this._lineRangeToPhrase(res.line_range); + } break; case errorTypes.RUNTIME: + if (res.line_range == null) { + res.line_range = [0, 0]; + } if (this.e.stack) { res.stack = this.e.stack.split("\n"); this._convertRuntimeStackLines(res); @@ -88,18 +105,18 @@ }; toffeeError.prototype._convertRuntimeStackLines = function(converted_err) { - /* - a little more complicated, so extracted. Returns an array - of dictionaries where there's extra info on each line in the stack. - */ - var at_pub_call, hit_pub_yet, i, in_src_file, line, lineno, lrange, m, rxx_inline, rxx_pub, stack, _i, _len, _results; + /* + a little more complicated, so extracted. Returns an array + of dictionaries where there's extra info on each line in the stack. + */ + var at_pub_call, hit_pub_yet, i, in_src_file, k, len, line, lineno, lrange, m, results, rxx_inline, rxx_pub, stack; hit_pub_yet = false; stack = converted_err.stack; - _results = []; - for (i = _i = 0, _len = stack.length; _i < _len; i = ++_i) { + results = []; + for (i = k = 0, len = stack.length; k < len; i = ++k) { line = stack[i]; - rxx_pub = RegExp("Object[\\.]" + this.view.identifier + "[\\s]\\(undefined\\:([0-9]+)\\:[0-9]+"); + rxx_pub = /Object[\.].*?pub[\s]\(undefined\:([0-9]+)\:[0-9]+|tmpl[\.]render[\.]tmpl[\.]pub.*\(.*\:([0-9]+)\:[0-9]+/; m = line.match(rxx_pub); in_src_file = false; lrange = [null, null]; @@ -130,37 +147,33 @@ line_range: lrange }; if (stack[i].line_range[0] && !converted_err.line_range[0]) { - _results.push(converted_err.line_range = stack[i].line_range); + results.push(converted_err.line_range = stack[i].line_range); } else { - _results.push(void 0); + results.push(void 0); } } - return _results; + return results; }; toffeeError.prototype.getPrettyPrintText = function() { - /* - returns a TEXT only blob explaining the error - */ - var cerr, count, header, i, item, res, _i, _len, _ref, _ref1; + /* + returns a TEXT only blob explaining the error + */ + var cerr, count, header, i, item, k, len, ref, ref1, res; cerr = this.getConvertedError(); - if (cerr.type === errorTypes.RUNTIME) { - header = cerr.message; - } else { - header = "" + cerr.dir_name + "/" + cerr.file + ": " + cerr.message; - } + header = cerr.dir_name + "/" + cerr.file + ": " + cerr.message; res = "ERROR\n=====\n" + header; - if ((_ref = cerr.stack) != null ? _ref.length : void 0) { + if ((ref = cerr.stack) != null ? ref.length : void 0) { res += "\n\nSTACK\n=====\n"; count = 0; - _ref1 = cerr.stack; - for (i = _i = 0, _len = _ref1.length; _i < _len; i = ++_i) { - item = _ref1[i]; + ref1 = cerr.stack; + for (i = k = 0, len = ref1.length; k < len; i = ++k) { + item = ref1[i]; if (i === 0) { - res += "" + (count++) + " " + item.line; + res += (count++) + " " + item.line; } else if (item.in_src_file && (item.above_pub_call || item.at_pub_call)) { - res += "" + (count++) + " [" + (this._lineRangeToPhrase(item.line_range)) + "] " + cerr.dir_name + "/" + cerr.file; + res += (count++) + " [" + (this._lineRangeToPhrase(item.line_range)) + "] " + cerr.dir_name + "/" + cerr.file; } else if (item.in_src_file) { continue; } else { @@ -176,68 +189,64 @@ }; toffeeError.prototype.getPrettyPrint = function() { - /* - returns an HTML blob explaining the error - with lines highlighted - */ - var cerr, count, extra, header, i, item, j, line, padding, padding_len, res, _i, _j, _len, _ref, _ref1, _ref2, _ref3, _ref4; + /* + returns an HTML blob explaining the error + with lines highlighted + */ + var cerr, count, extra, header, i, item, j, k, l, len, line, padding, padding_len, ref, ref1, ref2, ref3, ref4, res; cerr = this.getConvertedError(); res = ""; - if (cerr.type === 234432) { - header = cerr.message; - } else { - header = "" + cerr.dir_name + "/" + cerr.file + ": " + cerr.message + ""; - } - res += "
    \n \n
    " + header + "
    \n \n
    \n \n
    "; - if ((_ref = cerr.stack) != null ? _ref.length : void 0) { - res += "
    "; + header = cerr.dir_name + "/" + cerr.file + ": " + (_ppEscape(cerr.message)) + ""; + res += "
    \n \n
    " + header + "
    \n \n
    \n \n
    "; + if ((ref = cerr.stack) != null ? ref.length : void 0) { + res += "
    "; count = 0; - _ref1 = cerr.stack; - for (i = _i = 0, _len = _ref1.length; _i < _len; i = ++_i) { - item = _ref1[i]; + ref1 = cerr.stack; + for (i = k = 0, len = ref1.length; k < len; i = ++k) { + item = ref1[i]; if (i === 0) { - res += "
    " + (count++) + " " + item.line + "
    "; + res += "
    " + (count++) + " " + item.line + "
    "; } else if (item.in_src_file && (item.above_pub_call || item.at_pub_call)) { - res += "
    " + (count++) + " [" + (this._lineRangeToPhrase(item.line_range)) + "] " + cerr.dir_name + "/" + cerr.file + "
    "; + res += "
    " + (count++) + " [" + (this._lineRangeToPhrase(item.line_range)) + "] " + cerr.dir_name + "/" + cerr.file + "
    "; } else if (item.in_src_file) { continue; } else { - res += "
    " + (count++) + item.line + "
    "; + res += "
    " + (count++) + item.line + "
    "; } } res += "
    "; } - for (i = _j = _ref2 = cerr.line_range[0] - 3, _ref3 = cerr.line_range[1] + 1; _ref2 <= _ref3 ? _j < _ref3 : _j > _ref3; i = _ref2 <= _ref3 ? ++_j : --_j) { + for (i = l = ref2 = cerr.line_range[0] - 3, ref3 = cerr.line_range[1] + 1; ref2 <= ref3 ? l < ref3 : l > ref3; i = ref2 <= ref3 ? ++l : --l) { if ((i < 0) || i > this.toffeeSrcLines.length - 1) { continue; } line = _ppEscape(this.toffeeSrcLines[i]); padding_len = 5 - ("" + (i + 1)).length; padding = ((function() { - var _k, _results; - _results = []; - for (j = _k = 0; 0 <= padding_len ? _k < padding_len : _k > padding_len; j = 0 <= padding_len ? ++_k : --_k) { - _results.push(" "); + var n, ref4, results; + results = []; + for (j = n = 0, ref4 = padding_len; 0 <= ref4 ? n < ref4 : n > ref4; j = 0 <= ref4 ? ++n : --n) { + results.push(" "); } - return _results; + return results; })()).join(""); - if ((cerr.line_range[0] <= (_ref4 = i + 1) && _ref4 < cerr.line_range[1])) { + if (((cerr.line_range[0] - 1) <= (ref4 = i) && ref4 < cerr.line_range[1])) { extra = ""; } else { extra = ""; } - res += "" + extra + "\n" + (i + 1) + ": " + padding + " " + line + "
    "; + res += extra + "\n" + (i + 1) + ": " + padding + " " + line + "

    "; } res += " \n
    \n\n
    "; return res; }; toffeeError.prototype._lineRangeToPhrase = function(lrange) { - if (lrange[0] >= lrange[1] - 1) { + if (lrange[0] === lrange[1]) { return "on line " + lrange[0]; } else { - return "between lines " + lrange[0] + " and " + (lrange[1] - 1); + return "between lines " + lrange[0] + " and " + lrange[1]; } }; @@ -250,23 +259,33 @@ return parseInt(m[1]); }; + toffeeError.prototype._convertJsErrorRangeToToffeeRange = function(loc) { + var range, range2; + range = this._convertOffensiveLineToToffeeRange(loc.first_line); + if (loc.last_line != null) { + range2 = this._convertOffensiveLineToToffeeRange(loc.last_line); + range[1] = range2[1]; + } + return range; + }; + toffeeError.prototype._convertOffensiveLineToToffeeRange = function(lineno) { - /* - Given the error line in a converted file, hunts for surrounding - __toffee.lineno calls and returns a pair array with the error position - range in the original toffee file. - */ + /* + Given the error line in a converted file, hunts for surrounding + __toffee.lineno calls and returns a pair array with the error position + range in the original toffee file. + */ var next, next_matches, ol, prev, prev_matches, res, tl; ol = this.offensiveSrcLines; tl = this.toffeeSrcLines; - if ((!(lineno != null)) || isNaN(lineno)) { + if ((lineno == null) || isNaN(lineno)) { return [1, tl.length]; } prev = ol.slice(0, lineno).join("\n"); next = ol.slice(lineno).join("\n"); - prev_matches = prev.match(/__toffee.lineno[ ]*=[ ]*([0-9]+)/g); - next_matches = next.match(/__toffee.lineno[ ]*=[ ]*([0-9]+)/g); + prev_matches = prev.match(/_ln[ ]*\(?[ ]*([0-9]+)/g); + next_matches = next.match(/_ln[ ]*\(?[ ]*([0-9]+)/g); res = [1, tl.length]; if (prev_matches != null ? prev_matches.length : void 0) { res[0] = parseInt(prev_matches[prev_matches.length - 1].match(/[0-9]+/)[0]); @@ -279,135 +298,21 @@ return toffeeError; - })(); + })(Error); exports.toffeeError = toffeeError; - eh = exports.errorHandler = { - generateRuntimeError: function(view, e) { - /* - e: the error caught when running - */ - - var after, after_matches, before, msg, new_msg, prev_matches, res, search, src, src_lines, stack, txt_lines; - src = view.javaScript; - msg = e.message; - stack = e.stack; - res = { - src_line: 0, - toffee_line_range: [0, 1], - original_msg: msg, - converted_msg: msg - }; - search = stack.match(/pub\ \(undefined\:([0-9]+):[0-9]+/); - if (!((search != null ? search.length : void 0) >= 2)) { - return res; - } - res.src_line = search[1]; - src_lines = src.split('\n'); - txt_lines = view.txt.split('\n'); - before = src_lines.slice(0, res.src_line).join("\n"); - after = src_lines.slice(res.src_line).join("\n"); - prev_matches = before.match(/__toffee.lineno[ ]*=[ ]*([0-9]+)/g); - after_matches = after.match(/__toffee.lineno[ ]*=[ ]*([0-9]+)/g); - if (prev_matches != null ? prev_matches.length : void 0) { - res.toffee_line_range[0] = parseInt(prev_matches[prev_matches.length - 1].match(/[0-9]+/)[0]); - } else { - res.toffee_line_range[0] = 1; - } - if (after_matches != null ? after_matches.length : void 0) { - res.toffee_line_range[1] = parseInt(after_matches[0].match(/[0-9]+/)[0]); - } else { - res.toffee_line_range[1] = txt_lines.length; - } - res.offensive_lines = txt_lines.slice(res.toffee_line_range[0] - 1, res.toffee_line_range[1] - 1); - if (res.toffee_line_range[0] === res.toffee_line_range[1] - 1) { - new_msg = "on line " + res.toffee_line_range[0]; - } else { - new_msg = "between lines " + res.toffee_line_range[0] + " and " + res.toffee_line_range[1]; - } - res.converted_msg = res.original_msg + " " + new_msg; - if (view.fileName) { - res.converted_msg = "" + view.fileName + ": " + res.converted_msg; - } - return res; - }, - generateCompileToJsError: function(view, e) { - /* - e: the error caught when compiling - */ - - var msg, new_msg, res, search, src; - src = view.coffeeScript; - msg = e.message; - res = { - src_line: 0, - toffee_line_range: [0, 1], - original_msg: msg, - converted_msg: msg - }; - search = msg.match(/on line ([0-9]+)/); - if ((search != null ? search.length : void 0) >= 2) { - res.src_line = search[1]; - res.toffee_line_range = this._convertSrcLineToToffeeRange(view.coffeeScript, res.src_line); - res.offensive_lines = txt_lines.slice(res.toffee_line_range[0] - 1, res.toffee_line_range[1] - 1); - if (res.toffee_line_range[0] === res.toffee_line_range[1] - 1) { - new_msg = "on line " + res.toffee_line_range[0]; - } else { - new_msg = "between lines " + res.toffee_line_range[0] + " and " + res.toffee_line_range[1]; - } - res.converted_msg = res.original_msg.replace("on line " + res.src_line, new_msg); - if (view.fileName) { - res.converted_msg = "" + view.fileName + ": " + res.converted_msg; - } - } - return res; - }, - prettyPrintError: function(view) { - var i, line, lineno, padding, padding_len, res, txt_lines, _i, _ref, _ref1; - if (!view.error) { - return ""; - } else { - res = "
    "; - res += "" + (eh._ppEscape(view.error.converted_msg)) + ""; - res += "\n
    --------
    "; - res += "\n
    "; - txt_lines = view.txt.split('\n'); - for (i = _i = _ref = view.error.toffee_line_range[0] - 3, _ref1 = view.error.toffee_line_range[1] + 1; _ref <= _ref1 ? _i < _ref1 : _i > _ref1; i = _ref <= _ref1 ? ++_i : --_i) { - if ((i < 0) || i > txt_lines.length - 1) { - continue; - } - line = eh._ppEscape(txt_lines[i]); - lineno = i + 1; - padding_len = 5 - ("" + lineno).length; - padding = ((function() { - var _j, _results; - _results = []; - for (i = _j = 0; 0 <= padding_len ? _j < padding_len : _j > padding_len; i = 0 <= padding_len ? ++_j : --_j) { - _results.push(" "); - } - return _results; - })()).join(""); - res += "\n" + lineno + ": " + padding + " " + line + "
    "; - } - res += "\n
    "; - res += "\n
    "; - return res; - } - } - }; - _ppEscape = function(txt) { var i, m; txt = txt.replace(/&/g, '&').replace(/ _ref; i = 0 <= _ref ? ++_i : --_i) { - _results.push(" "); + var k, ref, results; + results = []; + for (i = k = 0, ref = m[0].length; 0 <= ref ? k < ref : k > ref; i = 0 <= ref ? ++k : --k) { + results.push(" "); } - return _results; + return results; })()).join("")); return txt; }; diff --git a/lib/pool.js b/lib/pool.js new file mode 100644 index 0000000..d61bdf7 --- /dev/null +++ b/lib/pool.js @@ -0,0 +1,32 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var Pool; + + Pool = (function() { + function Pool(cons, size) { + this._consfn = cons; + this._size = size; + this._pool = []; + } + + Pool.prototype.get = function() { + if (this._pool.length > 0) { + return this._pool.pop(); + } else { + return this._consfn(); + } + }; + + Pool.prototype.release = function(x) { + if (this._pool.length < this._size) { + return this._pool.push(x); + } + }; + + return Pool; + + })(); + + exports.Pool = Pool; + +}).call(this); diff --git a/lib/toffee_lang.js b/lib/toffee_lang.js index cc2c8f8..b3f17e5 100644 --- a/lib/toffee_lang.js +++ b/lib/toffee_lang.js @@ -1,422 +1,655 @@ -/* Jison generated parser */ +/* parser generated by jison 0.4.18 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ var toffee_lang = (function(){ -var parser = {trace: function trace() { }, +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[2,7],$V1=[1,8],$V2=[1,7],$V3=[1,9],$V4=[5,15],$V5=[1,15],$V6=[2,19],$V7=[1,20],$V8=[11,12,13,14,15,16],$V9=[5,9,12,13,14,15,16],$Va=[5,9,12,15,16]; +var parser = {trace: function trace () { }, yy: {}, -symbols_: {"error":2,"starter":3,"toffee_zone":4,"EOF":5,"toffee_code":6,"flip_to_coffee":7,"flip_to_toffeecomment":8,"START_TOFFEE_COMMENT":9,"code":10,"END_TOFFEE_COMMENT":11,"START_COFFEE":12,"coffee_zone":13,"END_COFFEE":14,"coffee_code":15,"flip_to_toffee":16,"START_TOFFEE":17,"END_TOFFEE":18,"START_INDENTED_TOFFEE":19,"CODE":20,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOF",9:"START_TOFFEE_COMMENT",11:"END_TOFFEE_COMMENT",12:"START_COFFEE",14:"END_COFFEE",17:"START_TOFFEE",18:"END_TOFFEE",19:"START_INDENTED_TOFFEE",20:"CODE"}, -productions_: [0,[3,2],[4,1],[4,3],[4,2],[4,3],[4,2],[4,0],[8,3],[7,3],[13,1],[13,3],[13,2],[13,0],[16,3],[16,3],[6,1],[15,1],[10,1],[10,2]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { +symbols_: {"error":2,"starter":3,"toffee_zone":4,"EOF":5,"toffee_code":6,"flip_to_coffee":7,"flip_to_toffee_comment":8,"START_TOFFEE_COMMENT":9,"toffee_commented_region":10,"END_TOFFEE_COMMENT":11,"START_COFFEE":12,"END_COFFEE":13,"START_TOFFEE":14,"END_TOFFEE":15,"CODE":16,"coffee_zone":17,"coffee_code":18,"flip_to_toffee":19,"code":20,"$accept":0,"$end":1}, +terminals_: {2:"error",5:"EOF",9:"START_TOFFEE_COMMENT",11:"END_TOFFEE_COMMENT",12:"START_COFFEE",13:"END_COFFEE",14:"START_TOFFEE",15:"END_TOFFEE",16:"CODE"}, +productions_: [0,[3,2],[4,1],[4,3],[4,2],[4,3],[4,2],[4,0],[8,3],[10,2],[10,2],[10,2],[10,2],[10,2],[10,0],[7,3],[17,1],[17,3],[17,2],[17,0],[19,3],[6,1],[18,1],[20,1],[20,2]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ var $0 = $$.length - 1; switch (yystate) { -case 1: this.$ = ["TOFFEE_ZONE", $$[$0-1]]; return this.$; -break; -case 2: this.$ = [$$[$0]]; -break; -case 3: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-2],$$[$0-1]); -break; -case 4: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-1]); +case 1: + this.$ = ["TOFFEE_ZONE", $$[$0-1]]; return this.$; break; -case 5: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-2]); +case 2: case 16: + this.$ = [$$[$0]]; break; -case 6: this.$ = $$[$0]; +case 3: case 17: + this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-2],$$[$0-1]); break; -case 7: this.$ = []; +case 4: case 18: + this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-1]); break; -case 9: this.$ = ["COFFEE_ZONE", $$[$0-1]]; +case 5: + this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-2]); break; -case 10: this.$ = [$$[$0]]; +case 6: + this.$ = $$[$0]; break; -case 11: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-2],$$[$0-1]); +case 7: case 19: + this.$ = []; break; -case 12: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-1]); +case 15: + this.$ = ["COFFEE_ZONE", $$[$0-1]]; break; -case 13: this.$ = []; +case 20: + this.$ = ["TOFFEE_ZONE", $$[$0-1]]; break; -case 14: this.$ = ["TOFFEE_ZONE", $$[$0-1]]; +case 21: + this.$ = ["TOFFEE", $$[$0][0], $$[$0][1] ]; break; -case 15: this.$ = ["INDENTED_TOFFEE_ZONE", $$[$0-1]]; +case 22: + this.$ = ["COFFEE", $$[$0][0], $$[$0][1] ]; break; -case 16: this.$ = ["TOFFEE", $$[$0][0], $$[$0][1] ]; -break; -case 17: this.$ = ["COFFEE", $$[$0][0], $$[$0][1] ]; -break; -case 18: var ln = yylineno + 1 - $$[$0].split("\n").length + 1; +case 23: + var ln = yylineno + 1 - $$[$0].split("\n").length + 1; this.$ = [$$[$0], ln]; break; -case 19: var c = $$[$0-1][0] + $$[$0]; +case 24: + var c = $$[$0-1][0] + $$[$0]; var ln = yylineno + 1 - c.split("\n").length + 1; this.$ = [c, ln]; break; } }, -table: [{3:1,4:2,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],20:[1,9]},{1:[3]},{5:[1,10]},{5:[2,2],7:11,8:12,9:[1,8],12:[1,7],18:[2,2]},{4:13,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{4:14,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{5:[2,16],9:[2,16],12:[2,16],18:[2,16],20:[1,15]},{10:19,13:16,14:[2,13],15:17,16:18,17:[1,20],19:[1,21],20:[1,9]},{10:22,20:[1,9]},{5:[2,18],9:[2,18],11:[2,18],12:[2,18],14:[2,18],17:[2,18],18:[2,18],19:[2,18],20:[2,18]},{1:[2,1]},{4:23,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{4:24,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{5:[2,4],18:[2,4]},{5:[2,6],18:[2,6]},{5:[2,19],9:[2,19],11:[2,19],12:[2,19],14:[2,19],17:[2,19],18:[2,19],19:[2,19],20:[2,19]},{14:[1,25]},{14:[2,10],16:26,17:[1,20],19:[1,21]},{10:19,13:27,14:[2,13],15:17,16:18,17:[1,20],19:[1,21],20:[1,9]},{14:[2,17],17:[2,17],19:[2,17],20:[1,15]},{4:28,6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{4:29,6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{11:[1,30],20:[1,15]},{5:[2,3],18:[2,3]},{5:[2,5],18:[2,5]},{5:[2,9],9:[2,9],12:[2,9],18:[2,9],20:[2,9]},{10:19,13:31,14:[2,13],15:17,16:18,17:[1,20],19:[1,21],20:[1,9]},{14:[2,12]},{18:[1,32]},{18:[1,33]},{5:[2,8],9:[2,8],12:[2,8],18:[2,8],20:[2,8]},{14:[2,11]},{14:[2,14],17:[2,14],19:[2,14],20:[2,14]},{14:[2,15],17:[2,15],19:[2,15],20:[2,15]}], -defaultActions: {10:[2,1],27:[2,12],31:[2,11]}, -parseError: function parseError(str, hash) { - throw new Error(str); +table: [{3:1,4:2,5:$V0,6:3,7:4,8:5,9:$V1,12:$V2,16:$V3,20:6},{1:[3]},{5:[1,10]},o($V4,[2,2],{7:11,8:12,9:$V1,12:$V2}),o($V4,$V0,{6:3,7:4,8:5,20:6,4:13,9:$V1,12:$V2,16:$V3}),o($V4,$V0,{6:3,7:4,8:5,20:6,4:14,9:$V1,12:$V2,16:$V3}),o([5,9,12,15],[2,21],{16:$V5}),{13:$V6,14:$V7,16:$V3,17:16,18:17,19:18,20:19},o($V8,[2,14],{10:21}),o($V9,[2,23]),{1:[2,1]},o($V4,$V0,{6:3,7:4,8:5,20:6,4:22,9:$V1,12:$V2,16:$V3}),o($V4,$V0,{6:3,7:4,8:5,20:6,4:23,9:$V1,12:$V2,16:$V3}),o($V4,[2,4]),o($V4,[2,6]),o($V9,[2,24]),{13:[1,24]},{13:[2,16],14:$V7,19:25},{13:$V6,14:$V7,16:$V3,17:26,18:17,19:18,20:19},o([13,14],[2,22],{16:$V5}),{4:27,6:3,7:4,8:5,9:$V1,12:$V2,15:$V0,16:$V3,20:6},{11:[1,28],12:[1,29],13:[1,30],14:[1,31],15:[1,32],16:[1,33]},o($V4,[2,3]),o($V4,[2,5]),o($Va,[2,15]),{13:$V6,14:$V7,16:$V3,17:34,18:17,19:18,20:19},{13:[2,18]},{15:[1,35]},o($Va,[2,8]),o($V8,[2,9]),o($V8,[2,10]),o($V8,[2,11]),o($V8,[2,12]),o($V8,[2,13]),{13:[2,17]},o([13,14,16],[2,20])], +defaultActions: {10:[2,1],26:[2,18],34:[2,17]}, +parseError: function parseError (str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } }, parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], // semantic value stack - lstack = [], // location stack - table = this.table, - yytext = '', - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - - //this.reductionCount = this.shiftCount = 0; - - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - if (typeof this.lexer.yylloc == 'undefined') - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; lstack.push(yyloc); - - if (typeof this.yy.parseError === 'function') - this.parseError = this.yy.parseError; - - function popStack (n) { - stack.length = stack.length - 2*n; + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; vstack.length = vstack.length - n; lstack.length = lstack.length - n; } - - 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; + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; while (true) { - // retreive state number from top of stack - state = stack[stack.length-1]; - - // use default actions if available + state = stack[stack.length - 1]; if (this.defaultActions[state]) { action = this.defaultActions[state]; } else { - if (symbol == null) + if (symbol === null || typeof symbol == 'undefined') { symbol = lex(); - // read action for current state and first input + } action = table[state] && table[state][symbol]; } - - // handle parse error - _handle_error: - if (typeof action === 'undefined' || !action.length || !action[0]) { - - if (!recovering) { - // Report error + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'"+this.terminals_[p]+"'"); + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } } - var errStr = ''; - if (this.lexer.showPosition) { - errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'"; + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; } else { - errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + - (symbol == 1 /*EOF*/ ? "end of input" : - ("'"+(this.terminals_[symbol] || symbol)+"'")); - } - this.parseError(errStr, - {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - - // just recovered from another error - if (recovering == 3) { - if (symbol == EOF) { - throw new Error(errStr || 'Parsing halted.'); - } - - // discard current lookahead and grab another - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - symbol = lex(); - } - - // try to recover from error - while (1) { - // check for error recovery rule in this state - if ((TERROR.toString()) in table[state]) { - break; - } - if (state == 0) { - throw new Error(errStr || 'Parsing halted.'); + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); } - popStack(1); - state = stack[stack.length-1]; + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); } - - 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); + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); } - switch (action[0]) { - - case 1: // shift - //this.shiftCount++; - - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); // push state - symbol = null; - if (!preErrorSymbol) { // normal execution/no error - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { // error just occurred, resume old lookahead f/ before error - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - - case 2: // reduce - //this.reductionCount++; - - len = this.productions_[action[1]][1]; - - // perform semantic action - yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 - // default location, uses first token for firsts, last for lasts - yyval._$ = { - first_line: lstack[lstack.length-(len||1)].first_line, - last_line: lstack[lstack.length-1].last_line, - first_column: lstack[lstack.length-(len||1)].first_column, - last_column: lstack[lstack.length-1].last_column - }; - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - - if (typeof r !== 'undefined') { - return r; - } - - // pop off stack - if (len) { - stack = stack.slice(0,-1*len*2); - vstack = vstack.slice(0, -1*len); - lstack = lstack.slice(0, -1*len); + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; } - - stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) - vstack.push(yyval.$); - lstack.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 - return true; + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; } - } - return true; }}; -/* Jison generated lexer */ +/* generated by jison-lex 0.3.4 */ var lexer = (function(){ -var lexer = ({EOF:1, +var lexer = ({ + +EOF:1, + parseError:function parseError(str, hash) { - if (this.yy.parseError) { - this.yy.parseError(str, hash); + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); } else { throw new Error(str); } }, -setInput:function (input) { + +// resets the lexer, sets new input +setInput:function (input, yy) { + this.yy = yy || this.yy || {}; this._input = input; - this._more = this._less = this.done = false; + this._more = this._backtrack = this.done = false; this.yylineno = this.yyleng = 0; this.yytext = this.matched = this.match = ''; this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0,0]; + } + this.offset = 0; return this; }, + +// consumes and returns one char from the input input:function () { var ch = this._input[0]; - this.yytext+=ch; + this.yytext += ch; this.yyleng++; - this.match+=ch; - this.matched+=ch; - var lines = ch.match(/\n/); - if (lines) this.yylineno++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); return ch; }, + +// unshifts one char (or a string) into the input unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + + oldLines[oldLines.length - lines.length].length - lines[0].length : + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; return this; }, + +// When called from action, caches matched text and appends it on next action more:function () { this._more = true; return this; }, + +// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. +reject:function () { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + + } + return this; + }, + +// retain first n characters of the match less:function (n) { - this._input = this.match.slice(n) + this._input; + this.unput(this.match.slice(n)); }, + +// displays already matched input, i.e. for error messages pastInput:function () { var past = this.matched.substr(0, this.matched.length - this.match.length); return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); }, + +// displays upcoming input, i.e. for error messages upcomingInput:function () { var next = this.match; if (next.length < 20) { next += this._input.substr(0, 20-next.length); } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); + return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); }, + +// displays the character position where the lexing error occurred, i.e. for error messages showPosition:function () { var pre = this.pastInput(); var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + +// test the lexed token: return FALSE when not a match, otherwise return token +test_match:function(match, indexed_rule) { + var token, + lines, + backup; + + if (this.options.backtrack_lexer) { + // save context + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? + lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : + this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + // recover context + for (var k in backup) { + this[k] = backup[k]; + } + return false; // rule action called reject() implying the next rule should be tested instead. + } + return false; }, + +// return next match in input next:function () { if (this.done) { return this.EOF; } - if (!this._input) this.done = true; + if (!this._input) { + this.done = true; + } var token, match, tempMatch, - index, - col, - lines; + index; if (!this._more) { this.yytext = ''; this.match = ''; } var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { + for (var i = 0; i < rules.length; i++) { tempMatch = this._input.match(this.rules[rules[i]]); if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { match = tempMatch; index = i; - if (!this.options.flex) break; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; // rule action called reject() implying a rule MISmatch. + } else { + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + } else if (!this.options.flex) { + break; + } } } if (match) { - lines = match[0].match(/\n.*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length} - this.yytext += match[0]; - this.match += match[0]; - this.yyleng = this.yytext.length; - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); - if (this.done && this._input) this.done = false; - if (token) return token; - else return; + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; } if (this._input === "") { return this.EOF; } else { - this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); } }, -lex:function lex() { + +// return next match that has a token +lex:function lex () { var r = this.next(); - if (typeof r !== 'undefined') { + if (r) { return r; } else { return this.lex(); } }, -begin:function begin(condition) { + +// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) +begin:function begin (condition) { this.conditionStack.push(condition); }, -popState:function popState() { - return this.conditionStack.pop(); + +// pop the previously active lexer condition state off the condition stack +popState:function popState () { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; + +// produce the lexer rule set which is active for the currently active lexer condition state +_currentRules:function _currentRules () { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; + +// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available +topState:function topState (n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } }, -pushState:function begin(condition) { + +// alias for begin(condition) +pushState:function pushState (condition) { this.begin(condition); - }}); -lexer.options = {}; -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { + }, -var YYSTATE=YY_START +// return the number of states currently on the stack +stateStackSize:function stateStackSize() { + return this.conditionStack.length; + }, +options: {}, +performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { +var YYSTATE=YY_START; switch($avoiding_name_collisions) { case 0:return 9; break; case 1:return 11; break; -case 2:return 18; +case 2:return 15; break; -case 3:return 19; +case 3:return 14; break; case 4:return 12; break; -case 5:return 14; +case 5:return 13; break; -case 6:return 17; +case 6:return 16; break; -case 7:return 20; -break; -case 8:return 5; +case 7:return 5; break; } -}; -lexer.rules = [/^\{##/,/^##\}/,/^:\}/,/^\{:/,/^\{#/,/^#\}/,/^[\-][\t\r\n ]*\{:/,/^[^{}#\\:\-]+|[\\{}#:\-]/,/^$/]; -lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8],"inclusive":true}}; -return lexer;})() +}, +rules: [/^(?:\{##)/,/^(?:##\})/,/^(?::\})/,/^(?:\{:)/,/^(?:\{#)/,/^(?:#\})/,/^(?:[^{}#\\:\-]+|[\\{}#:\-])/,/^(?:$)/], +conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7],"inclusive":true}} +}); +return lexer; +})(); parser.lexer = lexer; -return parser; +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; })(); + + if (typeof require !== 'undefined' && typeof exports !== 'undefined') { exports.parser = toffee_lang; -exports.parse = function () { return toffee_lang.parse.apply(toffee_lang, 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"}); +exports.Parser = toffee_lang.Parser; +exports.parse = function () { return toffee_lang.parse.apply(toffee_lang, arguments); }; +exports.main = function commonjsMain (args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); } + var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8"); return exports.parser.parse(source); -} +}; if (typeof module !== 'undefined' && require.main === module) { - exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args); + exports.main(process.argv.slice(1)); } } \ No newline at end of file diff --git a/lib/utils.js b/lib/utils.js index 28733ef..7417318 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,4 +1,4 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.12.7 (function() { var lex, lexer; @@ -7,13 +7,13 @@ lex = new lexer.Lexer(); exports.interpolateString = function(str) { - /* - Similar to the interpolateString function in CoffeeScript, - except that it doesn't actually work on anything inside an outer #{}; - we're just looking to recognize them. - */ - var expr, i, inner, interpolated, letter, pi, res, tag, tokens, value, _i, _len, _ref; + /* + Similar to the interpolateString function in CoffeeScript, + except that it doesn't actually work on anything inside an outer #{}; + we're just looking to recognize them. + */ + var expr, i, inner, interpolated, j, len, letter, pi, ref, res, tag, tokens, value; tokens = []; res = []; pi = 0; @@ -48,8 +48,8 @@ if (interpolated = tokens.length > 1) { res.push('(', '('); } - for (i = _i = 0, _len = tokens.length; _i < _len; i = ++_i) { - _ref = tokens[i], tag = _ref[0], value = _ref[1]; + for (i = j = 0, len = tokens.length; j < len; i = ++j) { + ref = tokens[i], tag = ref[0], value = ref[1]; if (i) { res.push('+', '+'); } diff --git a/lib/view.js b/lib/view.js index b15c7c2..db150aa 100644 --- a/lib/view.js +++ b/lib/view.js @@ -1,67 +1,133 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.12.7 (function() { - var TAB_SPACES, coffee, errorHandler, errorTypes, parser, states, toffeeError, utils, view, vm, _ref, _ref1; + var TAB_SPACES, coffee, e, errorHandler, errorTypes, getBundleHeaders, getCommonHeaders, getCommonHeadersJs, parser, ref, ref1, spaces, states, tabs, toffeeError, util, utils, view, vm; parser = require('./toffee_lang').parser; - _ref = require('./errorHandler'), errorHandler = _ref.errorHandler, toffeeError = _ref.toffeeError, errorTypes = _ref.errorTypes; + ref = require('./errorHandler'), errorHandler = ref.errorHandler, toffeeError = ref.toffeeError, errorTypes = ref.errorTypes; - _ref1 = require('./consts'), states = _ref1.states, TAB_SPACES = _ref1.TAB_SPACES; + ref1 = require('./consts'), states = ref1.states, TAB_SPACES = ref1.TAB_SPACES; utils = require('./utils'); vm = require('vm'); + util = require('util'); + try { coffee = require("iced-coffee-script"); - } catch (e) { + } catch (error) { + e = error; coffee = require("coffee-script"); } - view = (function() { + spaces = function(n) { + var i; + return ((function() { + var j, ref2, results; + results = []; + for (i = j = 0, ref2 = n; 0 <= ref2 ? j < ref2 : j > ref2; i = 0 <= ref2 ? ++j : --j) { + results.push(" "); + } + return results; + })()).join(""); + }; + + tabs = function(n) { + var i; + return ((function() { + var j, ref2, results; + results = []; + for (i = j = 0, ref2 = n; 0 <= ref2 ? j < ref2 : j > ref2; i = 0 <= ref2 ? ++j : --j) { + results.push(spaces(TAB_SPACES)); + } + return results; + })()).join(""); + }; + + getCommonHeaders = function(tab_level, include_bundle_headers, auto_escape) { + + /* + each view will use this, or if they're bundled together, + it'll only be used once. + + include_bundle_headers: includes some functions needed for browser use + */ + var __; + __ = tabs(tab_level); + return "\n\n" + __ + "if not toffee? then toffee = {}\n" + __ + "if not toffee.templates then toffee.templates = {}\n\n" + __ + "toffee.states = " + (JSON.stringify(states)) + "\n\n" + __ + "toffee.__json = (locals, o, opts) ->\n" + __ + " opts or= {}\n" + __ + " opts.indent or= \"\"\n" + __ + " if not o?\n" + __ + " return \"null\"\n" + __ + " else\n" + __ + " return \"\" + JSON.stringify(o,null,opts.indent)\n" + __ + " .replace(//g,'\\\\u003E')\n" + __ + " .replace(/&/g,'\\\\u0026').replace(/\\u2028/g, '\\\\u2028')\n" + __ + " .replace(/\\u2029/g, '\\\\u2029')\n" + __ + " .replace(/\\u200e/g, '\\\\u200e') # LEFT-TO-RIGHT MARK\n" + __ + " .replace(/\\u200f/g, '\\\\u200f') # RIGHT-TO-LEFT MARK\n" + __ + " .replace(/\\u202a/g, '\\\\u202a') # LEFT-TO-RIGHT EMBEDDING\n" + __ + " .replace(/\\u202b/g, '\\\\u202b') # RIGHT-TO-LEFT EMBEDDING\n" + __ + " .replace(/\\u202c/g, '\\\\u202c') # POP DIRECTIONAL FORMATTING\n" + __ + " .replace(/\\u202d/g, '\\\\u202d') # LEFT-TO-RIGHT OVERRIDE\n" + __ + " .replace(/\\u202e/g, '\\\\u202e') # RIGHT-TO-LEFT OVERRIDE\n" + __ + " .replace(/\\u206a/g, '\\\\u206a') # INHIBIT SYMMETRIC SWAPPING\n" + __ + " .replace(/\\u206b/g, '\\\\u206b') # ACTIVATE SYMMETRIC SWAPPING\n" + __ + " .replace(/\\u206c/g, '\\\\u206c') # INHIBIT ARABIC FORM SHAPING\n" + __ + " .replace(/\\u206d/g, '\\\\u206d') # ACTIVATE ARABIC FORM SHAPING\n" + __ + " .replace(/\\u206e/g, '\\\\u206e') # NATIONAL DIGIT SHAPES\n" + __ + " .replace(/\\u206f/g, '\\\\u206f') # NOMINAL DIGIT SHAPES\n" + __ + " .replace(/\\u2066/g, '\\\\u2066') # LEFT-TO-RIGHT ISOLATE (LRI)\n" + __ + " .replace(/\\u2067/g, '\\\\u2067') # RIGHT-TO-LEFT ISOLATE (RLI)\n" + __ + " .replace(/\\u2068/g, '\\\\u2068') # FIRST STRONG ISOLATE (FSI)\n" + __ + " .replace(/\\u2069/g, '\\\\u2069') # POP DIRECTIONAL ISOLATE (PDI)\n\n\n" + __ + "toffee.__raw = (locals, o) -> o\n\n" + __ + "toffee.__html = (locals, o) ->\n" + __ + " (\"\"+o).replace(/&/g, '&')\n" + __ + " .replace(//g, '>')\n" + __ + " .replace(/\"/g, '"')\n" + __ + " .replace(/\\u200e/g, '') # LEFT-TO-RIGHT MARK\n" + __ + " .replace(/\\u200f/g, '') # RIGHT-TO-LEFT MARK\n" + __ + " .replace(/\\u202a/g, '') # LEFT-TO-RIGHT EMBEDDING\n" + __ + " .replace(/\\u202b/g, '') # RIGHT-TO-LEFT EMBEDDING\n" + __ + " .replace(/\\u202c/g, '') # POP DIRECTIONAL FORMATTING\n" + __ + " .replace(/\\u202d/g, '') # LEFT-TO-RIGHT OVERRIDE\n" + __ + " .replace(/\\u202e/g, '') # RIGHT-TO-LEFT OVERRIDE\n" + __ + " .replace(/\\u206a/g, '') # INHIBIT SYMMETRIC SWAPPING\n" + __ + " .replace(/\\u206b/g, '') # ACTIVATE SYMMETRIC SWAPPING\n" + __ + " .replace(/\\u206c/g, '') # INHIBIT ARABIC FORM SHAPING\n" + __ + " .replace(/\\u206d/g, '') # ACTIVATE ARABIC FORM SHAPING\n" + __ + " .replace(/\\u206e/g, '') # NATIONAL DIGIT SHAPES\n" + __ + " .replace(/\\u206f/g, '') # NOMINAL DIGIT SHAPES\n" + __ + " .replace(/\\u2066/g, '') # LEFT-TO-RIGHT ISOLATE (LRI)\n" + __ + " .replace(/\\u2067/g, '') # RIGHT-TO-LEFT ISOLATE (RLI)\n" + __ + " .replace(/\\u2068/g, '') # FIRST STRONG ISOLATE (FSI)\n" + __ + " .replace(/\\u2069/g, '') # POP DIRECTIONAL ISOLATE (PDI)\n\n\n" + __ + "toffee.__escape = (locals, o) ->\n" + __ + " if locals.__toffee.autoEscape? then ae = locals.__toffee.autoEscape\n" + __ + " else if " + (auto_escape != null) + " then ae = " + auto_escape + "\n" + __ + " else ae = true\n" + __ + " if ae\n" + __ + " if o is undefined then return ''\n" + __ + " if o? and (typeof o) is \"object\" then return locals.json o\n" + __ + " return locals.html o\n" + __ + " return o\n\n" + __ + "toffee.__augmentLocals = (locals, bundle_path) ->\n" + __ + " _l = locals\n" + __ + " _t = _l.__toffee = {out: []}\n" + __ + " if not _l.print? then _l.print = (o) -> toffee.__print _l, o\n" + __ + " if not _l.json? then _l.json = (o, opts) -> toffee.__json _l, o, opts\n" + __ + " if not _l.raw? then _l.raw = (o) -> toffee.__raw _l, o\n" + __ + " if not _l.html? then _l.html = (o) -> toffee.__html _l, o\n" + __ + " if not _l.escape? then _l.escape = (o) -> toffee.__escape _l, o\n" + __ + " if not _l.partial? then _l.partial = (path, vars) -> toffee.__partial toffee.templates[\"\#{bundle_path}\"], _l, path, vars\n" + __ + " if not _l.snippet? then _l.snippet = (path, vars) -> toffee.__snippet toffee.templates[\"\#{bundle_path}\"], _l, path, vars\n" + __ + " if not _l.load? then _l.load = (path, vars) -> toffee.__load toffee.templates[\"\#{bundle_path}\"], _l, path, vars\n" + __ + " _t.print = _l.print\n" + __ + " _t.json = _l.json\n" + __ + " _t.raw = _l.raw\n" + __ + " _t.html = _l.html\n" + __ + " _t.escape = _l.escape\n" + __ + " _t.partial = _l.partial\n" + __ + " _t.snippet = _l.snippet\n" + __ + " _t.load = _l.load\n\n" + (include_bundle_headers ? getBundleHeaders(tab_level) : ""); + }; + + getBundleHeaders = function(tab_level) { + + /* + header stuff + only needed when compiling to a JS file + */ + var __; + __ = tabs(tab_level); + return "\n\n" + __ + "toffee.__print = (locals, o) ->\n" + __ + " if locals.__toffee.state is toffee.states.COFFEE\n" + __ + " locals.__toffee.out.push o\n" + __ + " return ''\n" + __ + " else\n" + __ + " return \"\#{o}\"\n\n" + __ + "toffee.__normalize = (path) ->\n" + __ + " if (not path?) or path is \"/\"\n" + __ + " return path\n" + __ + " else\n" + __ + " parts = path.split \"/\"\n" + __ + " np = []\n" + __ + " # make sure path always starts with '/'\n" + __ + " if parts[0]\n" + __ + " np.push ''\n" + __ + " for part in parts\n" + __ + " if part is \"..\"\n" + __ + " if np.length > 1\n" + __ + " np.pop()\n" + __ + " else\n" + __ + " np.push part\n" + __ + " else\n" + __ + " if part isnt \".\"\n" + __ + " np.push part\n" + __ + " path = np.join \"/\"\n" + __ + " if not path then path = \"/\"\n" + __ + " return path\n\n" + __ + "toffee.__partial = (parent_tmpl, parent_locals, path, vars) ->\n" + __ + " path = toffee.__normalize parent_tmpl.bundlePath + \"/../\" + path\n" + __ + " return toffee.__inlineInclude path, vars, parent_locals\n\n" + __ + "toffee.__snippet = (parent_tmpl, parent_locals, path, vars) ->\n" + __ + " path = toffee.__normalize parent_tmpl.bundlePath + \"/../\" + path\n" + __ + " vars = if vars? then vars else {}\n" + __ + " vars.__toffee = vars.__toffee or {}\n" + __ + " vars.__toffee.noInheritance = true\n" + __ + " return toffee.__inlineInclude path, vars, parent_locals\n\n" + __ + "toffee.__load = (parent_tmpl, parent_locals, path, vars) ->\n" + __ + " path = toffee.__normalize parent_tmpl.bundlePath + \"/../\" + path\n" + __ + " vars = if vars? then vars else {}\n" + __ + " vars.__toffee = vars.__toffee or {}\n" + __ + " vars.__toffee.repress = true\n" + __ + " return toffee.__inlineInclude path, vars, parent_locals\n\n" + __ + "toffee.__inlineInclude = (path, locals, parent_locals) ->\n" + __ + " options = locals or {}\n" + __ + " options.passback = {}\n" + __ + " options.__toffee = options.__toffee or {}\n" + __ + "\n" + __ + " # we need to make a shallow copy of parent variables\n" + __ + " reserved = {}\n" + __ + " reserved[k] = true for k in [\"passback\", \"load\", \"print\", \"partial\", \"snippet\", \"layout\", \"__toffee\", \"postProcess\"]\n" + __ + " if not options.__toffee.noInheritance\n" + __ + " for k,v of parent_locals when not locals?[k]?\n" + __ + " if not reserved[k]?\n" + __ + " options[k] = v\n" + __ + "\n" + __ + " if not toffee.templates[path]\n" + __ + " return \"Inline toffee include: Could not find \#{path}\"\n" + __ + " else\n" + __ + " res = toffee.templates[path].pub options\n" + __ + " for k,v of options.passback\n" + __ + " parent_locals[k] = v\n" + __ + " return res"; + }; + + getCommonHeadersJs = function(include_bundle_headers, auto_escape) { + var ch, js; + ch = getCommonHeaders(0, include_bundle_headers, auto_escape); + js = coffee.compile(ch, { + bare: true + }); + return js; + }; + view = (function() { function view(txt, options) { - /* - important options: - cb: if this is set, compilation will happen async and cb will be executed when it's ready - */ - var _this = this; + /* + important options: + cb: if this is set, compilation will happen async and cb will be executed when it's ready + */ options = options || {}; this.fileName = options.fileName || options.filename || null; - this.identifier = options.indentifier || "pub"; + this.bundlePath = options.bundlePath || "/"; + this.browserMode = options.browserMode || false; this.verbose = options.verbose || false; + this.fsError = options.fsError || false; this.prettyPrintErrors = options.prettyPrintErrors != null ? options.prettyPrintErrors : true; + this.prettyLogErrors = options.prettyLogErrors != null ? options.prettyLogErrors : false; + this.autoEscape = options.autoEscape != null ? options.autoEscape : false; + this.additionalErrorHandler = options.additionalErrorHandler || null; this.txt = txt; this.tokenObj = null; this.coffeeScript = null; this.javaScript = null; - this.scriptObj = null; + this.fun = null; this.error = null; if (options.cb) { - this._prepAsync(txt, function() { - return options.cb(_this); - }); + this._prepAsync(txt, options.ctx, ((function(_this) { + return function() { + return options.cb(_this); + }; + })(this))); } } - view.prototype._prepAsync = function(txt, cb) { - /* - Only once it's fully compiled does it callback. - Defers via setTimeouts in each stage in the compile process - for CPU friendliness. This is a lot prettier with iced-coffee-script. - */ + view.prototype._prepAsync = function(txt, ctx, cb) { + /* + Only once it's fully compiled does it callback. + Defers via setTimeouts in each stage in the compile process + for CPU friendliness. This is a lot prettier with iced-coffee-script. + */ var v; + ctx = ctx || vm.createContext({}); this._log("Prepping " + (this.fileName != null ? this.fileName : 'unknown') + " async."); this._toTokenObj(); v = this; return setTimeout(function() { - v._toCoffee(); + v.toCoffee(); return setTimeout(function() { - v._toJavaScript(); + v.toJavaScript(); return setTimeout(function() { - v._toScriptObj(); + v._toFun(ctx); v._log("Done async prep of " + (v.fileName != null ? v.fileName : 'unknown') + ". Calling back."); return cb(); }, 0); @@ -70,9 +136,9 @@ }; view.prototype._log = function(o) { - var _ref2; + var ref2; if (this.verbose) { - if ((_ref2 = typeof o) === "string" || _ref2 === "number" || _ref2 === "boolean") { + if ((ref2 = typeof o) === "string" || ref2 === "number" || ref2 === "boolean") { return console.log("toffee: " + o); } else { return console.log("toffee: " + (util.inspect(o))); @@ -81,119 +147,141 @@ }; view.prototype._cleanTabs = function(obj) { + /* - replaces tabs with spaces in their coffee regions - */ - - var item, _i, _len, _ref2, _ref3, _results; - if ((_ref2 = obj[0]) === "INDENTED_TOFFEE_ZONE" || _ref2 === "TOFFEE_ZONE" || _ref2 === "COFFEE_ZONE") { - _ref3 = obj[1]; - _results = []; - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - item = _ref3[_i]; - _results.push(this._cleanTabs(item)); + replaces tabs with spaces in their coffee regions + */ + var item, j, len, ref2, ref3, results; + if ((ref2 = obj[0]) === "TOFFEE_ZONE" || ref2 === "COFFEE_ZONE") { + ref3 = obj[1]; + results = []; + for (j = 0, len = ref3.length; j < len; j++) { + item = ref3[j]; + results.push(this._cleanTabs(item)); } - return _results; + return results; } else if (obj[0] === "COFFEE") { - return obj[1] = obj[1].replace(/\t/g, this._tabAsSpaces()); + return obj[1] = obj[1].replace(/\t/g, tabs(1)); } }; - view.prototype.run = function(options) { - /* - returns [err, str] - */ + view.prototype.run = function(options, ctx) { - var res, sandbox, script; - script = this._toScriptObj(); + /* + returns [err, str] + */ + var fun, j, len, line, pair, ref2, res, txt; + ctx = ctx || vm.createContext({}); + fun = this._toFun(ctx); res = null; if (!this.error) { try { - sandbox = { - __toffee_run_input: options - }; - script.runInNewContext(sandbox); - res = sandbox.__toffee_run_input.__toffee.res; - delete sandbox.__toffee_run_input.__toffee; - } catch (e) { + res = fun(options); + } catch (error) { + e = error; this.error = new toffeeError(this, errorTypes.RUNTIME, e); } } if (this.error) { + if (this.prettyLogErrors) { + txt = this.error.getPrettyPrintText(); + ref2 = txt.split("\n"); + for (j = 0, len = ref2.length; j < len; j++) { + line = ref2[j]; + console.log("toffee err: " + line); + } + } + if (this.additionalErrorHandler) { + this.additionalErrorHandler(this.error.getPrettyPrintText(), this.error.getPrettyPrint(), this.fileName, options); + } if (this.prettyPrintErrors) { - return [null, this.error.getPrettyPrint()]; + pair = [null, this.error.getPrettyPrint()]; } else { - return [null, this.error.getPrettyPrintText()]; + pair = [this.error.e, null]; + } + if (this.error.errType === errorTypes.RUNTIME) { + this.error = null; } } else { - return [null, res]; + pair = [null, res]; } + return pair; }; view.prototype._toTokenObj = function() { + /* - compiles Toffee to token array - */ - if (!(this.tokenObj != null)) { + compiles Toffee to token array + */ + if (this.tokenObj == null) { try { this.tokenObj = parser.parse(this.txt); - } catch (e) { + } catch (error) { + e = error; this.error = new toffeeError(this, errorTypes.PARSER, e); } - if (!(this.error != null)) { + if (this.error == null) { this._cleanTabs(this.tokenObj); } } return this.tokenObj; }; - view.prototype._toScriptObj = function() { + view.prototype._toFun = function(ctx) { var d, txt; - if (!(this.scriptObj != null)) { - txt = this._toJavaScript(); + if (this.fun == null) { + txt = this.toJavaScript(); if (!this.error) { d = Date.now(); - this.scriptObj = vm.createScript(txt); - this._log("" + this.fileName + " compiled to scriptObj in " + (Date.now() - d) + "ms"); + vm.runInContext(txt, ctx); + this.fun = ctx['_TMPL_']; + this._log(this.fileName + " compiled to scriptObj in " + (Date.now() - d) + "ms"); } } - return this.scriptObj; + return this.fun; }; - view.prototype._toJavaScript = function() { - var c, d; - if (!(this.javaScript != null)) { - c = this._toCoffee(); + view.prototype.toJavaScript = function() { + var c, d, opts; + if (this.javaScript == null) { + c = this.toCoffee(); if (!this.error) { d = Date.now(); try { - this.javaScript = coffee.compile(c, { - bare: false - }); - } catch (e) { + opts = { + bare: true + }; + if (this.browserMode) { + opts.bare = false; + } + this.javaScript = coffee.compile(c, opts); + } catch (error) { + e = error; this.error = new toffeeError(this, errorTypes.COFFEE_COMPILE, e); } - this._log("" + this.fileName + " compiled to JavaScript in " + (Date.now() - d) + "ms"); + this._log(this.fileName + " compiled to JavaScript in " + (Date.now() - d) + "ms"); } } return this.javaScript; }; - view.prototype._toCoffee = function() { + view.prototype.toCoffee = function() { var d, res, tobj; - if (!(this.coffeeScript != null)) { + if (this.coffeeScript == null) { tobj = this._toTokenObj(); if (!this.error) { d = Date.now(); res = this._coffeeHeaders(); try { - res += this._toCoffeeRecurse(tobj, TAB_SPACES, 0)[0]; + res += this._toCoffeeRecurse(tobj, TAB_SPACES * (1 + this._globalTabLevel()), 0, {})[0]; res += this._coffeeFooters(); this.coffeeScript = res; - } catch (e) { + } catch (error) { + e = error; + console.log(e); this.error; } - this._log("" + this.fileName + " compiled to CoffeeScript in " + (Date.now() - d) + "ms"); + this._log(this.fileName + " compiled to CoffeeScript in " + (Date.now() - d) + "ms"); } } return this.coffeeScript; @@ -204,17 +292,17 @@ return ""; } else { this.lastLineNo = n; - return "\n" + (this._space(ind)) + "__toffee.lineno = " + n; + return "\n" + (spaces(ind)) + "_ln " + n; } }; view.prototype._snippetHasEscapeOverride = function(str) { - var token, _i, _len, _ref2, _ref3; - _ref2 = ['print', ' snippet', 'partial', 'raw', 'html', 'json', '__toffee.raw', '__toffee.html', '__toffee.json', 'JSON.stringify']; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - token = _ref2[_i]; + var j, len, ref2, ref3, token; + ref2 = ['print', ' snippet', 'load', 'partial', 'raw', 'html', 'json', '__toffee.raw', '__toffee.html', '__toffee.json']; + for (j = 0, len = ref2.length; j < len; j++) { + token = ref2[j]; if (str.slice(0, token.length) === token) { - if ((str.length > token.length) && ((_ref3 = str[token.length]) === ' ' || _ref3 === '\t' || _ref3 === '\n' || _ref3 === '(')) { + if ((str.length > token.length) && ((ref3 = str[token.length]) === ' ' || ref3 === '\t' || ref3 === '\n' || ref3 === '(')) { return true; } } @@ -222,73 +310,82 @@ return false; }; - view.prototype._toCoffeeRecurse = function(obj, indent_level, indent_baseline) { - var c, chunk, delta, i, i_delta, ind, interp, item, lbreak, line, lineno, lines, part, res, s, t_int, temp_indent_level, zone_baseline, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7; + view.prototype._snippetIsSoloToken = function(str) { + + /* + if the inside is something like #{ foo } not #{ foo.bar } or other complex thing. + */ + if (str.match(/^[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*$/)) { + return true; + } + return false; + }; + + view.prototype._toCoffeeRecurse = function(obj, indent_level, indent_baseline, state_carry) { + var c, chunk, delta, i, i_delta, ind, interp, item, j, k, l, lbreak, len, len1, len2, len3, line, lineno, lines, m, part, ref2, ref3, ref4, ref5, res, s, t_int, temp_indent_level, zone_baseline; res = ""; i_delta = 0; switch (obj[0]) { - case "INDENTED_TOFFEE_ZONE": - indent_level += TAB_SPACES; - _ref2 = obj[1]; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - item = _ref2[_i]; - _ref3 = this._toCoffeeRecurse(item, indent_level, indent_baseline), s = _ref3[0], delta = _ref3[1]; - res += s; - } - break; case "TOFFEE_ZONE": - res += "\n" + (this._space(indent_level)) + "__toffee.state = states.TOFFEE"; - _ref4 = obj[1]; - for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { - item = _ref4[_j]; - _ref5 = this._toCoffeeRecurse(item, indent_level, indent_baseline), s = _ref5[0], delta = _ref5[1]; + if (state_carry.last_coffee_ends_with_newline === false) { + indent_level += TAB_SPACES; + } + res += "\n" + (spaces(indent_level)) + "_ts " + states.TOFFEE; + ref2 = obj[1]; + for (j = 0, len = ref2.length; j < len; j++) { + item = ref2[j]; + ref3 = this._toCoffeeRecurse(item, indent_level, indent_baseline, state_carry), s = ref3[0], delta = ref3[1]; res += s; } break; case "COFFEE_ZONE": - res += "\n" + (this._space(indent_level)) + "__toffee.state = states.COFFEE"; + res += "\n" + (spaces(indent_level)) + "_ts " + states.COFFEE; zone_baseline = this._getZoneBaseline(obj[1]); temp_indent_level = indent_level; - _ref6 = obj[1]; - for (_k = 0, _len2 = _ref6.length; _k < _len2; _k++) { - item = _ref6[_k]; - _ref7 = this._toCoffeeRecurse(item, temp_indent_level, zone_baseline), s = _ref7[0], delta = _ref7[1]; + ref4 = obj[1]; + for (k = 0, len1 = ref4.length; k < len1; k++) { + item = ref4[k]; + ref5 = this._toCoffeeRecurse(item, temp_indent_level, zone_baseline, state_carry), s = ref5[0], delta = ref5[1]; res += s; temp_indent_level = indent_level + delta; } break; case "TOFFEE": ind = indent_level; - res += "\n" + (this._space(ind)) + "__toffee.state = states.TOFFEE"; + res += "\n" + (spaces(ind)) + "_ts " + states.TOFFEE; lineno = obj[2]; try { t_int = utils.interpolateString(obj[1]); - } catch (e) { + } catch (error) { + e = error; e.relayed_line_range = [lineno, lineno + obj[1].split("\n").length]; this.error = new toffeeError(this, errorTypes.STR_INTERPOLATE, e); throw e; } - for (_l = 0, _len3 = t_int.length; _l < _len3; _l++) { - part = t_int[_l]; + for (l = 0, len2 = t_int.length; l < len2; l++) { + part = t_int[l]; if (part[0] === "TOKENS") { res += this._printLineNo(lineno, ind); - interp = part[1].replace(/^[\n \t]+/, ''); - if (this._snippetHasEscapeOverride(interp)) { + interp = part[1].replace(/(^[\n \t]+)|([\n \t]+)$/g, ''); + interp = interp.replace(/[\u2028\u2029]/g, '\n'); + if (this._snippetIsSoloToken(interp)) { + chunk = "\#{if " + interp + "? then escape " + interp + " else ''}"; + } else if (this._snippetHasEscapeOverride(interp)) { chunk = "\#{" + interp + "}"; } else { chunk = "\#{escape(" + interp + ")}"; } - res += "\n" + (this._space(ind)) + "__toffee.out.push " + (this._quoteStr(chunk)); + res += "\n" + (spaces(ind)) + "_to " + (this._quoteStr(chunk)); lineno += part[1].split("\n").length - 1; } else { - lines = part[1].split("\n"); - for (i = _m = 0, _len4 = lines.length; _m < _len4; i = ++_m) { + lines = part[1].split(/[\n\u2028\u2029]/); + for (i = m = 0, len3 = lines.length; m < len3; i = ++m) { line = lines[i]; res += this._printLineNo(lineno, ind); lbreak = i !== lines.length - 1 ? "\n" : ""; chunk = this._escapeForStr("" + line + lbreak); if (chunk.length) { - res += "\n" + (this._space(ind)) + "__toffee.out.push " + (this._quoteStr(chunk + lbreak)); + res += "\n" + (spaces(ind)) + "_to " + (this._quoteStr(chunk + lbreak)); } if (i < lines.length - 1) { lineno++; @@ -297,12 +394,14 @@ } } res += this._printLineNo(obj[2] + (obj[1].split('\n').length - 1), ind); - res += "\n" + (this._space(ind)) + "__toffee.state = states.COFFEE"; + res += "\n" + (spaces(ind)) + "_ts " + states.COFFEE; break; case "COFFEE": c = obj[1]; + c = c.replace(/[\u2028\u2029]/g, '\n'); res += "\n" + (this._reindent(c, indent_level, indent_baseline)); i_delta = this._getIndentationDelta(c, indent_baseline); + state_carry.last_coffee_ends_with_newline = this._doesEndWithNewline(c); break; default: throw "Bad parsing. " + obj + " not handled."; @@ -312,12 +411,12 @@ }; view.prototype._quoteStr = function(s) { - /* - returns a triple-quoted string, dividing into single quoted - start and stops, if the string begins with double quotes, since - coffee doesn't want to let us escape those. - */ + /* + returns a triple-quoted string, dividing into single quoted + start and stops, if the string begins with double quotes, since + coffee doesn't want to let us escape those. + */ var follow, lead, res; lead = ""; follow = ""; @@ -340,20 +439,32 @@ return res; }; + view.prototype._doesEndWithNewline = function(s) { + var parts; + parts = s.split("\n"); + if ((parts.length > 1) && parts[parts.length - 1].match(/^[\t ]*$/)) { + return true; + } else { + return false; + } + }; + view.prototype._escapeForStr = function(s) { + /* - escapes a string so it can make it into coffeescript - triple quotes without losing whitespace, etc. - */ + escapes a string so it can make it into coffeescript + triple quotes without losing whitespace, etc. + */ + s = s.replace(/\\/g, '\\\\'); s = s.replace(/\n/g, '\\n'); s = s.replace(/\t/g, '\\t'); return s; }; view.prototype._getZoneBaseline = function(obj_arr) { - var ib, obj, _i, _len; - for (_i = 0, _len = obj_arr.length; _i < _len; _i++) { - obj = obj_arr[_i]; + var ib, j, len, obj; + for (j = 0, len = obj_arr.length; j < len; j++) { + obj = obj_arr[j]; if (obj[0] === "COFFEE") { ib = this._getIndentationBaseline(obj[1]); if (ib != null) { @@ -365,11 +476,11 @@ }; view.prototype._getIndentationBaseline = function(coffee) { - var i, line, lines, res, _i, _len; + var i, j, len, line, lines, res; res = null; lines = coffee.split("\n"); if (lines.length) { - for (i = _i = 0, _len = lines.length; _i < _len; i = ++_i) { + for (i = j = 0, len = lines.length; j < len; i = ++j) { line = lines[i]; if ((!line.match(/^[ ]*$/)) || i === (lines.length - 1)) { res = line.match(/[ ]*/)[0].length; @@ -377,25 +488,25 @@ } } } - if (!(res != null)) { + if (res == null) { res = coffee.length; } return res; }; view.prototype._getIndentationDelta = function(coffee, baseline) { - /* - given an arbitrarily indented set of coffeescript, returns the delta - between the first and last lines, in chars. - Ignores leading/trailing whitespace lines - If passed a baseline, uses that instead of own. - */ + /* + given an arbitrarily indented set of coffeescript, returns the delta + between the first and last lines, in chars. + Ignores leading/trailing whitespace lines + If passed a baseline, uses that instead of own. + */ var lines, res, y, y_l; - if (!(baseline != null)) { + if (baseline == null) { baseline = this._getIndentationBaseline(coffee); } - if (!(baseline != null)) { + if (baseline == null) { res = 0; } else { lines = coffee.split("\n"); @@ -421,53 +532,43 @@ } rxx = /^[ ]*/; strip = indent_baseline; - indent = this._space(indent_level); + indent = spaces(indent_level); res = ((function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = lines.length; _i < _len; _i++) { - line = lines[_i]; - _results.push("" + indent + line.slice(strip)); + var j, len, results; + results = []; + for (j = 0, len = lines.length; j < len; j++) { + line = lines[j]; + results.push("" + indent + line.slice(strip)); } - return _results; + return results; })()).join("\n"); return res; }; - view.prototype._space = function(indent) { - var i; - return ((function() { - var _i, _results; - _results = []; - for (i = _i = 0; 0 <= indent ? _i < indent : _i > indent; i = 0 <= indent ? ++_i : --_i) { - _results.push(" "); - } - return _results; - })()).join(""); + view.prototype._globalTabLevel = function() { + if (this.browserMode) { + return 0; + } else { + return 1; + } }; - view.prototype._tabAsSpaces = function() { - var i; - return ((function() { - var _i, _results; - _results = []; - for (i = _i = 0; 0 <= TAB_SPACES ? _i < TAB_SPACES : _i > TAB_SPACES; i = 0 <= TAB_SPACES ? ++_i : --_i) { - _results.push(" "); - } - return _results; - })()).join(""); + view.prototype._globalTabs = function() { + return tabs(this._globalTabLevel()); }; view.prototype._coffeeHeaders = function() { - var ___; - ___ = this._tabAsSpaces(); - return "domain = this\ndomain.toffeeTemplates = domain.toffeeTemplates or {}\ndomain.toffeeTemplates[\"" + this.identifier + "\"] = (locals) ->\n" + ___ + "domain = this\n" + ___ + "locals.__toffee = {}\n" + ___ + "`with (locals) {`\n" + ___ + "__toffee.out = []\n\n" + ___ + "if not print?\n" + ___ + ___ + "print = (txt) ->\n" + ___ + ___ + ___ + "if __toffee.state is states.COFFEE\n" + ___ + ___ + ___ + ___ + "__toffee.out.push txt\n" + ___ + ___ + ___ + ___ + "return ''\n" + ___ + ___ + ___ + "else\n" + ___ + ___ + ___ + ___ + "return \"\#{txt}x\"\n\n" + ___ + "__toffee.json = (o) ->\n" + ___ + ___ + "try\n" + ___ + ___ + ___ + "json = JSON.stringify o\n" + ___ + ___ + "catch e \n" + ___ + ___ + ___ + "throw {stack:[], message: \"JSONify error (\#{e.message}) on line \#{__toffee.lineno}\", toffee_line_base: __toffee.lineno }\n" + ___ + ___ + "res = \"\" + json\n\n" + ___ + "__toffee.html = (o) ->\n" + ___ + ___ + "res = (\"\"+o).replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n\n" + ___ + "__toffee.raw = (o) -> o\n\n" + ___ + "if not raw? then raw = __toffee.raw\n" + ___ + "if not html? then html = __toffee.html\n" + ___ + "if not json? then json = __toffee.json\n\n" + ___ + "if not escape?\n" + ___ + ___ + "escape = (o) ->\n" + ___ + ___ + ___ + "if (not __toffee.autoEscape?) or __toffee.autoEscape\n" + ___ + ___ + ___ + ___ + "if o? and (typeof o) is \"object\"\n" + ___ + ___ + ___ + ___ + ___ + "return __toffee.json o\n" + ___ + ___ + ___ + ___ + "return __toffee.html o\n\n" + ___ + "states = " + (JSON.stringify(states)); + var __, ___; + __ = this._globalTabs(); + ___ = tabs(1); + return (this.browserMode ? '' : '_TMPL_ = (__toffee_run_input) ->' + (getCommonHeaders(1, false, this.autoEscape))) + "\n" + __ + "# browser mode = " + this.browserMode + "\n" + __ + "tmpl = toffee.templates[\"" + this.bundlePath + "\"] =\n" + __ + " bundlePath: \"" + this.bundlePath + "\"\n" + __ + "tmpl.render = tmpl.pub = (__locals) ->\n" + __ + ___ + "__locals = __locals or {}\n" + __ + ___ + "__repress = __locals.__toffee?.repress\n" + __ + ___ + "_to = (x) -> __locals.__toffee.out.push x\n" + __ + ___ + "_ln = (x) -> __locals.__toffee.lineno = x\n" + __ + ___ + "_ts = (x) -> __locals.__toffee.state = x\n" + __ + ___ + "toffee.__augmentLocals __locals, \"" + this.bundlePath + "\"\n\n" + __ + ___ + "`with (__locals) {`\n" + __ + ___ + "__toffee.out = []"; }; view.prototype._coffeeFooters = function() { - var ___; - ___ = this._tabAsSpaces(); - return "\n\n" + ___ + "__toffee.res = __toffee.out.join \"\"\n" + ___ + "return __toffee.res\n" + ___ + "`} /* closing JS 'with' */ `\n# sometimes we want to execute the whole thing in a sandbox\n# and just output results\nif __toffee_run_input?\n" + ___ + "return domain.toffeeTemplates[\"" + this.identifier + "\"] __toffee_run_input"; + var __, ___; + __ = this._globalTabs(); + ___ = tabs(1); + return "\n\n" + __ + ___ + "__toffee.res = __toffee.out.join \"\"\n" + __ + ___ + "if postProcess?\n" + __ + ___ + ___ + "__toffee.res = postProcess __toffee.res\n" + __ + ___ + "if (not __repress) then return __toffee.res else return \"\"\n" + __ + "`true; } /* closing JS 'with' */ `\n" + __ + "# sometimes we want to execute the whole thing in a sandbox\n" + __ + "# and just output results\n" + __ + "if __toffee_run_input?\n" + __ + ___ + "return tmpl.pub __toffee_run_input"; }; return view; @@ -476,6 +577,10 @@ exports.view = view; + exports.getCommonHeaders = getCommonHeaders; + + exports.getCommonHeadersJs = getCommonHeadersJs; + exports.expressCompile = function(txt, options) { var v; v = new view(txt, options); diff --git a/package.json b/package.json index 246c59d..ea46ba3 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,43 @@ { - "name": "toffee", - "description": "An Express 3.x and 2.x templating language based on CoffeeScript with slicker tokens and syntax. Built with love at OkCupid.", - "version": "0.0.26", - "directories": { - "lib": "./lib" - }, - "main": "index.js", - "author": "Chris Coyne ", - "bin": "./bin/toffee", - "dependencies": { - "coffee-script": "*" - }, - "repository": { - "type": "git", - "url": "http://github.com/malgorithms/toffee" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/malgorithms/toffee/raw/master/LICENSE" - } - ] -} \ No newline at end of file + "name": "toffee", + "description": "A NodeJs and browser-side templating language based on CoffeeScript with slicker tokens and syntax.", + "version": "0.3.7", + "directories": { + "lib": "./lib" + }, + "main": "index.js", + "author": "Chris Coyne ", + "bin": "./bin/toffee", + "dependencies": { + "coffee-script": "1.12.7", + "commander": "10.0.0", + "highlight.js": "11.7.0", + "iced-lock": "2.0.1", + "mkdirp": "2.1.3" + }, + "devDependencies": { + "assert": "2.0.0", + "colors": "1.4.0", + "diff": "5.1.0", + "express": "4.18.2", + "iced-coffee-script": "108.0.14", + "jison": "0.4.18", + "tablify": "0.1.5", + "zombie": "6.1.4" + }, + "files": [ + "index.js", + "lib/*", + "bin/*" + ], + "repository": { + "type": "git", + "url": "http://github.com/malgorithms/toffee" + }, + "licenses": [ + { + "type": "MIT", + "url": "http://github.com/malgorithms/toffee/raw/master/LICENSE" + } + ] +} diff --git a/src/command_line.coffee b/src/command_line.coffee index 412cc28..da54047 100644 --- a/src/command_line.coffee +++ b/src/command_line.coffee @@ -1,34 +1,156 @@ +fs = require 'fs' +path = require 'path' +{view, getCommonHeadersJs} = require '../lib/view' +program = require 'commander' +mkdirp = require 'mkdirp' -fs = require "fs" -{engine} = require '../lib/engine' -{view} = require '../lib/view' +# ----------------------------------------------------------------------------- -printUsage = -> - console.log """ - Usage: toffee [-c] input.toffee - - -c == output to CoffeeScript (instead of JS) +getVersionNumber = -> + p = fs.readFileSync "#{__dirname}/../package.json", "utf8" + o = JSON.parse p + o.version - TODO: make a more useful command line tool. - """ - process.exit 1 +# ----------------------------------------------------------------------------- -getVersionNumber = -> - JSON.parse(fs.readFileSync "#{__dirname}/../package.json", "utf8").version - -exports.run = -> - e = new engine() - args = process.argv.slice 2 - if args.length is 2 - coffee = true - if args[0] isnt "-c" - printUsage() - else if args.length isnt 1 - printUsage() - fname = args[-1..][0] - source = fs.readFileSync fname, "utf8" - v = new view source, {fileName: fname} - if coffee - console.log v._toCoffee() +program.on '--help', -> + console.log " +\n Examples: +\n +\n toffee views # recurses through views and builds views.js +\n toffee foo.toffee # builds foo.js +\n toffee views -o templates # builds templates.js +\n toffee -p foo.toffee # outputs JS to stdout +\n +\n +\n Then use in your : +\n +\n +\n +\n + " + +program.version(getVersionNumber()) + .option('-o, --output [path]', 'file (bundles all output into a single .js)') + .option('-d, --output_dir [path]', 'compiles templates into parallel .js files') + .option('-p, --print', 'print to stdout') + .option('-c, --coffee', 'output to CoffeeScript (not JS)') + .option('-b, --bundle_path [path]', 'bundle_path (instead of "/") for templates') + .option('-n, --no_headers', 'exclude boilerplate toffee (requires toffee.js included separately)') + .parse process.argv + +# ----------------------------------------------------------------------------- + +compile = (start_path, full_path) -> + ### + e.g., if start_path is /foo/bar + and path is /foo/bar/car/thing.toffee + ### + source = fs.readFileSync full_path, 'utf8' + bundle_path = full_path[start_path.length...] + + if start_path is full_path + bundle_path = "/" + path.basename full_path + + if program.bundle_path + bundle_path = path.normalize "#{program.bundle_path}/#{bundle_path}" + + v = new view source, + fileName: full_path + bundlePath: bundle_path + browserMode: true + if program.coffee + output = v.toCoffee() else - console.log v._toJavaScript() \ No newline at end of file + output = v.toJavaScript() + if v.error + process.stderr.write v.error.getPrettyPrintText() + process.exit 1 + + [output, bundle_path] + +# ----------------------------------------------------------------------------- + +recurseRun = (start_path, curr_path, out_text) -> + stats = fs.statSync curr_path + if stats.isDirectory() + files = fs.readdirSync curr_path + for file in files + sub_path = path.normalize "#{curr_path}/#{file}" + if file.match /\.toffee$/ + out_text = recurseRun start_path, sub_path, out_text + else if not (file in ['.','..']) + sub_stats = fs.statSync sub_path + if sub_stats.isDirectory() + out_text = recurseRun start_path, sub_path, out_text + else + comp = compile start_path, curr_path + out_text += "\n;\n" + comp[0] + if program.output_dir + file_out_path = path.normalize "#{program.output_dir}/#{comp[1]}" + file_out_path = "#{path.dirname file_out_path}/#{path.basename file_out_path, '.toffee'}" + file_out_path += if program.coffee then '.coffee' else '.js' + if not program.print + console.log "Outputting #{file_out_path}" + mkdirp.sync path.dirname file_out_path + fs.writeFileSync file_out_path, maybeAttachHeaders(comp[0]), "utf8" + + return out_text + +# ----------------------------------------------------------------------------- + +maybeAttachHeaders = (pre_output) -> + if program.no_headers + return pre_output + else + header_out = getCommonHeadersJs true, true, true + if program.coffee + return "`#{header_out}`\n\n#{pre_output}" + else + return "#{header_out}\n;\n#{pre_output}" + +# ----------------------------------------------------------------------------- + +run = exports.run = -> + + if program.args.length isnt 1 + console.log "Unexpected input. toffee --help for examples" + console.log program.args + process.exit 1 + else + try + start_path = fs.realpathSync program.args[0] + catch e + console.log "Input file/path not found. toffee --help for examples" + process.exit 1 + + if program.output_dir + try + mkdirp.sync program.output_dir + catch e + console.log "Couldn't make/use #{program.output_dir}; #{e}" + process.exit 1 + + start_path = path.normalize start_path + template_out = recurseRun start_path, start_path, '' + out_text = maybeAttachHeaders template_out + + if program.print + console.log out_text + + if program.output + try + console.log "Writing #{program.output}" + fs.writeFileSync program.output, out_text, "utf8" + catch e + console.log e + process.exit 1 + + +# ----------------------------------------------------------------------------- + +if require.main is module + run() diff --git a/src/consts.coffee b/src/consts.coffee index 98f8ee4..e26da34 100644 --- a/src/consts.coffee +++ b/src/consts.coffee @@ -1,5 +1,8 @@ exports.states = - TOFFEE: 1 + TOFFEE: 1 COFFEE: 2 -exports.TAB_SPACES = 2 \ No newline at end of file +exports.TAB_SPACES = 2 + +exports.tweakables = + MISSING_FILE_RECHECK: 1000 # ms before checking if a file has been introduced/changed if fs.watch() fails diff --git a/src/engine.coffee b/src/engine.coffee index 424c759..337697f 100644 --- a/src/engine.coffee +++ b/src/engine.coffee @@ -1,17 +1,34 @@ -{view} = require './view' -{states} = require './consts' -utils = require './utils' -fs = require 'fs' -path = require 'path' -util = require 'util' +{view} = require './view' +{states, tweakables} = require './consts' +{Pool} = require './pool' +utils = require './utils' +fs = require 'fs' +path = require 'path' +util = require 'util' +vm = require 'vm' +LockTable = require('iced-lock').Table +MAX_CACHED_SANDBOXES = 100 + +sandboxCons = () -> + vm.createContext({}) class engine constructor: (options) -> - options = options or {} - @verbose = options.verbose or false - @prettyPrintErrors = if options.prettyPrintErrors? then options.prettyPrintErrors else true - @viewCache = {} # filename + options = options or {} + @verbose = options.verbose or false + @pool = new Pool(sandboxCons, options.poolSize or MAX_CACHED_SANDBOXES) + @prettyPrintErrors = if options.prettyPrintErrors? then options.prettyPrintErrors else true + @prettyLogErrors = if options.prettyLogErrors? then options.prettyLogErrors else true + @autoEscape = if options.autoEscape? then options.autoEscape else true + @cache = if options.cache? then options.cache else true + @additionalErrorHandler = options.additionalErrorHandler or null + + @viewCache = {} # filename -> view + @fsErrorCache = {} # filename -> timestamp last failed + + @filenameCache = {} # caches dir -> filename -> path.normalize path.resolve dir, filename + @fileLockTable = new LockTable() _log: (o) -> if @verbose @@ -20,31 +37,73 @@ class engine else console.log "toffee: #{util.inspect o}" + # basically returns `path.normalize path.resolve dir, filename`, but caches it to speed up multiple inclusions + normalizeFilename: (dir, filename) -> + cache = @filenameCache[dir] + if not cache? + @filenameCache[dir] = {} + cache = {} + normalized = cache[filename] + if not normalized? + normalized = path.normalize path.resolve dir, filename + @filenameCache[dir][filename] = normalized + return normalized + + + render: (filename, options, cb) => @run filename, options, cb + run: (filename, options, cb) => ### "options" contains the pub vars and may contain special items: layout: path to a template expecting a body var (express 2.x style, but for use with express 3.x) + postProcess: a function which takes the string of output and post processes it (returning new string) __toffee.dir: path to look relative to __toffee.parent: parent file __toffee.noInheritance: if true, don't pass variables through unless explicitly passed + __toffee.repress if true, don't output anything; useful with including definition files with passback of vars __toffee.autoEscape: if set as false, don't escape output of #{} vars by default ### + if not options.prettyPrintErrors? then options.prettyPrintErrors = @prettyPrintErrors + if not options.prettyLogErrors? then options.prettyLogErrors = @prettyLogErrors + if not options.additionalErrorHandler? then options.additionalErrorHandler = @additionalErrorHandler + if not options.autoEscape? then options.autoEscape = @autoEscape + + # we only want to pass post_process into the layout + post_process = options.postProcess + options.postProcess = null + + if options?.layout + layout_options = {} + layout_options[k] = v for k,v of options when k isnt "layout" + [err, res] = @runSync filename, options # if we got an error but want to pretty-print by faking ok result - if err and @prettyPrintErrors + if err and @prettyPrintErrors [err, res] = [null, err] # if we're using a layout, pub into that - if (not err) and options?.layout - options.body = res - [err, res] = @runSync options.layout, options + if (not err) and layout_options? + layout_options.body = res + [err, res] = @runSync options.layout, layout_options if err and @prettyPrintErrors [err, res] = [null, err] + # post processing + if (not err) and (typeof(post_process) is "function") + [err, res] = @postProcess post_process, res + cb err, res + postProcess: (fn, res) -> + err = null + try + res = fn res + catch e + err = e + return [err, res] + runSync: (filename, options) -> ### "options" the same as run() above @@ -55,39 +114,72 @@ class engine options = options or {} options.__toffee = options.__toffee or {} options.__toffee.dir = options.__toffee.dir or process.cwd() - filename = if filename[0] isnt "/" then "#{options.__toffee.dir}/#{filename}" else filename - realpath = path.normalize filename - pwd = path.dirname realpath + realpath = @normalizeFilename options.__toffee.dir, filename + + if @cache + v = (@_viewCacheGet realpath) or (@_loadCacheAndMonitor realpath, options) + else + v = @_loadWithoutCache realpath, options - v = @viewCache[realpath] or @_loadCacheAndMonitor realpath, options if v - options.__toffee.parent = realpath - options.partial = options.partial or (fname, lvars) => @_fn_partial fname, lvars, realpath, options - options.snippet = options.snippet or (fname, lvars) => @_fn_snippet fname, lvars, realpath, options - options.print = options.print or (txt) => @_fn_print txt, options - if not options.console? then options.console = log: console.log - [err, res] = v.run options + if @fsErrorCache[realpath] + [err, res] = [new Error("Couldn't load #{realpath}"), null] + else + options.__toffee.parent = realpath + options.partial = options.partial or (fname, lvars) => @_fn_partial fname, lvars, realpath, options + options.snippet = options.snippet or (fname, lvars) => @_fn_snippet fname, lvars, realpath, options + options.load = options.load or (fname, lvars) => @_fn_load fname, lvars, realpath, options + options.print = options.print or (txt) => @_fn_print txt, options + if not options.console? then options.console = log: console.log + ctx = @pool.get() + [err, res] = v.run options, ctx + @pool.release(ctx) else - [err, res] = ["Couldn't load #{realpath}", null] + [err, res] = [new Error("Couldn't load #{realpath}"), null] @_log "#{realpath} run in #{Date.now() - start_time}ms" return [err, res] + _viewCacheGet: (filename) -> + if not @viewCache[filename]? + return null + else if not @fsErrorCache[filename]? + return @viewCache[filename] + else if (Date.now() - @fsErrorCache[filename]) < tweakables.MISSING_FILE_RECHECK + return @viewCache[filename] + else + return null + _inlineInclude: (filename, local_vars, parent_realpath, parent_options) => options = local_vars or {} + options.passback = {} options.__toffee = options.__toffee or {} options.__toffee.dir = path.dirname parent_realpath options.__toffee.parent = parent_realpath + noInheritance = options.__toffee.noInheritance + repress = options.__toffee.repress # we need to make a shallow copy of parent variables - if not options.__toffee.noInheritance + reserved = {} + reserved[k] = true for k in ["passback", "load", "print", "partial", "snippet", "layout", "__toffee", "postProcess"] + if not noInheritance for k,v of parent_options when not local_vars?[k]? - if not (k in ["print", "partial", "snippet", "layout", "__toffee"]) + if not reserved[k]? options[k] = v [err, res] = @runSync filename, options + + for k,v of options.passback + parent_options[k] = v + return err or res + _fn_load: (fname, lvars, realpath, options) => + lvars = if lvars? then lvars else {} + lvars.__toffee = lvars.__toffee or {} + lvars.__toffee.repress = true + @_inlineInclude fname, lvars, realpath, options + _fn_snippet: (fname, lvars, realpath, options) => lvars = if lvars? then lvars else {} lvars.__toffee = lvars.__toffee or {} @@ -104,44 +196,95 @@ class engine else return txt + _loadWithoutCache: (filename, options) -> + try + txt = fs.readFileSync filename, 'utf8' + catch e + txt = "Error: Could not read #{filename}" + if options.__toffee?.parent? then txt += " first requested in #{options.__toffee.parent}" + + view_options = @_generateViewOptions filename + v = new view txt, view_options + return v + _loadCacheAndMonitor: (filename, options) -> + previous_fs_err = @fsErrorCache[filename]? try txt = fs.readFileSync filename, 'utf8' + if @fsErrorCache[filename]? then delete @fsErrorCache[filename] catch e txt = "Error: Could not read #{filename}" - if options.__toffee?.parent? then txt += " requested in #{options.__toffee.parent}" - view_options = - fileName: filename - verbose: @verbose - prettyPrintErrors: @prettyPrintErrors - v = new view txt, view_options - @viewCache[filename] = v - @_monitorForChanges filename, options - v + if options.__toffee?.parent? then txt += " first requested in #{options.__toffee.parent}" + @fsErrorCache[filename] = Date.now() + + # if we hit an fs error and it already happened, just return that + if (@fsErrorCache[filename] and previous_fs_err and @viewCache[filename]) + return @viewCache[filename] + else + view_options = @_generateViewOptions filename + v = new view txt, view_options + @viewCache[filename] = v + @_monitorForChanges filename, options + return v + + _reloadFileInBkg: (filename, options) -> + @_log "#{filename} acquiring lock to read" + @fileLockTable.acquire2 {name: filename}, (lock) => + fs.readFile filename, 'utf8', (err, txt) => + @_log "#{Date.now()} - #{filename} changed to #{txt?.length} bytes. #{txt?.replace?(/\n/g , '')[...80]}" if not err + waiting_for_view = false + if err or (txt isnt @viewCache[filename].txt) + if err + @fsErrorCache[filename] = Date.now() + txt = "Error: Could not read #{filename}" + if options.__toffee?.parent? then txt += " requested in #{options.__toffee.parent}" + if not (err and @viewCache[filename].fsError) # i.e., don't just create a new error view + view_options = @_generateViewOptions filename + ctx = @pool.get() + view_options.ctx = ctx + view_options.cb = (v) => + @_log "#{filename} updated and ready" + @viewCache[filename] = v + @pool.release(ctx) + @_log "#{filename} lock releasing (view_options.cb)" + lock.release() + waiting_for_view = true # do not release lock instantly + if err + view_options.fsError = true + v = new view txt, view_options + if not waiting_for_view + @_log "#{filename} lock releasing (not waiting for view)" + lock.release() + + _generateViewOptions: (filename) -> + return { + fileName: filename + verbose: @verbose + prettyPrintErrors: @prettyPrintErrors + prettyLogErrors: @prettyLogErrors + autoEscape: @autoEscape + additionalErrorHandler: @additionalErrorHandler + } _monitorForChanges: (filename, options) -> ### we must continuously unwatch/rewatch because some editors/systems invoke a "rename" event and we'll end up following the wrong, old 'file' as a new one is dropped in its place. + + Files that are missing are ignored here because they get picked up by new calls to _loadCacheAndMonitor ### - fsw = null - fsw = fs.watch filename, {persistent: true}, (change) => - fsw.close() - @_log "Got an fs.watch hit on #{filename}" - fs.readFile filename, 'utf8', (err, txt) => - @_monitorForChanges filename, options - if txt isnt @viewCache[filename].txt - if err - txt = "Error: Could not read #{filename} after fs.watch() hit." - if options.__toffee?.parent? then txt += " requested in #{options.__toffee.parent}" - view_options = - fileName: filename - verbose: @verbose - prettyPrintErrors: @prettyPrintErrors - cb: (v) => - @_log "#{filename} updated and ready" - @viewCache[filename] = v - v = new view txt, view_options + if not @fsErrorCache[filename]? # if there's an fsError, this will get rechecked on-demand occasionally + fsw = null + try + @_log "#{filename} starting fs.watch()" + fsw = fs.watch filename, {persistent: true}, (change) => + @_log "#{filename} closing fs.watch()" + fsw.close() + @_monitorForChanges filename, options + @_reloadFileInBkg filename, options + catch e + @_log "fs.watch() failed for #{filename}; settings fsErrorCache = true" + @fsErrorCache[filename] = Date.now() -exports.engine = engine \ No newline at end of file +exports.engine = engine diff --git a/src/errorHandler.coffee b/src/errorHandler.coffee index a3c0268..c56e277 100644 --- a/src/errorHandler.coffee +++ b/src/errorHandler.coffee @@ -7,7 +7,7 @@ errorTypes = exports.errorTypes = COFFEE_COMPILE: 2 RUNTIME: 3 -class toffeeError +class toffeeError extends Error constructor: (view, err_type, e) -> @errType = err_type @@ -43,15 +43,21 @@ class toffeeError full_path: @view.fileName dir_name: path.dirname @view.fileName file: path.basename @view.fileName - line_range: [0,0] + line_range: null # will be a pair } if @e?.message? then res.message = @e.message + + # Error objects now support line numbers in certain cases. + if @e?.location?.first_line? + res.line_range = @_convertJsErrorRangeToToffeeRange @e.location + switch @errType when errorTypes.PARSER - line = @_extractOffensiveLineNo @e.message, /on line ([0-9]+)/ - res.line_range = [line, line + 1] + if not res.line_range? + line = @_extractOffensiveLineNo @e.message, /on line ([0-9]+)/ + res.line_range = [line, line + 1] when errorTypes.STR_INTERPOLATE res.line_range = [@e.relayed_line_range[0], @e.relayed_line_range[1]] @@ -59,11 +65,18 @@ class toffeeError res.message = res.message.replace 'missing }', 'unclosed `\#{}`' when errorTypes.COFFEE_COMPILE - line = @_extractOffensiveLineNo @e.message, /on line ([0-9]+)/ - res.line_range = @_convertOffensiveLineToToffeeRange line - res.message = res.message.replace /on line [0-9]+/, @_lineRangeToPhrase res.line_range + if not res.line_range? + line = @_extractOffensiveLineNo @e.message, /on line ([0-9]+)/ + res.line_range = @_convertOffensiveLineToToffeeRange line + if res.message.indexOf('on line') isnt -1 + res.message = res.message.replace /on line [0-9]+/, @_lineRangeToPhrase res.line_range + else + res.message += " " + @_lineRangeToPhrase res.line_range + when errorTypes.RUNTIME + if not res.line_range? + res.line_range = [0,0] if @e.stack res.stack = @e.stack.split "\n" @_convertRuntimeStackLines res @@ -78,7 +91,11 @@ class toffeeError stack = converted_err.stack for line, i in stack - rxx_pub = /// Object[\.]#{@view.identifier}[\s]\(undefined\:([0-9]+)\:[0-9]+ /// + rxx_pub = /// + Object[\.].*?pub[\s]\(undefined\:([0-9]+)\:[0-9]+ + | + tmpl[\.]render[\.]tmpl[\.]pub.*\(.*\:([0-9]+)\:[0-9]+ + /// m = line.match rxx_pub in_src_file = false lrange = [null, null] @@ -116,10 +133,7 @@ class toffeeError returns a TEXT only blob explaining the error ### cerr = @getConvertedError() - if cerr.type is errorTypes.RUNTIME - header = cerr.message - else - header = "#{cerr.dir_name}/#{cerr.file}: #{cerr.message}" + header = "#{cerr.dir_name}/#{cerr.file}: #{cerr.message}" res = """ ERROR ===== @@ -147,42 +161,39 @@ class toffeeError getPrettyPrint: -> ### - returns an HTML blob explaining the error + returns an HTML blob explaining the error with lines highlighted ### cerr = @getConvertedError() res = "" - if cerr.type is 234432#errorTypes.RUNTIME - header = cerr.message - else - header = "#{cerr.dir_name}/#{cerr.file}: #{cerr.message}" + header = "#{cerr.dir_name}/#{cerr.file}: #{_ppEscape cerr.message}" res += """ -
    +
    \n
    #{header}
    \n
    - \n
    + \n
    """ if cerr.stack?.length - res += "
    " + res += "
    " count = 0 for item,i in cerr.stack if i is 0 - res += "
    #{count++} #{item.line}
    " + res += "
    #{count++} #{item.line}
    " else if item.in_src_file and (item.above_pub_call or item.at_pub_call) - res += "
    #{count++} [#{@_lineRangeToPhrase item.line_range}] #{cerr.dir_name}/#{cerr.file}
    " + res += "
    #{count++} [#{@_lineRangeToPhrase item.line_range}] #{cerr.dir_name}/#{cerr.file}
    " else if item.in_src_file continue else - res += "
    #{count++}#{item.line}
    " + res += "
    #{count++}#{item.line}
    " res += "
    " for i in [(cerr.line_range[0]-3)...(cerr.line_range[1]+1)] if (i < 0) or i > @toffeeSrcLines.length - 1 continue - line = _ppEscape @toffeeSrcLines[i] + line = _ppEscape @toffeeSrcLines[i] padding_len = 5 - ("#{i+1}").length padding = (" " for j in [0...padding_len]).join "" - if cerr.line_range[0] <= (i+1) < cerr.line_range[1] + if (cerr.line_range[0] - 1) <= (i) < cerr.line_range[1] extra = "" else extra = "" @@ -194,16 +205,23 @@ class toffeeError res _lineRangeToPhrase: (lrange) -> - if lrange[0] >= lrange[1] - 1 + if lrange[0] is lrange[1] "on line #{lrange[0]}" else - "between lines #{lrange[0]} and #{lrange[1] - 1}" + "between lines #{lrange[0]} and #{lrange[1]}" _extractOffensiveLineNo: (msg, rxx) -> m = msg.match rxx if not (m?.length >= 2) then return null return parseInt m[1] + _convertJsErrorRangeToToffeeRange: (loc) -> + range = @_convertOffensiveLineToToffeeRange loc.first_line + if loc.last_line? + range2 = @_convertOffensiveLineToToffeeRange loc.last_line + range[1] = range2[1] + return range + _convertOffensiveLineToToffeeRange: (lineno) -> ### Given the error line in a converted file, hunts for surrounding @@ -218,8 +236,8 @@ class toffeeError prev = ol[0...lineno].join "\n" next = ol[lineno...].join "\n" - prev_matches = prev.match /__toffee.lineno[ ]*=[ ]*([0-9]+)/g - next_matches = next.match /__toffee.lineno[ ]*=[ ]*([0-9]+)/g + prev_matches = prev.match /_ln[ ]*\(?[ ]*([0-9]+)/g + next_matches = next.match /_ln[ ]*\(?[ ]*([0-9]+)/g res = [1,tl.length] if prev_matches?.length @@ -231,102 +249,9 @@ class toffeeError exports.toffeeError = toffeeError - -# ----------------------------------------------------------------------------- - - - -eh = exports.errorHandler = - - generateRuntimeError: (view, e) -> - ### - e: the error caught when running - ### - src = view.javaScript - msg = e.message - stack = e.stack - - res = - src_line: 0 - toffee_line_range: [0,1] - original_msg: msg - converted_msg: msg - - search = stack.match /pub\ \(undefined\:([0-9]+):[0-9]+/ - if not (search?.length >= 2) then return res - res.src_line = search[1] - src_lines = src.split '\n' - txt_lines = view.txt.split '\n' - before = src_lines[0...res.src_line].join "\n" - after = src_lines[res.src_line...].join "\n" - prev_matches = before.match /__toffee.lineno[ ]*=[ ]*([0-9]+)/g - after_matches = after.match /__toffee.lineno[ ]*=[ ]*([0-9]+)/g - if prev_matches?.length - res.toffee_line_range[0] = parseInt prev_matches[prev_matches.length-1].match(/[0-9]+/)[0] - else - res.toffee_line_range[0] = 1 - if after_matches?.length - res.toffee_line_range[1] = parseInt after_matches[0].match(/[0-9]+/)[0] - else - res.toffee_line_range[1] = txt_lines.length - res.offensive_lines = txt_lines[(res.toffee_line_range[0]-1)...(res.toffee_line_range[1]-1)] - if res.toffee_line_range[0] is res.toffee_line_range[1] - 1 - new_msg = "on line #{res.toffee_line_range[0]}" - else - new_msg = "between lines #{res.toffee_line_range[0]} and #{res.toffee_line_range[1]}" - res.converted_msg = res.original_msg + " " + new_msg - if view.fileName then res.converted_msg = "#{view.fileName}: #{res.converted_msg}" - res - - - generateCompileToJsError: (view, e) -> - ### - e: the error caught when compiling - ### - src = view.coffeeScript - msg = e.message - res = - src_line: 0 - toffee_line_range: [0,1] - original_msg: msg - converted_msg: msg - search = msg.match /on line ([0-9]+)/ - if search?.length >= 2 - res.src_line = search[1] - res.toffee_line_range = @_convertSrcLineToToffeeRange view.coffeeScript, res.src_line - res.offensive_lines = txt_lines[(res.toffee_line_range[0]-1)...(res.toffee_line_range[1]-1)] - if res.toffee_line_range[0] is res.toffee_line_range[1] - 1 - new_msg = "on line #{res.toffee_line_range[0]}" - else - new_msg = "between lines #{res.toffee_line_range[0]} and #{res.toffee_line_range[1]}" - res.converted_msg = res.original_msg.replace "on line #{res.src_line}", new_msg - if view.fileName then res.converted_msg = "#{view.fileName}: #{res.converted_msg}" - res - - prettyPrintError: (view) -> - if not view.error - "" - else - res = """
    """ - res += "#{eh._ppEscape view.error.converted_msg}" - res += "\n
    --------
    " - res += "\n
    " - txt_lines = view.txt.split '\n' - for i in [(view.error.toffee_line_range[0]-3)...(view.error.toffee_line_range[1]+1)] - if (i < 0) or i > txt_lines.length - 1 - continue - line = eh._ppEscape txt_lines[i] - lineno = i+1 - padding_len = 5 - ("#{lineno}").length - padding = (" " for i in [0...padding_len]).join "" - res+= "\n#{lineno}: #{padding} #{line}
    " - res += "\n
    " - res += "\n
    " - res - _ppEscape = (txt) -> txt = txt.replace(/&/g, '&').replace(/ + @_consfn = cons + @_size = size + @_pool = [] + + get: () -> + if @_pool.length > 0 + @_pool.pop() + else + @_consfn() + + release: (x) -> + if @_pool.length < @_size + @_pool.push x + +exports.Pool = Pool diff --git a/src/toffee.jison b/src/toffee.jison index d6f106a..e9d0f86 100644 --- a/src/toffee.jison +++ b/src/toffee.jison @@ -10,10 +10,9 @@ "{##" return 'START_TOFFEE_COMMENT'; "##}" return 'END_TOFFEE_COMMENT'; ":}" return 'END_TOFFEE'; -"{:" return 'START_INDENTED_TOFFEE'; +"{:" return 'START_TOFFEE'; "{#" return 'START_COFFEE'; "#}" return 'END_COFFEE'; -[\-][\t\r\n ]*"{:" return 'START_TOFFEE'; [^{}#\\:\-]+|[\\{}#:\-] return 'CODE'; <> return 'EOF'; @@ -28,24 +27,39 @@ starter toffee_zone EOF { $$ = ["TOFFEE_ZONE", $1]; return $$;} ; + toffee_zone : - toffee_code { $$ = [$1]; } + toffee_code { $$ = [$1]; } | - toffee_code flip_to_coffee toffee_zone { $$ = $3; $3.splice(0,0,$1,$2); } + toffee_code flip_to_coffee toffee_zone { $$ = $3; $3.splice(0,0,$1,$2); } | - flip_to_coffee toffee_zone { $$ = $2; $2.splice(0,0,$1); } + flip_to_coffee toffee_zone { $$ = $2; $2.splice(0,0,$1); } | - toffee_code flip_to_toffeecomment toffee_zone { $$ = $3; $3.splice(0,0,$1); } + toffee_code flip_to_toffee_comment toffee_zone { $$ = $3; $3.splice(0,0,$1); } | - flip_to_toffeecomment toffee_zone { $$ = $2; } + flip_to_toffee_comment toffee_zone { $$ = $2; } | - { $$ = []; } + { $$ = []; } ; -flip_to_toffeecomment +flip_to_toffee_comment : - START_TOFFEE_COMMENT code END_TOFFEE_COMMENT {} + START_TOFFEE_COMMENT toffee_commented_region END_TOFFEE_COMMENT {} + ; + +toffee_commented_region + : + toffee_commented_region START_COFFEE + | + toffee_commented_region END_COFFEE + | + toffee_commented_region START_TOFFEE + | + toffee_commented_region END_TOFFEE + | + toffee_commented_region CODE + | ; flip_to_coffee @@ -67,8 +81,6 @@ coffee_zone flip_to_toffee : START_TOFFEE toffee_zone END_TOFFEE { $$ = ["TOFFEE_ZONE", $2]; } - | - START_INDENTED_TOFFEE toffee_zone END_TOFFEE { $$ = ["INDENTED_TOFFEE_ZONE", $2]; } ; diff --git a/src/view.coffee b/src/view.coffee index eb9a73f..0f1ea2f 100644 --- a/src/view.coffee +++ b/src/view.coffee @@ -3,11 +3,201 @@ {states, TAB_SPACES} = require './consts' utils = require './utils' vm = require 'vm' -try +util = require 'util' +try coffee = require "iced-coffee-script" catch e coffee = require "coffee-script" + +spaces = (n) -> (" " for i in [0...n]).join "" +tabs = (n) -> (spaces(TAB_SPACES) for i in [0...n]).join "" + +getCommonHeaders = (tab_level, include_bundle_headers, auto_escape) -> + ### + each view will use this, or if they're bundled together, + it'll only be used once. + + include_bundle_headers: includes some functions needed for browser use + ### + __ = tabs tab_level + + """ +\n +#{__}if not toffee? then toffee = {} +#{__}if not toffee.templates then toffee.templates = {} + +#{__}toffee.states = #{JSON.stringify states} + +#{__}toffee.__json = (locals, o, opts) -> +#{__} opts or= {} +#{__} opts.indent or= "" +#{__} if not o? +#{__} return "null" +#{__} else +#{__} return "" + JSON.stringify(o,null,opts.indent) +#{__} .replace(//g,'\\\\u003E') +#{__} .replace(/&/g,'\\\\u0026').replace(/\\u2028/g, '\\\\u2028') +#{__} .replace(/\\u2029/g, '\\\\u2029') +#{__} .replace(/\\u200e/g, '\\\\u200e') # LEFT-TO-RIGHT MARK +#{__} .replace(/\\u200f/g, '\\\\u200f') # RIGHT-TO-LEFT MARK +#{__} .replace(/\\u202a/g, '\\\\u202a') # LEFT-TO-RIGHT EMBEDDING +#{__} .replace(/\\u202b/g, '\\\\u202b') # RIGHT-TO-LEFT EMBEDDING +#{__} .replace(/\\u202c/g, '\\\\u202c') # POP DIRECTIONAL FORMATTING +#{__} .replace(/\\u202d/g, '\\\\u202d') # LEFT-TO-RIGHT OVERRIDE +#{__} .replace(/\\u202e/g, '\\\\u202e') # RIGHT-TO-LEFT OVERRIDE +#{__} .replace(/\\u206a/g, '\\\\u206a') # INHIBIT SYMMETRIC SWAPPING +#{__} .replace(/\\u206b/g, '\\\\u206b') # ACTIVATE SYMMETRIC SWAPPING +#{__} .replace(/\\u206c/g, '\\\\u206c') # INHIBIT ARABIC FORM SHAPING +#{__} .replace(/\\u206d/g, '\\\\u206d') # ACTIVATE ARABIC FORM SHAPING +#{__} .replace(/\\u206e/g, '\\\\u206e') # NATIONAL DIGIT SHAPES +#{__} .replace(/\\u206f/g, '\\\\u206f') # NOMINAL DIGIT SHAPES +#{__} .replace(/\\u2066/g, '\\\\u2066') # LEFT-TO-RIGHT ISOLATE (LRI) +#{__} .replace(/\\u2067/g, '\\\\u2067') # RIGHT-TO-LEFT ISOLATE (RLI) +#{__} .replace(/\\u2068/g, '\\\\u2068') # FIRST STRONG ISOLATE (FSI) +#{__} .replace(/\\u2069/g, '\\\\u2069') # POP DIRECTIONAL ISOLATE (PDI) + + +#{__}toffee.__raw = (locals, o) -> o + +#{__}toffee.__html = (locals, o) -> +#{__} (""+o).replace(/&/g, '&') +#{__} .replace(//g, '>') +#{__} .replace(/\"/g, '"') +#{__} .replace(/\\u200e/g, '') # LEFT-TO-RIGHT MARK +#{__} .replace(/\\u200f/g, '') # RIGHT-TO-LEFT MARK +#{__} .replace(/\\u202a/g, '') # LEFT-TO-RIGHT EMBEDDING +#{__} .replace(/\\u202b/g, '') # RIGHT-TO-LEFT EMBEDDING +#{__} .replace(/\\u202c/g, '') # POP DIRECTIONAL FORMATTING +#{__} .replace(/\\u202d/g, '') # LEFT-TO-RIGHT OVERRIDE +#{__} .replace(/\\u202e/g, '') # RIGHT-TO-LEFT OVERRIDE +#{__} .replace(/\\u206a/g, '') # INHIBIT SYMMETRIC SWAPPING +#{__} .replace(/\\u206b/g, '') # ACTIVATE SYMMETRIC SWAPPING +#{__} .replace(/\\u206c/g, '') # INHIBIT ARABIC FORM SHAPING +#{__} .replace(/\\u206d/g, '') # ACTIVATE ARABIC FORM SHAPING +#{__} .replace(/\\u206e/g, '') # NATIONAL DIGIT SHAPES +#{__} .replace(/\\u206f/g, '') # NOMINAL DIGIT SHAPES +#{__} .replace(/\\u2066/g, '') # LEFT-TO-RIGHT ISOLATE (LRI) +#{__} .replace(/\\u2067/g, '') # RIGHT-TO-LEFT ISOLATE (RLI) +#{__} .replace(/\\u2068/g, '') # FIRST STRONG ISOLATE (FSI) +#{__} .replace(/\\u2069/g, '') # POP DIRECTIONAL ISOLATE (PDI) + + +#{__}toffee.__escape = (locals, o) -> +#{__} if locals.__toffee.autoEscape? then ae = locals.__toffee.autoEscape +#{__} else if #{auto_escape?} then ae = #{auto_escape} +#{__} else ae = true +#{__} if ae +#{__} if o is undefined then return '' +#{__} if o? and (typeof o) is "object" then return locals.json o +#{__} return locals.html o +#{__} return o + +#{__}toffee.__augmentLocals = (locals, bundle_path) -> +#{__} _l = locals +#{__} _t = _l.__toffee = {out: []} +#{__} if not _l.print? then _l.print = (o) -> toffee.__print _l, o +#{__} if not _l.json? then _l.json = (o, opts) -> toffee.__json _l, o, opts +#{__} if not _l.raw? then _l.raw = (o) -> toffee.__raw _l, o +#{__} if not _l.html? then _l.html = (o) -> toffee.__html _l, o +#{__} if not _l.escape? then _l.escape = (o) -> toffee.__escape _l, o +#{__} if not _l.partial? then _l.partial = (path, vars) -> toffee.__partial toffee.templates["\#{bundle_path}"], _l, path, vars +#{__} if not _l.snippet? then _l.snippet = (path, vars) -> toffee.__snippet toffee.templates["\#{bundle_path}"], _l, path, vars +#{__} if not _l.load? then _l.load = (path, vars) -> toffee.__load toffee.templates["\#{bundle_path}"], _l, path, vars +#{__} _t.print = _l.print +#{__} _t.json = _l.json +#{__} _t.raw = _l.raw +#{__} _t.html = _l.html +#{__} _t.escape = _l.escape +#{__} _t.partial = _l.partial +#{__} _t.snippet = _l.snippet +#{__} _t.load = _l.load + +#{if include_bundle_headers then getBundleHeaders(tab_level) else ""} +""" + +getBundleHeaders = (tab_level) -> + ### + header stuff + only needed when compiling to a JS file + ### + __ = tabs tab_level + """ +\n +#{__}toffee.__print = (locals, o) -> +#{__} if locals.__toffee.state is toffee.states.COFFEE +#{__} locals.__toffee.out.push o +#{__} return '' +#{__} else +#{__} return "\#{o}" + +#{__}toffee.__normalize = (path) -> +#{__} if (not path?) or path is "/" +#{__} return path +#{__} else +#{__} parts = path.split "/" +#{__} np = [] +#{__} # make sure path always starts with '/' +#{__} if parts[0] +#{__} np.push '' +#{__} for part in parts +#{__} if part is ".." +#{__} if np.length > 1 +#{__} np.pop() +#{__} else +#{__} np.push part +#{__} else +#{__} if part isnt "." +#{__} np.push part +#{__} path = np.join "/" +#{__} if not path then path = "/" +#{__} return path + +#{__}toffee.__partial = (parent_tmpl, parent_locals, path, vars) -> +#{__} path = toffee.__normalize parent_tmpl.bundlePath + "/../" + path +#{__} return toffee.__inlineInclude path, vars, parent_locals + +#{__}toffee.__snippet = (parent_tmpl, parent_locals, path, vars) -> +#{__} path = toffee.__normalize parent_tmpl.bundlePath + "/../" + path +#{__} vars = if vars? then vars else {} +#{__} vars.__toffee = vars.__toffee or {} +#{__} vars.__toffee.noInheritance = true +#{__} return toffee.__inlineInclude path, vars, parent_locals + +#{__}toffee.__load = (parent_tmpl, parent_locals, path, vars) -> +#{__} path = toffee.__normalize parent_tmpl.bundlePath + "/../" + path +#{__} vars = if vars? then vars else {} +#{__} vars.__toffee = vars.__toffee or {} +#{__} vars.__toffee.repress = true +#{__} return toffee.__inlineInclude path, vars, parent_locals + +#{__}toffee.__inlineInclude = (path, locals, parent_locals) -> +#{__} options = locals or {} +#{__} options.passback = {} +#{__} options.__toffee = options.__toffee or {} +#{__} +#{__} # we need to make a shallow copy of parent variables +#{__} reserved = {} +#{__} reserved[k] = true for k in ["passback", "load", "print", "partial", "snippet", "layout", "__toffee", "postProcess"] +#{__} if not options.__toffee.noInheritance +#{__} for k,v of parent_locals when not locals?[k]? +#{__} if not reserved[k]? +#{__} options[k] = v +#{__} +#{__} if not toffee.templates[path] +#{__} return "Inline toffee include: Could not find \#{path}" +#{__} else +#{__} res = toffee.templates[path].pub options +#{__} for k,v of options.passback +#{__} parent_locals[k] = v +#{__} return res +""" + +getCommonHeadersJs = (include_bundle_headers, auto_escape)-> + ch = getCommonHeaders 0, include_bundle_headers, auto_escape + js = coffee.compile ch, {bare: true} + js + class view constructor: (txt, options) -> @@ -16,35 +206,41 @@ class view cb: if this is set, compilation will happen async and cb will be executed when it's ready ### options = options or {} - @fileName = options.fileName or options.filename or null - @identifier = options.indentifier or "pub" - @verbose = options.verbose or false - @prettyPrintErrors = if options.prettyPrintErrors? then options.prettyPrintErrors else true - @txt = txt - @tokenObj = null # constructed as needed - @coffeeScript = null # constructed as needed - @javaScript = null # constructed as needed - @scriptObj = null # constructed as needed - @error = null # if err, instance of toffeeError class + @fileName = options.fileName or options.filename or null + @bundlePath = options.bundlePath or "/" # if to be included inside a bundle, this is the path inside it. + @browserMode = options.browserMode or false + @verbose = options.verbose or false + @fsError = options.fsError or false # pass true if you could not load the view template and passed in error text + @prettyPrintErrors = if options.prettyPrintErrors? then options.prettyPrintErrors else true + @prettyLogErrors = if options.prettyLogErrors? then options.prettyLogErrors else false + @autoEscape = if options.autoEscape? then options.autoEscape else false + @additionalErrorHandler = options.additionalErrorHandler or null + @txt = txt + @tokenObj = null # constructed as needed + @coffeeScript = null # constructed as needed + @javaScript = null # constructed as needed + @fun = null # constructed as needed + @error = null # if err, instance of toffeeError class if options.cb - @_prepAsync txt, => - options.cb @ + @_prepAsync txt, options.ctx, (=> options.cb @) - _prepAsync: (txt, cb) -> + + _prepAsync: (txt, ctx, cb) -> ### Only once it's fully compiled does it callback. Defers via setTimeouts in each stage in the compile process for CPU friendliness. This is a lot prettier with iced-coffee-script. ### + ctx = ctx or vm.createContext({}) @_log "Prepping #{if @fileName? then @fileName else 'unknown'} async." @_toTokenObj() v = @ setTimeout -> - v._toCoffee() + v.toCoffee() setTimeout -> - v._toJavaScript() + v.toJavaScript() setTimeout -> - v._toScriptObj() + v._toFun(ctx) v._log "Done async prep of #{if v.fileName? then v.fileName else 'unknown'}. Calling back." cb() , 0 @@ -62,33 +258,43 @@ class view ### replaces tabs with spaces in their coffee regions ### - if obj[0] in ["INDENTED_TOFFEE_ZONE", "TOFFEE_ZONE", "COFFEE_ZONE"] + if obj[0] in ["TOFFEE_ZONE", "COFFEE_ZONE"] @_cleanTabs item for item in obj[1] else if obj[0] is "COFFEE" - obj[1] = obj[1].replace /\t/g, @_tabAsSpaces() + obj[1] = obj[1].replace /\t/g, tabs 1 - run: (options) -> + run: (options, ctx) -> ### returns [err, str] ### - script = @_toScriptObj() + ctx = ctx or vm.createContext({}) + fun = @_toFun(ctx) res = null if not @error try - sandbox = { __toffee_run_input: options } - script.runInNewContext sandbox - res = sandbox.__toffee_run_input.__toffee.res - delete sandbox.__toffee_run_input.__toffee + res = fun options catch e @error = new toffeeError @, errorTypes.RUNTIME, e if @error + if @prettyLogErrors + txt = @error.getPrettyPrintText() + for line in txt.split "\n" + console.log "toffee err: #{line}" + if @additionalErrorHandler + @additionalErrorHandler @error.getPrettyPrintText(), @error.getPrettyPrint(), @fileName, options + if @prettyPrintErrors - return [null, @error.getPrettyPrint()] + pair = [null, @error.getPrettyPrint()] else - return [null, @error.getPrettyPrintText()] + pair = [@error.e, null] + if @error.errType is errorTypes.RUNTIME + # don't hold onto runtime errors after value returned. + @error = null else - return [null, res] + pair = [null, res] + + return pair _toTokenObj: -> ### @@ -104,85 +310,101 @@ class view @tokenObj - _toScriptObj: -> - if not @scriptObj? - txt = @_toJavaScript() + _toFun: (ctx) -> + if not @fun? + txt = @toJavaScript() if not @error d = Date.now() - @scriptObj = vm.createScript txt + vm.runInContext(txt, ctx) + @fun = ctx['_TMPL_'] @_log "#{@fileName} compiled to scriptObj in #{Date.now()-d}ms" - @scriptObj + @fun - _toJavaScript: -> + toJavaScript: -> if not @javaScript? - c = @_toCoffee() + c = @toCoffee() if not @error d = Date.now() try - @javaScript = coffee.compile c, {bare: false} + opts = { bare: true } + if @browserMode + opts.bare = false + @javaScript = coffee.compile c, opts catch e @error = new toffeeError @, errorTypes.COFFEE_COMPILE, e @_log "#{@fileName} compiled to JavaScript in #{Date.now()-d}ms" @javaScript - _toCoffee: -> + toCoffee: -> if not @coffeeScript? tobj = @_toTokenObj() if not @error d = Date.now() res = @_coffeeHeaders() try - res += @_toCoffeeRecurse(tobj, TAB_SPACES, 0)[0] + res += @_toCoffeeRecurse(tobj, TAB_SPACES * (1 + @_globalTabLevel()), 0, {})[0] res += @_coffeeFooters() @coffeeScript = res - catch e + catch e + console.log e @error # already assigned inside _toCoffeeRecurse @_log "#{@fileName} compiled to CoffeeScript in #{Date.now()-d}ms" @coffeeScript _printLineNo: (n, ind) -> - if @lastLineNo? and (n is @lastLineNo) + if (@lastLineNo? and (n is @lastLineNo)) return "" else @lastLineNo = n - return "\n#{@_space ind}__toffee.lineno = #{n}" + return "\n#{spaces ind}_ln #{n}" _snippetHasEscapeOverride: (str) -> - for token in ['print',' snippet', 'partial', 'raw', 'html', 'json', '__toffee.raw', '__toffee.html', '__toffee.json', 'JSON.stringify'] + for token in ['print',' snippet', 'load', 'partial', 'raw', 'html', 'json', '__toffee.raw', '__toffee.html', '__toffee.json'] if str[0...token.length] is token if (str.length > token.length) and (str[token.length] in [' ','\t','\n','(']) return true false - _toCoffeeRecurse: (obj, indent_level, indent_baseline) -> + _snippetIsSoloToken: (str) -> + ### + if the inside is something like #{ foo } not #{ foo.bar } or other complex thing. + ### + if str.match /// + ^ + [$A-Za-z_\x7f-\uffff] + [$\w\x7f-\uffff]* + $ + /// + return true + return false + + + _toCoffeeRecurse: (obj, indent_level, indent_baseline, state_carry) -> # returns [res, indent_baseline_delta] # indent_level = # of spaces to add to each coffeescript section - # indent_baseline = # of chars to strip from each line inside {# #} + # indent_baseline = # of chars to strip from each line inside {# #} res = "" i_delta = 0 switch obj[0] - when "INDENTED_TOFFEE_ZONE" - indent_level += TAB_SPACES - for item in obj[1] - [s, delta] = @_toCoffeeRecurse item, indent_level, indent_baseline - res += s when "TOFFEE_ZONE" - res += "\n#{@_space indent_level}__toffee.state = states.TOFFEE" + if state_carry.last_coffee_ends_with_newline is false + indent_level += TAB_SPACES + res += "\n#{spaces indent_level}_ts #{states.TOFFEE}" for item in obj[1] - [s, delta] = @_toCoffeeRecurse item, indent_level, indent_baseline + [s, delta] = @_toCoffeeRecurse item, indent_level, indent_baseline, state_carry res += s when "COFFEE_ZONE" - res += "\n#{@_space indent_level}__toffee.state = states.COFFEE" + res += "\n#{spaces indent_level}_ts #{states.COFFEE}" zone_baseline = @_getZoneBaseline obj[1] temp_indent_level = indent_level for item in obj[1] - [s, delta] = @_toCoffeeRecurse item, temp_indent_level, zone_baseline + [s, delta] = @_toCoffeeRecurse item, temp_indent_level, zone_baseline, state_carry res += s temp_indent_level = indent_level + delta when "TOFFEE" ind = indent_level - res += "\n#{@_space ind}__toffee.state = states.TOFFEE" + res += "\n#{spaces ind}_ts #{states.TOFFEE}" lineno = obj[2] try t_int = utils.interpolateString obj[1] @@ -193,29 +415,34 @@ class view for part in t_int if part[0] is "TOKENS" res += @_printLineNo lineno, ind - interp = part[1].replace /^[\n \t]+/, '' - if @_snippetHasEscapeOverride interp + interp = part[1].replace /(^[\n \t]+)|([\n \t]+)$/g, '' + interp = interp.replace /[\u2028\u2029]/g , '\n' + if @_snippetIsSoloToken interp + chunk = "\#{if #{interp}? then escape #{interp} else ''}" + else if @_snippetHasEscapeOverride interp chunk = "\#{#{interp}}" else chunk = "\#{escape(#{interp})}" - res += "\n#{@_space ind}__toffee.out.push #{@_quoteStr chunk}" + res += "\n#{spaces ind}_to #{@_quoteStr chunk}" lineno += part[1].split("\n").length - 1 else - lines = part[1].split "\n" + lines = part[1].split /[\n\u2028\u2029]/ for line,i in lines res += @_printLineNo lineno, ind lbreak = if i isnt lines.length - 1 then "\n" else "" chunk = @_escapeForStr "#{line}#{lbreak}" if chunk.length - res += "\n#{@_space ind}__toffee.out.push #{@_quoteStr(chunk + lbreak)}" + res += "\n#{spaces ind}_to #{@_quoteStr(chunk + lbreak)}" if i < lines.length - 1 then lineno++ res += @_printLineNo obj[2] + (obj[1].split('\n').length-1), ind - res += "\n#{@_space ind}__toffee.state = states.COFFEE" + res += "\n#{spaces ind}_ts #{states.COFFEE}" when "COFFEE" c = obj[1] + c = c.replace /[\u2028\u2029]/g , '\n' res += "\n#{@_reindent c, indent_level, indent_baseline}" i_delta = @_getIndentationDelta c, indent_baseline - else + state_carry.last_coffee_ends_with_newline = @_doesEndWithNewline c + else throw "Bad parsing. #{obj} not handled." return ["",0] @@ -241,11 +468,19 @@ class view if follow.length then res += "+ \'#{follow}\'" res + _doesEndWithNewline: (s) -> + parts = s.split "\n" + if (parts.length > 1) and parts[parts.length - 1].match /^[\t ]*$/ + return true + else + return false + _escapeForStr: (s) -> ### escapes a string so it can make it into coffeescript triple quotes without losing whitespace, etc. ### + s = s.replace /\\/g, '\\\\' s = s.replace /\n/g, '\\n' s = s.replace /\t/g, '\\t' s @@ -282,17 +517,17 @@ class view if not baseline? then baseline = @_getIndentationBaseline coffee if not baseline? res = 0 - else + else lines = coffee.split "\n" if lines.length < 1 res = 0 - else + else y = lines[lines.length - 1] y_l = y.match(/[ ]*/)[0].length res = y_l - baseline return res - _reindent: (coffee, indent_level, indent_baseline) -> + _reindent: (coffee, indent_level, indent_baseline) -> lines = coffee.split '\n' # strip out any leading whitespace lines while lines.length and lines[0].match /^[ ]*$/ @@ -300,72 +535,53 @@ class view return '' unless lines.length rxx = /^[ ]*/ strip = indent_baseline - indent = @_space indent_level + indent = spaces indent_level res = ("#{indent}#{line[strip...]}" for line in lines).join "\n" res - _space: (indent) -> (" " for i in [0...indent]).join "" - - _tabAsSpaces: -> (" " for i in [0...TAB_SPACES]).join "" + _globalTabLevel: -> + if @browserMode then 0 else 1 + + _globalTabs: -> tabs @_globalTabLevel() _coffeeHeaders: -> - ___ = @_tabAsSpaces() + __ = @_globalTabs() + ___ = tabs 1 # guaranteed tabs """ -domain = this -domain.toffeeTemplates = domain.toffeeTemplates or {} -domain.toffeeTemplates["#{@identifier}"] = (locals) -> -#{___}domain = this -#{___}locals.__toffee = {} -#{___}`with (locals) {` -#{___}__toffee.out = [] - -#{___}if not print? -#{___}#{___}print = (txt) -> -#{___}#{___}#{___}if __toffee.state is states.COFFEE -#{___}#{___}#{___}#{___}__toffee.out.push txt -#{___}#{___}#{___}#{___}return '' -#{___}#{___}#{___}else -#{___}#{___}#{___}#{___}return "\#{txt}x" - -#{___}__toffee.json = (o) -> -#{___}#{___}try -#{___}#{___}#{___}json = JSON.stringify o -#{___}#{___}catch e -#{___}#{___}#{___}throw {stack:[], message: "JSONify error (\#{e.message}) on line \#{__toffee.lineno}", toffee_line_base: __toffee.lineno } -#{___}#{___}res = "" + json - -#{___}__toffee.html = (o) -> -#{___}#{___}res = (""+o).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"') - -#{___}__toffee.raw = (o) -> o - -#{___}if not raw? then raw = __toffee.raw -#{___}if not html? then html = __toffee.html -#{___}if not json? then json = __toffee.json - -#{___}if not escape? -#{___}#{___}escape = (o) -> -#{___}#{___}#{___}if (not __toffee.autoEscape?) or __toffee.autoEscape -#{___}#{___}#{___}#{___}if o? and (typeof o) is "object" -#{___}#{___}#{___}#{___}#{___}return __toffee.json o -#{___}#{___}#{___}#{___}return __toffee.html o - -#{___}states = #{JSON.stringify states} +#{if @browserMode then '' else ('_TMPL_ = (__toffee_run_input) ->' + (getCommonHeaders 1, false, @autoEscape)) } +#{__}# browser mode = #{@browserMode} +#{__}tmpl = toffee.templates["#{@bundlePath}"] = +#{__} bundlePath: "#{@bundlePath}" +#{__}tmpl.render = tmpl.pub = (__locals) -> +#{__}#{___}__locals = __locals or {} +#{__}#{___}__repress = __locals.__toffee?.repress +#{__}#{___}_to = (x) -> __locals.__toffee.out.push x +#{__}#{___}_ln = (x) -> __locals.__toffee.lineno = x +#{__}#{___}_ts = (x) -> __locals.__toffee.state = x +#{__}#{___}toffee.__augmentLocals __locals, "#{@bundlePath}" + +#{__}#{___}`with (__locals) {` +#{__}#{___}__toffee.out = [] """ _coffeeFooters: -> - ___ = @_tabAsSpaces() + __ = @_globalTabs() + ___ = tabs 1 # guaranteed tabs """\n -#{___}__toffee.res = __toffee.out.join "" -#{___}return __toffee.res -#{___}`} /* closing JS 'with' */ ` -# sometimes we want to execute the whole thing in a sandbox -# and just output results -if __toffee_run_input? -#{___}return domain.toffeeTemplates["#{@identifier}"] __toffee_run_input +#{__}#{___}__toffee.res = __toffee.out.join "" +#{__}#{___}if postProcess? +#{__}#{___}#{___}__toffee.res = postProcess __toffee.res +#{__}#{___}if (not __repress) then return __toffee.res else return "" +#{__}`true; } /* closing JS 'with' */ ` +#{__}# sometimes we want to execute the whole thing in a sandbox +#{__}# and just output results +#{__}if __toffee_run_input? +#{__}#{___}return tmpl.pub __toffee_run_input """ -exports.view = view +exports.view = view +exports.getCommonHeaders = getCommonHeaders +exports.getCommonHeadersJs = getCommonHeadersJs # express 2.x support exports.expressCompile = (txt, options) -> diff --git a/test/cases/bad_unicode/input.toffee b/test/cases/bad_unicode/input.toffee new file mode 100644 index 0000000..f184e18 --- /dev/null +++ b/test/cases/bad_unicode/input.toffee @@ -0,0 +1,8 @@ +\u2028:
 +\u2029:
 +{# + u2028 = "
" + u2029 = "
" +#} +

    HI 2028: #{"
"}

    +

    HI 2028: #{"
"}

    diff --git a/test/cases/bad_unicode/output.toffee b/test/cases/bad_unicode/output.toffee new file mode 100644 index 0000000..e7f9c21 --- /dev/null +++ b/test/cases/bad_unicode/output.toffee @@ -0,0 +1,7 @@ +\u2028: + +\u2029: + + +

    HI 2028:

    +

    HI 2028:

    diff --git a/test/cases/big_file/input.toffee b/test/cases/big_file/input.toffee index afa1f7a..f9aab74 100644 --- a/test/cases/big_file/input.toffee +++ b/test/cases/big_file/input.toffee @@ -1,197 +1,24 @@ {# count = 0 - for i in [0...5] {:#{ - count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ + for i in [0...2] {:#{ + count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ }...{# count += 1 - print "#{count}..." - #}#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ + print " #{count}..." + #} #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ + }... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++}... #{count++ }...{# count += 1 - print "#{count}..." - #}#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...{# - count += 1 - print "#{count}..." - #}#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...{# - count += 1 - print "#{count}..." - #}#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++}...#{count++ - }...:} + print " #{count}..." + #}:} #} \ No newline at end of file diff --git a/test/cases/big_file/output.toffee b/test/cases/big_file/output.toffee index 4831e8c..2525b55 100644 --- a/test/cases/big_file/output.toffee +++ b/test/cases/big_file/output.toffee @@ -1 +1 @@ -0...1...2...3...4...5...6...7...8...9...10...11...12...13...14...15...16...17...18...19...20...21...22...23...24...25...26...27...28...29...30...31...32...33...34...35...36...37...38...39...40...41...42...43...44...45...46...47...48...49...50...51...52...53...54...55...56...57...58...59...60...61...62...63...64...65...66...67...68...69...70...71...72...73...74...75...76...77...78...79...80...81...82...83...84...85...86...87...88...89...90...91...92...93...94...95...96...97...98...99...100...101...102...103...104...105...106...107...108...109...110...111...112...113...114...115...116...117...118...119...120...121...122...123...124...125...126...127...128...129...130...131...132...133...134...135...136...137...138...139...140...141...142...143...144...145...146...147...148...149...150...151...152...153...154...155...156...157...158...159...160...161...162...163...164...165...166...167...168...169...170...171...172...173...174...175...176...177...178...179...180...181...182...183...184...185...186...187...188...189...190...191...192...193...194...195...196...197...198...199...200...201...202...203...204...205...206...207...208...209...210...211...212...213...214...215...216...217...218...219...220...221...222...223...224...225...226...227...228...229...230...231...232...233...234...235...236...237...238...239...240...241...242...243...244...245...246...247...248...249...250...251...252...253...254...255...256...257...258...259...260...261...262...263...264...265...266...267...268...269...270...271...272...273...274...275...276...277...278...279...280...281...282...283...284...285...286...287...288...289...290...291...292...293...294...295...296...297...298...299...300...301...302...303...304...305...306...307...308...309...310...311...312...313...314...315...316...317...318...319...320...321...322...323...324...325...326...327...328...329...330...331...332...333...334...335...336...337...338...339...340...341...342...343...344...345...346...347...348...349...350...351...352...353...354...355...356...357...358...359...360...361...362...363...364...365...366...367...368...369...370...371...372...373...374...375...376...377...378...379...380...381...382...383...384...385...386...387...388...389...390...391...392...393...394...395...396...397...398...399...400...401...402...403...404...405...406...407...408...409...410...411...412...413...414...415...416...417...418...419...420...421...422...423...424...425...426...427...428...429...430...431...432...433...434...435...436...437...438...439...440...441...442...443...444...445...446...447...448...449...450...451...452...453...454...455...456...457...458...459...460...461...462...463...464...465...466...467...469...469...470...471...472...473...474...475...476...477...478...479...480...481...482...483...484...485...486...487...488...489...490...491...492...493...494...495...496...497...498...499...500...501...502...503...504...505...506...507...508...509...510...511...512...513...514...515...516...517...518...519...520...521...522...523...524...525...526...527...528...529...530...531...532...533...534...535...536...537...538...539...540...541...542...543...544...545...546...547...548...549...550...551...552...553...554...555...556...557...558...559...560...561...562...563...564...565...566...567...568...569...570...571...572...573...574...575...576...577...578...579...580...581...582...583...584...585...586...587...588...589...590...591...592...593...594...595...596...597...598...599...600...601...602...603...604...605...606...607...608...609...610...611...612...613...614...615...616...617...618...619...620...621...622...623...624...625...626...627...628...629...630...631...632...633...634...635...636...637...638...639...640...641...642...643...644...645...646...647...648...649...650...651...652...653...654...655...656...657...658...659...660...661...662...663...664...665...666...667...668...669...670...671...672...673...674...675...676...677...678...679...680...681...682...683...684...685...686...687...688...689...690...691...692...693...694...695...696...697...698...699...700...701...702...703...704...705...706...707...708...709...710...711...712...713...714...715...716...717...718...719...720...721...722...723...724...725...726...727...728...729...730...731...732...733...734...735...736...737...738...739...740...741...742...743...744...745...746...747...748...749...750...751...752...753...754...755...756...757...758...759...760...761...762...763...764...765...766...767...768...769...770...771...772...773...774...775...776...777...778...779...780...781...782...783...784...785...786...787...788...789...790...791...792...793...794...795...796...797...798...799...800...801...802...803...804...805...806...807...808...809...810...811...812...813...814...815...816...817...818...819...820...821...822...823...824...825...826...827...828...829...830...831...832...833...834...835...836...837...838...839...840...841...842...843...844...845...846...847...848...849...850...851...852...853...854...855...856...857...858...859...860...861...862...863...864...865...866...867...868...869...870...871...872...873...874...875...876...877...878...879...880...881...882...883...884...885...886...887...888...889...890...891...892...893...894...895...896...897...898...899...900...901...902...903...904...905...906...907...908...909...910...911...912...913...914...915...916...917...918...919...920...921...922...923...924...925...926...927...928...929...930...931...932...933...934...935...936...938...938...939...940...941...942...943...944...945...946...947...948...949...950...951...952...953...954...955...956...957...958...959...960...961...962...963...964...965...966...967...968...969...970...971...972...973...974...975...976...977...978...979...980...981...982...983...984...985...986...987...988...989...990...991...992...993...994...995...996...997...998...999...1000...1001...1002...1003...1004...1005...1006...1007...1008...1009...1010...1011...1012...1013...1014...1015...1016...1017...1018...1019...1020...1021...1022...1023...1024...1025...1026...1027...1028...1029...1030...1031...1032...1033...1034...1035...1036...1037...1038...1039...1040...1041...1042...1043...1044...1045...1046...1047...1048...1049...1050...1051...1052...1053...1054...1055...1056...1057...1058...1059...1060...1061...1062...1063...1064...1065...1066...1067...1068...1069...1070...1071...1072...1073...1074...1075...1076...1077...1078...1079...1080...1081...1082...1083...1084...1085...1086...1087...1088...1089...1090...1091...1092...1093...1094...1095...1096...1097...1098...1099...1100...1101...1102...1103...1104...1105...1106...1107...1108...1109...1110...1111...1112...1113...1114...1115...1116...1117...1118...1119...1120...1121...1122...1123...1124...1125...1126...1127...1128...1129...1130...1131...1132...1133...1134...1135...1136...1137...1138...1139...1140...1141...1142...1143...1144...1145...1146...1147...1148...1149...1150...1151...1152...1153...1154...1155...1156...1157...1158...1159...1160...1161...1162...1163...1164...1165...1166...1167...1168...1169...1170...1171...1172...1173...1174...1175...1176...1177...1178...1179...1180...1181...1182...1183...1184...1185...1186...1187...1188...1189...1190...1191...1192...1193...1194...1195...1196...1197...1198...1199...1200...1201...1202...1203...1204...1205...1206...1207...1208...1209...1210...1211...1212...1213...1214...1215...1216...1217...1218...1219...1220...1221...1222...1223...1224...1225...1226...1227...1228...1229...1230...1231...1232...1233...1234...1235...1236...1237...1238...1239...1240...1241...1242...1243...1244...1245...1246...1247...1248...1249...1250...1251...1252...1253...1254...1255...1256...1257...1258...1259...1260...1261...1262...1263...1264...1265...1266...1267...1268...1269...1270...1271...1272...1273...1274...1275...1276...1277...1278...1279...1280...1281...1282...1283...1284...1285...1286...1287...1288...1289...1290...1291...1292...1293...1294...1295...1296...1297...1298...1299...1300...1301...1302...1303...1304...1305...1306...1307...1308...1309...1310...1311...1312...1313...1314...1315...1316...1317...1318...1319...1320...1321...1322...1323...1324...1325...1326...1327...1328...1329...1330...1331...1332...1333...1334...1335...1336...1337...1338...1339...1340...1341...1342...1343...1344...1345...1346...1347...1348...1349...1350...1351...1352...1353...1354...1355...1356...1357...1358...1359...1360...1361...1362...1363...1364...1365...1366...1367...1368...1369...1370...1371...1372...1373...1374...1375...1376...1377...1378...1379...1380...1381...1382...1383...1384...1385...1386...1387...1388...1389...1390...1391...1392...1393...1394...1395...1396...1397...1398...1399...1400...1401...1402...1403...1404...1405...1407...1407...1408...1409...1410...1411...1412...1413...1414...1415...1416...1417...1418...1419...1420...1421...1422...1423...1424...1425...1426...1427...1428...1429...1430...1431...1432...1433...1434...1435...1436...1437...1438...1439...1440...1441...1442...1443...1444...1445...1446...1447...1448...1449...1450...1451...1452...1453...1454...1455...1456...1457...1458...1459...1460...1461...1462...1463...1464...1465...1466...1467...1468...1469...1470...1471...1472...1473...1474...1475...1476...1477...1478...1479...1480...1481...1482...1483...1484...1485...1486...1487...1488...1489...1490...1491...1492...1493...1494...1495...1496...1497...1498...1499...1500...1501...1502...1503...1504...1505...1506...1507...1508...1509...1510...1511...1512...1513...1514...1515...1516...1517...1518...1519...1520...1521...1522...1523...1524...1525...1526...1527...1528...1529...1530...1531...1532...1533...1534...1535...1536...1537...1538...1539...1540...1541...1542...1543...1544...1545...1546...1547...1548...1549...1550...1551...1552...1553...1554...1555...1556...1557...1558...1559...1560...1561...1562...1563...1564...1565...1566...1567...1568...1569...1570...1571...1572...1573...1574...1575...1576...1577...1578...1579...1580...1581...1582...1583...1584...1585...1586...1587...1588...1589...1590...1591...1592...1593...1594...1595...1596...1597...1598...1599...1600...1601...1602...1603...1604...1605...1606...1607...1608...1609...1610...1611...1612...1613...1614...1615...1616...1617...1618...1619...1620...1621...1622...1623...1624...1625...1626...1627...1628...1629...1630...1631...1632...1633...1634...1635...1636...1637...1638...1639...1640...1641...1642...1643...1644...1645...1646...1647...1648...1649...1650...1651...1652...1653...1654...1655...1656...1657...1658...1659...1660...1661...1662...1663...1664...1665...1666...1667...1668...1669...1670...1671...1672...1673...1674...1675...1676...1677...1678...1679...1680...1681...1682...1683...1684...1685...1686...1687...1688...1689...1690...1691...1692...1693...1694...1695...1696...1697...1698...1699...1700...1701...1702...1703...1704...1705...1706...1707...1708...1709...1710...1711...1712...1713...1714...1715...1716...1717...1718...1719...1720...1721...1722...1723...1724...1725...1726...1727...1728...1729...1730...1731...1732...1733...1734...1735...1736...1737...1738...1739...1740...1741...1742...1743...1744...1745...1746...1747...1748...1749...1750...1751...1752...1753...1754...1755...1756...1757...1758...1759...1760...1761...1762...1763...1764...1765...1766...1767...1768...1769...1770...1771...1772...1773...1774...1775...1776...1777...1778...1779...1780...1781...1782...1783...1784...1785...1786...1787...1788...1789...1790...1791...1792...1793...1794...1795...1796...1797...1798...1799...1800...1801...1802...1803...1804...1805...1806...1807...1808...1809...1810...1811...1812...1813...1814...1815...1816...1817...1818...1819...1820...1821...1822...1823...1824...1825...1826...1827...1828...1829...1830...1831...1832...1833...1834...1835...1836...1837...1838...1839...1840...1841...1842...1843...1844...1845...1846...1847...1848...1849...1850...1851...1852...1853...1854...1855...1856...1857...1858...1859...1860...1861...1862...1863...1864...1865...1866...1867...1868...1869...1870...1871...1872...1873...1874...1876...1876...1877...1878...1879...1880...1881...1882...1883...1884...1885...1886...1887...1888...1889...1890...1891...1892...1893...1894...1895...1896...1897...1898...1899...1900...1901...1902...1903...1904...1905...1906...1907...1908...1909...1910...1911...1912...1913...1914...1915...1916...1917...1918...1919...1920...1921...1922...1923...1924...1925...1926...1927...1928...1929...1930...1931...1932...1933...1934...1935...1936...1937...1938...1939...1940...1941...1942...1943...1944...1945...1946...1947...1948...1949...1950...1951...1952...1953...1954...1955...1956...1957...1958...1959...1960...1961...1962...1963...1964...1965...1966...1967...1968...1969...1970...1971...1972...1973...1974...1975...1976...1977...1978...1979...1980...1981...1982...1983...1984...1985...1986...1987...1988...1989...1990...1991...1992...1993...1994...1995...1996...1997...1998...1999...2000...2001...2002...2003...2004...2005...2006...2007...2008...2009...2010...2011...2012...2013...2014...2015...2016...2017...2018...2019...2020...2021...2022...2023...2024...2025...2026...2027...2028...2029...2030...2031...2032...2033...2034...2035...2036...2037...2038...2039...2040...2041...2042...2043...2044...2045...2046...2047...2048...2049...2050...2051...2052...2053...2054...2055...2056...2057...2058...2059...2060...2061...2062...2063...2064...2065...2066...2067...2068...2069...2070...2071...2072...2073...2074...2075...2076...2077...2078...2079...2080...2081...2082...2083...2084...2085...2086...2087...2088...2089...2090...2091...2092...2093...2094...2095...2096...2097...2098...2099...2100...2101...2102...2103...2104...2105...2106...2107...2108...2109...2110...2111...2112...2113...2114...2115...2116...2117...2118...2119...2120...2121...2122...2123...2124...2125...2126...2127...2128...2129...2130...2131...2132...2133...2134...2135...2136...2137...2138...2139...2140...2141...2142...2143...2144...2145...2146...2147...2148...2149...2150...2151...2152...2153...2154...2155...2156...2157...2158...2159...2160...2161...2162...2163...2164...2165...2166...2167...2168...2169...2170...2171...2172...2173...2174...2175...2176...2177...2178...2179...2180...2181...2182...2183...2184...2185...2186...2187...2188...2189...2190...2191...2192...2193...2194...2195...2196...2197...2198...2199...2200...2201...2202...2203...2204...2205...2206...2207...2208...2209...2210...2211...2212...2213...2214...2215...2216...2217...2218...2219...2220...2221...2222...2223...2224...2225...2226...2227...2228...2229...2230...2231...2232...2233...2234...2235...2236...2237...2238...2239...2240...2241...2242...2243...2244...2245...2246...2247...2248...2249...2250...2251...2252...2253...2254...2255...2256...2257...2258...2259...2260...2261...2262...2263...2264...2265...2266...2267...2268...2269...2270...2271...2272...2273...2274...2275...2276...2277...2278...2279...2280...2281...2282...2283...2284...2285...2286...2287...2288...2289...2290...2291...2292...2293...2294...2295...2296...2297...2298...2299...2300...2301...2302...2303...2304...2305...2306...2307...2308...2309...2310...2311...2312...2313...2314...2315...2316...2317...2318...2319...2320...2321...2322...2323...2324...2325...2326...2327...2328...2329...2330...2331...2332...2333...2334...2335...2336...2337...2338...2339...2340...2341...2342...2343...2344...2345...2346...2347...2348...2349...2350...2351...2352...2353...2354...2355...2356...2357...2358...2359...2360...2361...2362...2363...2364...2365...2366...2367...2368...2369...2370...2371...2372...2373...2374...2375...2376...2377...2378...2379...2380...2381...2382...2383...2384...2385...2386...2387...2388...2389...2390...2391...2392...2393...2394...2395...2396...2397...2398...2399...2400...2401...2402...2403...2404...2405...2406...2407...2408...2409...2410...2411...2412...2413...2414...2415...2416...2417...2418...2419...2420...2421...2422...2423...2424...2425...2426...2427...2428...2429...2430...2431...2432...2433...2434...2435...2436...2437...2438...2439...2440...2441...2442...2443...2444...2445...2446...2447...2448...2449...2450...2451...2452...2453...2454...2455...2456...2457...2458...2459...2460...2461...2462...2463...2464...2465...2466...2467...2468...2469...2470...2471...2472...2473...2474...2475...2476...2477...2478...2479...2480...2481...2482...2483...2484...2485...2486...2487...2488...2489...2490...2491...2492...2493...2494...2495...2496...2497...2498...2499...2500...2501...2502...2503...2504...2505...2506...2507...2508...2509...2510...2511...2512...2513...2514...2515...2516...2517...2518...2519...2520...2521...2522...2523...2524...2525...2526...2527...2528...2529...2530...2531...2532...2533...2534...2535...2536...2537...2538...2539...2540...2541...2542...2543...2544...2545...2546...2547...2548...2549...2550...2551...2552...2553...2554...2555...2556...2557...2558...2559...2560...2561...2562...2563...2564...2565...2566...2567...2568...2569...2570...2571...2572...2573...2574...2575...2576...2577...2578...2579...2580...2581...2582...2583...2584...2585...2586...2587...2588...2589...2590...2591...2592...2593...2594...2595...2596...2597...2598...2599...2600...2601...2602...2603...2604...2605...2606...2607...2608...2609...2610...2611...2612...2613...2614...2615...2616...2617...2618...2619...2620...2621...2622...2623...2624...2625...2626...2627...2628...2629...2630...2631...2632...2633...2634...2635...2636...2637...2638...2639...2640...2641...2642...2643...2644...2645...2646...2647...2648...2649...2650...2651...2652...2653...2654...2655...2656...2657...2658...2659...2660...2661...2662...2663...2664...2665...2666...2667...2668...2669...2670...2671...2672...2673...2674...2675...2676...2677...2678...2679...2680...2681...2682...2683...2684...2685...2686...2687...2688...2689...2690...2691...2692...2693...2694...2695...2696...2697...2698...2699...2700...2701...2702...2703...2704...2705...2706...2707...2708...2709...2710...2711...2712...2713...2714...2715...2716...2717...2718...2719...2720...2721...2722...2723...2724...2725...2726...2727...2728...2729...2730...2731...2732...2733...2734...2735...2736...2737...2738...2739...2740...2741...2742...2743...2744...2745...2746...2747...2748...2749...2750...2751...2752...2753...2754...2755...2756...2757...2758...2759...2760...2761...2762...2763...2764...2765...2766...2767...2768...2769...2770...2771...2772...2773...2774...2775...2776...2777...2778...2779...2780...2781...2782...2783...2784...2785...2786...2787...2788...2789...2790...2791...2792...2793...2794...2795...2796...2797...2798...2799...2800...2801...2802...2803...2804...2805...2806...2807...2808...2809...2810...2811...2813...2813...2814...2815...2816...2817...2818...2819...2820...2821...2822...2823...2824...2825...2826...2827...2828...2829...2830...2831...2832...2833...2834...2835...2836...2837...2838...2839...2840...2841...2842...2843...2844...2845...2846...2847...2848...2849...2850...2851...2852...2853...2854...2855...2856...2857...2858...2859...2860...2861...2862...2863...2864...2865...2866...2867...2868...2869...2870...2871...2872...2873...2874...2875...2876...2877...2878...2879...2880...2881...2882...2883...2884...2885...2886...2887...2888...2889...2890...2891...2892...2893...2894...2895...2896...2897...2898...2899...2900...2901...2902...2903...2904...2905...2906...2907...2908...2909...2910...2911...2912...2913...2914...2915...2916...2917...2918...2919...2920...2921...2922...2923...2924...2925...2926...2927...2928...2929...2930...2931...2932...2933...2934...2935...2936...2937...2938...2939...2940...2941...2942...2943...2944...2945...2946...2947...2948...2949...2950...2951...2952...2953...2954...2955...2956...2957...2958...2959...2960...2961...2962...2963...2964...2965...2966...2967...2968...2969...2970...2971...2972...2973...2974...2975...2976...2977...2978...2979...2980...2981...2982...2983...2984...2985...2986...2987...2988...2989...2990...2991...2992...2993...2994...2995...2996...2997...2998...2999...3000...3001...3002...3003...3004...3005...3006...3007...3008...3009...3010...3011...3012...3013...3014...3015...3016...3017...3018...3019...3020...3021...3022...3023...3024...3025...3026...3027...3028...3029...3030...3031...3032...3033...3034...3035...3036...3037...3038...3039...3040...3041...3042...3043...3044...3045...3046...3047...3048...3049...3050...3051...3052...3053...3054...3055...3056...3057...3058...3059...3060...3061...3062...3063...3064...3065...3066...3067...3068...3069...3070...3071...3072...3073...3074...3075...3076...3077...3078...3079...3080...3081...3082...3083...3084...3085...3086...3087...3088...3089...3090...3091...3092...3093...3094...3095...3096...3097...3098...3099...3100...3101...3102...3103...3104...3105...3106...3107...3108...3109...3110...3111...3112...3113...3114...3115...3116...3117...3118...3119...3120...3121...3122...3123...3124...3125...3126...3127...3128...3129...3130...3131...3132...3133...3134...3135...3136...3137...3138...3139...3140...3141...3142...3143...3144...3145...3146...3147...3148...3149...3150...3151...3152...3153...3154...3155...3156...3157...3158...3159...3160...3161...3162...3163...3164...3165...3166...3167...3168...3169...3170...3171...3172...3173...3174...3175...3176...3177...3178...3179...3180...3181...3182...3183...3184...3185...3186...3187...3188...3189...3190...3191...3192...3193...3194...3195...3196...3197...3198...3199...3200...3201...3202...3203...3204...3205...3206...3207...3208...3209...3210...3211...3212...3213...3214...3215...3216...3217...3218...3219...3220...3221...3222...3223...3224...3225...3226...3227...3228...3229...3230...3231...3232...3233...3234...3235...3236...3237...3238...3239...3240...3241...3242...3243...3244...3245...3246...3247...3248...3249...3250...3251...3252...3253...3254...3255...3256...3257...3258...3259...3260...3261...3262...3263...3264...3265...3266...3267...3268...3269...3270...3271...3272...3273...3274...3275...3276...3277...3278...3279...3280...3282...3282...3283...3284...3285...3286...3287...3288...3289...3290...3291...3292...3293...3294...3295...3296...3297...3298...3299...3300...3301...3302...3303...3304...3305...3306...3307...3308...3309...3310...3311...3312...3313...3314...3315...3316...3317...3318...3319...3320...3321...3322...3323...3324...3325...3326...3327...3328...3329...3330...3331...3332...3333...3334...3335...3336...3337...3338...3339...3340...3341...3342...3343...3344...3345...3346...3347...3348...3349...3350...3351...3352...3353...3354...3355...3356...3357...3358...3359...3360...3361...3362...3363...3364...3365...3366...3367...3368...3369...3370...3371...3372...3373...3374...3375...3376...3377...3378...3379...3380...3381...3382...3383...3384...3385...3386...3387...3388...3389...3390...3391...3392...3393...3394...3395...3396...3397...3398...3399...3400...3401...3402...3403...3404...3405...3406...3407...3408...3409...3410...3411...3412...3413...3414...3415...3416...3417...3418...3419...3420...3421...3422...3423...3424...3425...3426...3427...3428...3429...3430...3431...3432...3433...3434...3435...3436...3437...3438...3439...3440...3441...3442...3443...3444...3445...3446...3447...3448...3449...3450...3451...3452...3453...3454...3455...3456...3457...3458...3459...3460...3461...3462...3463...3464...3465...3466...3467...3468...3469...3470...3471...3472...3473...3474...3475...3476...3477...3478...3479...3480...3481...3482...3483...3484...3485...3486...3487...3488...3489...3490...3491...3492...3493...3494...3495...3496...3497...3498...3499...3500...3501...3502...3503...3504...3505...3506...3507...3508...3509...3510...3511...3512...3513...3514...3515...3516...3517...3518...3519...3520...3521...3522...3523...3524...3525...3526...3527...3528...3529...3530...3531...3532...3533...3534...3535...3536...3537...3538...3539...3540...3541...3542...3543...3544...3545...3546...3547...3548...3549...3550...3551...3552...3553...3554...3555...3556...3557...3558...3559...3560...3561...3562...3563...3564...3565...3566...3567...3568...3569...3570...3571...3572...3573...3574...3575...3576...3577...3578...3579...3580...3581...3582...3583...3584...3585...3586...3587...3588...3589...3590...3591...3592...3593...3594...3595...3596...3597...3598...3599...3600...3601...3602...3603...3604...3605...3606...3607...3608...3609...3610...3611...3612...3613...3614...3615...3616...3617...3618...3619...3620...3621...3622...3623...3624...3625...3626...3627...3628...3629...3630...3631...3632...3633...3634...3635...3636...3637...3638...3639...3640...3641...3642...3643...3644...3645...3646...3647...3648...3649...3650...3651...3652...3653...3654...3655...3656...3657...3658...3659...3660...3661...3662...3663...3664...3665...3666...3667...3668...3669...3670...3671...3672...3673...3674...3675...3676...3677...3678...3679...3680...3681...3682...3683...3684...3685...3686...3687...3688...3689...3690...3691...3692...3693...3694...3695...3696...3697...3698...3699...3700...3701...3702...3703...3704...3705...3706...3707...3708...3709...3710...3711...3712...3713...3714...3715...3716...3717...3718...3719...3720...3721...3722...3723...3724...3725...3726...3727...3728...3729...3730...3731...3732...3733...3734...3735...3736...3737...3738...3739...3740...3741...3742...3743...3744...3745...3746...3747...3748...3749...3751...3751...3752...3753...3754...3755...3756...3757...3758...3759...3760...3761...3762...3763...3764...3765...3766...3767...3768...3769...3770...3771...3772...3773...3774...3775...3776...3777...3778...3779...3780...3781...3782...3783...3784...3785...3786...3787...3788...3789...3790...3791...3792...3793...3794...3795...3796...3797...3798...3799...3800...3801...3802...3803...3804...3805...3806...3807...3808...3809...3810...3811...3812...3813...3814...3815...3816...3817...3818...3819...3820...3821...3822...3823...3824...3825...3826...3827...3828...3829...3830...3831...3832...3833...3834...3835...3836...3837...3838...3839...3840...3841...3842...3843...3844...3845...3846...3847...3848...3849...3850...3851...3852...3853...3854...3855...3856...3857...3858...3859...3860...3861...3862...3863...3864...3865...3866...3867...3868...3869...3870...3871...3872...3873...3874...3875...3876...3877...3878...3879...3880...3881...3882...3883...3884...3885...3886...3887...3888...3889...3890...3891...3892...3893...3894...3895...3896...3897...3898...3899...3900...3901...3902...3903...3904...3905...3906...3907...3908...3909...3910...3911...3912...3913...3914...3915...3916...3917...3918...3919...3920...3921...3922...3923...3924...3925...3926...3927...3928...3929...3930...3931...3932...3933...3934...3935...3936...3937...3938...3939...3940...3941...3942...3943...3944...3945...3946...3947...3948...3949...3950...3951...3952...3953...3954...3955...3956...3957...3958...3959...3960...3961...3962...3963...3964...3965...3966...3967...3968...3969...3970...3971...3972...3973...3974...3975...3976...3977...3978...3979...3980...3981...3982...3983...3984...3985...3986...3987...3988...3989...3990...3991...3992...3993...3994...3995...3996...3997...3998...3999...4000...4001...4002...4003...4004...4005...4006...4007...4008...4009...4010...4011...4012...4013...4014...4015...4016...4017...4018...4019...4020...4021...4022...4023...4024...4025...4026...4027...4028...4029...4030...4031...4032...4033...4034...4035...4036...4037...4038...4039...4040...4041...4042...4043...4044...4045...4046...4047...4048...4049...4050...4051...4052...4053...4054...4055...4056...4057...4058...4059...4060...4061...4062...4063...4064...4065...4066...4067...4068...4069...4070...4071...4072...4073...4074...4075...4076...4077...4078...4079...4080...4081...4082...4083...4084...4085...4086...4087...4088...4089...4090...4091...4092...4093...4094...4095...4096...4097...4098...4099...4100...4101...4102...4103...4104...4105...4106...4107...4108...4109...4110...4111...4112...4113...4114...4115...4116...4117...4118...4119...4120...4121...4122...4123...4124...4125...4126...4127...4128...4129...4130...4131...4132...4133...4134...4135...4136...4137...4138...4139...4140...4141...4142...4143...4144...4145...4146...4147...4148...4149...4150...4151...4152...4153...4154...4155...4156...4157...4158...4159...4160...4161...4162...4163...4164...4165...4166...4167...4168...4169...4170...4171...4172...4173...4174...4175...4176...4177...4178...4179...4180...4181...4182...4183...4184...4185...4186...4187...4188...4189...4190...4191...4192...4193...4194...4195...4196...4197...4198...4199...4200...4201...4202...4203...4204...4205...4206...4207...4208...4209...4210...4211...4212...4213...4214...4215...4216...4217...4218...4220...4220...4221...4222...4223...4224...4225...4226...4227...4228...4229...4230...4231...4232...4233...4234...4235...4236...4237...4238...4239...4240...4241...4242...4243...4244...4245...4246...4247...4248...4249...4250...4251...4252...4253...4254...4255...4256...4257...4258...4259...4260...4261...4262...4263...4264...4265...4266...4267...4268...4269...4270...4271...4272...4273...4274...4275...4276...4277...4278...4279...4280...4281...4282...4283...4284...4285...4286...4287...4288...4289...4290...4291...4292...4293...4294...4295...4296...4297...4298...4299...4300...4301...4302...4303...4304...4305...4306...4307...4308...4309...4310...4311...4312...4313...4314...4315...4316...4317...4318...4319...4320...4321...4322...4323...4324...4325...4326...4327...4328...4329...4330...4331...4332...4333...4334...4335...4336...4337...4338...4339...4340...4341...4342...4343...4344...4345...4346...4347...4348...4349...4350...4351...4352...4353...4354...4355...4356...4357...4358...4359...4360...4361...4362...4363...4364...4365...4366...4367...4368...4369...4370...4371...4372...4373...4374...4375...4376...4377...4378...4379...4380...4381...4382...4383...4384...4385...4386...4387...4388...4389...4390...4391...4392...4393...4394...4395...4396...4397...4398...4399...4400...4401...4402...4403...4404...4405...4406...4407...4408...4409...4410...4411...4412...4413...4414...4415...4416...4417...4418...4419...4420...4421...4422...4423...4424...4425...4426...4427...4428...4429...4430...4431...4432...4433...4434...4435...4436...4437...4438...4439...4440...4441...4442...4443...4444...4445...4446...4447...4448...4449...4450...4451...4452...4453...4454...4455...4456...4457...4458...4459...4460...4461...4462...4463...4464...4465...4466...4467...4468...4469...4470...4471...4472...4473...4474...4475...4476...4477...4478...4479...4480...4481...4482...4483...4484...4485...4486...4487...4488...4489...4490...4491...4492...4493...4494...4495...4496...4497...4498...4499...4500...4501...4502...4503...4504...4505...4506...4507...4508...4509...4510...4511...4512...4513...4514...4515...4516...4517...4518...4519...4520...4521...4522...4523...4524...4525...4526...4527...4528...4529...4530...4531...4532...4533...4534...4535...4536...4537...4538...4539...4540...4541...4542...4543...4544...4545...4546...4547...4548...4549...4550...4551...4552...4553...4554...4555...4556...4557...4558...4559...4560...4561...4562...4563...4564...4565...4566...4567...4568...4569...4570...4571...4572...4573...4574...4575...4576...4577...4578...4579...4580...4581...4582...4583...4584...4585...4586...4587...4588...4589...4590...4591...4592...4593...4594...4595...4596...4597...4598...4599...4600...4601...4602...4603...4604...4605...4606...4607...4608...4609...4610...4611...4612...4613...4614...4615...4616...4617...4618...4619...4620...4621...4622...4623...4624...4625...4626...4627...4628...4629...4630...4631...4632...4633...4634...4635...4636...4637...4638...4639...4640...4641...4642...4643...4644...4645...4646...4647...4648...4649...4650...4651...4652...4653...4654...4655...4656...4657...4658...4659...4660...4661...4662...4663...4664...4665...4666...4667...4668...4669...4670...4671...4672...4673...4674...4675...4676...4677...4678...4679...4680...4681...4682...4683...4684...4685...4686...4687...4688...4689...4690...4691...4692...4693...4694...4695...4696...4697...4698...4699...4700...4701...4702...4703...4704...4705...4706...4707...4708...4709...4710...4711...4712...4713...4714...4715...4716...4717...4718...4719...4720...4721...4722...4723...4724...4725...4726...4727...4728...4729...4730...4731...4732...4733...4734...4735...4736...4737...4738...4739...4740...4741...4742...4743...4744...4745...4746...4747...4748...4749...4750...4751...4752...4753...4754...4755...4756...4757...4758...4759...4760...4761...4762...4763...4764...4765...4766...4767...4768...4769...4770...4771...4772...4773...4774...4775...4776...4777...4778...4779...4780...4781...4782...4783...4784...4785...4786...4787...4788...4789...4790...4791...4792...4793...4794...4795...4796...4797...4798...4799...4800...4801...4802...4803...4804...4805...4806...4807...4808...4809...4810...4811...4812...4813...4814...4815...4816...4817...4818...4819...4820...4821...4822...4823...4824...4825...4826...4827...4828...4829...4830...4831...4832...4833...4834...4835...4836...4837...4838...4839...4840...4841...4842...4843...4844...4845...4846...4847...4848...4849...4850...4851...4852...4853...4854...4855...4856...4857...4858...4859...4860...4861...4862...4863...4864...4865...4866...4867...4868...4869...4870...4871...4872...4873...4874...4875...4876...4877...4878...4879...4880...4881...4882...4883...4884...4885...4886...4887...4888...4889...4890...4891...4892...4893...4894...4895...4896...4897...4898...4899...4900...4901...4902...4903...4904...4905...4906...4907...4908...4909...4910...4911...4912...4913...4914...4915...4916...4917...4918...4919...4920...4921...4922...4923...4924...4925...4926...4927...4928...4929...4930...4931...4932...4933...4934...4935...4936...4937...4938...4939...4940...4941...4942...4943...4944...4945...4946...4947...4948...4949...4950...4951...4952...4953...4954...4955...4956...4957...4958...4959...4960...4961...4962...4963...4964...4965...4966...4967...4968...4969...4970...4971...4972...4973...4974...4975...4976...4977...4978...4979...4980...4981...4982...4983...4984...4985...4986...4987...4988...4989...4990...4991...4992...4993...4994...4995...4996...4997...4998...4999...5000...5001...5002...5003...5004...5005...5006...5007...5008...5009...5010...5011...5012...5013...5014...5015...5016...5017...5018...5019...5020...5021...5022...5023...5024...5025...5026...5027...5028...5029...5030...5031...5032...5033...5034...5035...5036...5037...5038...5039...5040...5041...5042...5043...5044...5045...5046...5047...5048...5049...5050...5051...5052...5053...5054...5055...5056...5057...5058...5059...5060...5061...5062...5063...5064...5065...5066...5067...5068...5069...5070...5071...5072...5073...5074...5075...5076...5077...5078...5079...5080...5081...5082...5083...5084...5085...5086...5087...5088...5089...5090...5091...5092...5093...5094...5095...5096...5097...5098...5099...5100...5101...5102...5103...5104...5105...5106...5107...5108...5109...5110...5111...5112...5113...5114...5115...5116...5117...5118...5119...5120...5121...5122...5123...5124...5125...5126...5127...5128...5129...5130...5131...5132...5133...5134...5135...5136...5137...5138...5139...5140...5141...5142...5143...5144...5145...5146...5147...5148...5149...5150...5151...5152...5153...5154...5155...5157...5157...5158...5159...5160...5161...5162...5163...5164...5165...5166...5167...5168...5169...5170...5171...5172...5173...5174...5175...5176...5177...5178...5179...5180...5181...5182...5183...5184...5185...5186...5187...5188...5189...5190...5191...5192...5193...5194...5195...5196...5197...5198...5199...5200...5201...5202...5203...5204...5205...5206...5207...5208...5209...5210...5211...5212...5213...5214...5215...5216...5217...5218...5219...5220...5221...5222...5223...5224...5225...5226...5227...5228...5229...5230...5231...5232...5233...5234...5235...5236...5237...5238...5239...5240...5241...5242...5243...5244...5245...5246...5247...5248...5249...5250...5251...5252...5253...5254...5255...5256...5257...5258...5259...5260...5261...5262...5263...5264...5265...5266...5267...5268...5269...5270...5271...5272...5273...5274...5275...5276...5277...5278...5279...5280...5281...5282...5283...5284...5285...5286...5287...5288...5289...5290...5291...5292...5293...5294...5295...5296...5297...5298...5299...5300...5301...5302...5303...5304...5305...5306...5307...5308...5309...5310...5311...5312...5313...5314...5315...5316...5317...5318...5319...5320...5321...5322...5323...5324...5325...5326...5327...5328...5329...5330...5331...5332...5333...5334...5335...5336...5337...5338...5339...5340...5341...5342...5343...5344...5345...5346...5347...5348...5349...5350...5351...5352...5353...5354...5355...5356...5357...5358...5359...5360...5361...5362...5363...5364...5365...5366...5367...5368...5369...5370...5371...5372...5373...5374...5375...5376...5377...5378...5379...5380...5381...5382...5383...5384...5385...5386...5387...5388...5389...5390...5391...5392...5393...5394...5395...5396...5397...5398...5399...5400...5401...5402...5403...5404...5405...5406...5407...5408...5409...5410...5411...5412...5413...5414...5415...5416...5417...5418...5419...5420...5421...5422...5423...5424...5425...5426...5427...5428...5429...5430...5431...5432...5433...5434...5435...5436...5437...5438...5439...5440...5441...5442...5443...5444...5445...5446...5447...5448...5449...5450...5451...5452...5453...5454...5455...5456...5457...5458...5459...5460...5461...5462...5463...5464...5465...5466...5467...5468...5469...5470...5471...5472...5473...5474...5475...5476...5477...5478...5479...5480...5481...5482...5483...5484...5485...5486...5487...5488...5489...5490...5491...5492...5493...5494...5495...5496...5497...5498...5499...5500...5501...5502...5503...5504...5505...5506...5507...5508...5509...5510...5511...5512...5513...5514...5515...5516...5517...5518...5519...5520...5521...5522...5523...5524...5525...5526...5527...5528...5529...5530...5531...5532...5533...5534...5535...5536...5537...5538...5539...5540...5541...5542...5543...5544...5545...5546...5547...5548...5549...5550...5551...5552...5553...5554...5555...5556...5557...5558...5559...5560...5561...5562...5563...5564...5565...5566...5567...5568...5569...5570...5571...5572...5573...5574...5575...5576...5577...5578...5579...5580...5581...5582...5583...5584...5585...5586...5587...5588...5589...5590...5591...5592...5593...5594...5595...5596...5597...5598...5599...5600...5601...5602...5603...5604...5605...5606...5607...5608...5609...5610...5611...5612...5613...5614...5615...5616...5617...5618...5619...5620...5621...5622...5623...5624...5626...5626...5627...5628...5629...5630...5631...5632...5633...5634...5635...5636...5637...5638...5639...5640...5641...5642...5643...5644...5645...5646...5647...5648...5649...5650...5651...5652...5653...5654...5655...5656...5657...5658...5659...5660...5661...5662...5663...5664...5665...5666...5667...5668...5669...5670...5671...5672...5673...5674...5675...5676...5677...5678...5679...5680...5681...5682...5683...5684...5685...5686...5687...5688...5689...5690...5691...5692...5693...5694...5695...5696...5697...5698...5699...5700...5701...5702...5703...5704...5705...5706...5707...5708...5709...5710...5711...5712...5713...5714...5715...5716...5717...5718...5719...5720...5721...5722...5723...5724...5725...5726...5727...5728...5729...5730...5731...5732...5733...5734...5735...5736...5737...5738...5739...5740...5741...5742...5743...5744...5745...5746...5747...5748...5749...5750...5751...5752...5753...5754...5755...5756...5757...5758...5759...5760...5761...5762...5763...5764...5765...5766...5767...5768...5769...5770...5771...5772...5773...5774...5775...5776...5777...5778...5779...5780...5781...5782...5783...5784...5785...5786...5787...5788...5789...5790...5791...5792...5793...5794...5795...5796...5797...5798...5799...5800...5801...5802...5803...5804...5805...5806...5807...5808...5809...5810...5811...5812...5813...5814...5815...5816...5817...5818...5819...5820...5821...5822...5823...5824...5825...5826...5827...5828...5829...5830...5831...5832...5833...5834...5835...5836...5837...5838...5839...5840...5841...5842...5843...5844...5845...5846...5847...5848...5849...5850...5851...5852...5853...5854...5855...5856...5857...5858...5859...5860...5861...5862...5863...5864...5865...5866...5867...5868...5869...5870...5871...5872...5873...5874...5875...5876...5877...5878...5879...5880...5881...5882...5883...5884...5885...5886...5887...5888...5889...5890...5891...5892...5893...5894...5895...5896...5897...5898...5899...5900...5901...5902...5903...5904...5905...5906...5907...5908...5909...5910...5911...5912...5913...5914...5915...5916...5917...5918...5919...5920...5921...5922...5923...5924...5925...5926...5927...5928...5929...5930...5931...5932...5933...5934...5935...5936...5937...5938...5939...5940...5941...5942...5943...5944...5945...5946...5947...5948...5949...5950...5951...5952...5953...5954...5955...5956...5957...5958...5959...5960...5961...5962...5963...5964...5965...5966...5967...5968...5969...5970...5971...5972...5973...5974...5975...5976...5977...5978...5979...5980...5981...5982...5983...5984...5985...5986...5987...5988...5989...5990...5991...5992...5993...5994...5995...5996...5997...5998...5999...6000...6001...6002...6003...6004...6005...6006...6007...6008...6009...6010...6011...6012...6013...6014...6015...6016...6017...6018...6019...6020...6021...6022...6023...6024...6025...6026...6027...6028...6029...6030...6031...6032...6033...6034...6035...6036...6037...6038...6039...6040...6041...6042...6043...6044...6045...6046...6047...6048...6049...6050...6051...6052...6053...6054...6055...6056...6057...6058...6059...6060...6061...6062...6063...6064...6065...6066...6067...6068...6069...6070...6071...6072...6073...6074...6075...6076...6077...6078...6079...6080...6081...6082...6083...6084...6085...6086...6087...6088...6089...6090...6091...6092...6093...6095...6095...6096...6097...6098...6099...6100...6101...6102...6103...6104...6105...6106...6107...6108...6109...6110...6111...6112...6113...6114...6115...6116...6117...6118...6119...6120...6121...6122...6123...6124...6125...6126...6127...6128...6129...6130...6131...6132...6133...6134...6135...6136...6137...6138...6139...6140...6141...6142...6143...6144...6145...6146...6147...6148...6149...6150...6151...6152...6153...6154...6155...6156...6157...6158...6159...6160...6161...6162...6163...6164...6165...6166...6167...6168...6169...6170...6171...6172...6173...6174...6175...6176...6177...6178...6179...6180...6181...6182...6183...6184...6185...6186...6187...6188...6189...6190...6191...6192...6193...6194...6195...6196...6197...6198...6199...6200...6201...6202...6203...6204...6205...6206...6207...6208...6209...6210...6211...6212...6213...6214...6215...6216...6217...6218...6219...6220...6221...6222...6223...6224...6225...6226...6227...6228...6229...6230...6231...6232...6233...6234...6235...6236...6237...6238...6239...6240...6241...6242...6243...6244...6245...6246...6247...6248...6249...6250...6251...6252...6253...6254...6255...6256...6257...6258...6259...6260...6261...6262...6263...6264...6265...6266...6267...6268...6269...6270...6271...6272...6273...6274...6275...6276...6277...6278...6279...6280...6281...6282...6283...6284...6285...6286...6287...6288...6289...6290...6291...6292...6293...6294...6295...6296...6297...6298...6299...6300...6301...6302...6303...6304...6305...6306...6307...6308...6309...6310...6311...6312...6313...6314...6315...6316...6317...6318...6319...6320...6321...6322...6323...6324...6325...6326...6327...6328...6329...6330...6331...6332...6333...6334...6335...6336...6337...6338...6339...6340...6341...6342...6343...6344...6345...6346...6347...6348...6349...6350...6351...6352...6353...6354...6355...6356...6357...6358...6359...6360...6361...6362...6363...6364...6365...6366...6367...6368...6369...6370...6371...6372...6373...6374...6375...6376...6377...6378...6379...6380...6381...6382...6383...6384...6385...6386...6387...6388...6389...6390...6391...6392...6393...6394...6395...6396...6397...6398...6399...6400...6401...6402...6403...6404...6405...6406...6407...6408...6409...6410...6411...6412...6413...6414...6415...6416...6417...6418...6419...6420...6421...6422...6423...6424...6425...6426...6427...6428...6429...6430...6431...6432...6433...6434...6435...6436...6437...6438...6439...6440...6441...6442...6443...6444...6445...6446...6447...6448...6449...6450...6451...6452...6453...6454...6455...6456...6457...6458...6459...6460...6461...6462...6463...6464...6465...6466...6467...6468...6469...6470...6471...6472...6473...6474...6475...6476...6477...6478...6479...6480...6481...6482...6483...6484...6485...6486...6487...6488...6489...6490...6491...6492...6493...6494...6495...6496...6497...6498...6499...6500...6501...6502...6503...6504...6505...6506...6507...6508...6509...6510...6511...6512...6513...6514...6515...6516...6517...6518...6519...6520...6521...6522...6523...6524...6525...6526...6527...6528...6529...6530...6531...6532...6533...6534...6535...6536...6537...6538...6539...6540...6541...6542...6543...6544...6545...6546...6547...6548...6549...6550...6551...6552...6553...6554...6555...6556...6557...6558...6559...6560...6561...6562...6564...6564...6565...6566...6567...6568...6569...6570...6571...6572...6573...6574...6575...6576...6577...6578...6579...6580...6581...6582...6583...6584...6585...6586...6587...6588...6589...6590...6591...6592...6593...6594...6595...6596...6597...6598...6599...6600...6601...6602...6603...6604...6605...6606...6607...6608...6609...6610...6611...6612...6613...6614...6615...6616...6617...6618...6619...6620...6621...6622...6623...6624...6625...6626...6627...6628...6629...6630...6631...6632...6633...6634...6635...6636...6637...6638...6639...6640...6641...6642...6643...6644...6645...6646...6647...6648...6649...6650...6651...6652...6653...6654...6655...6656...6657...6658...6659...6660...6661...6662...6663...6664...6665...6666...6667...6668...6669...6670...6671...6672...6673...6674...6675...6676...6677...6678...6679...6680...6681...6682...6683...6684...6685...6686...6687...6688...6689...6690...6691...6692...6693...6694...6695...6696...6697...6698...6699...6700...6701...6702...6703...6704...6705...6706...6707...6708...6709...6710...6711...6712...6713...6714...6715...6716...6717...6718...6719...6720...6721...6722...6723...6724...6725...6726...6727...6728...6729...6730...6731...6732...6733...6734...6735...6736...6737...6738...6739...6740...6741...6742...6743...6744...6745...6746...6747...6748...6749...6750...6751...6752...6753...6754...6755...6756...6757...6758...6759...6760...6761...6762...6763...6764...6765...6766...6767...6768...6769...6770...6771...6772...6773...6774...6775...6776...6777...6778...6779...6780...6781...6782...6783...6784...6785...6786...6787...6788...6789...6790...6791...6792...6793...6794...6795...6796...6797...6798...6799...6800...6801...6802...6803...6804...6805...6806...6807...6808...6809...6810...6811...6812...6813...6814...6815...6816...6817...6818...6819...6820...6821...6822...6823...6824...6825...6826...6827...6828...6829...6830...6831...6832...6833...6834...6835...6836...6837...6838...6839...6840...6841...6842...6843...6844...6845...6846...6847...6848...6849...6850...6851...6852...6853...6854...6855...6856...6857...6858...6859...6860...6861...6862...6863...6864...6865...6866...6867...6868...6869...6870...6871...6872...6873...6874...6875...6876...6877...6878...6879...6880...6881...6882...6883...6884...6885...6886...6887...6888...6889...6890...6891...6892...6893...6894...6895...6896...6897...6898...6899...6900...6901...6902...6903...6904...6905...6906...6907...6908...6909...6910...6911...6912...6913...6914...6915...6916...6917...6918...6919...6920...6921...6922...6923...6924...6925...6926...6927...6928...6929...6930...6931...6932...6933...6934...6935...6936...6937...6938...6939...6940...6941...6942...6943...6944...6945...6946...6947...6948...6949...6950...6951...6952...6953...6954...6955...6956...6957...6958...6959...6960...6961...6962...6963...6964...6965...6966...6967...6968...6969...6970...6971...6972...6973...6974...6975...6976...6977...6978...6979...6980...6981...6982...6983...6984...6985...6986...6987...6988...6989...6990...6991...6992...6993...6994...6995...6996...6997...6998...6999...7000...7001...7002...7003...7004...7005...7006...7007...7008...7009...7010...7011...7012...7013...7014...7015...7016...7017...7018...7019...7020...7021...7022...7023...7024...7025...7026...7027...7028...7029...7030...7031...7032...7033...7034...7035...7036...7037...7038...7039...7040...7041...7042...7043...7044...7045...7046...7047...7048...7049...7050...7051...7052...7053...7054...7055...7056...7057...7058...7059...7060...7061...7062...7063...7064...7065...7066...7067...7068...7069...7070...7071...7072...7073...7074...7075...7076...7077...7078...7079...7080...7081...7082...7083...7084...7085...7086...7087...7088...7089...7090...7091...7092...7093...7094...7095...7096...7097...7098...7099...7100...7101...7102...7103...7104...7105...7106...7107...7108...7109...7110...7111...7112...7113...7114...7115...7116...7117...7118...7119...7120...7121...7122...7123...7124...7125...7126...7127...7128...7129...7130...7131...7132...7133...7134...7135...7136...7137...7138...7139...7140...7141...7142...7143...7144...7145...7146...7147...7148...7149...7150...7151...7152...7153...7154...7155...7156...7157...7158...7159...7160...7161...7162...7163...7164...7165...7166...7167...7168...7169...7170...7171...7172...7173...7174...7175...7176...7177...7178...7179...7180...7181...7182...7183...7184...7185...7186...7187...7188...7189...7190...7191...7192...7193...7194...7195...7196...7197...7198...7199...7200...7201...7202...7203...7204...7205...7206...7207...7208...7209...7210...7211...7212...7213...7214...7215...7216...7217...7218...7219...7220...7221...7222...7223...7224...7225...7226...7227...7228...7229...7230...7231...7232...7233...7234...7235...7236...7237...7238...7239...7240...7241...7242...7243...7244...7245...7246...7247...7248...7249...7250...7251...7252...7253...7254...7255...7256...7257...7258...7259...7260...7261...7262...7263...7264...7265...7266...7267...7268...7269...7270...7271...7272...7273...7274...7275...7276...7277...7278...7279...7280...7281...7282...7283...7284...7285...7286...7287...7288...7289...7290...7291...7292...7293...7294...7295...7296...7297...7298...7299...7300...7301...7302...7303...7304...7305...7306...7307...7308...7309...7310...7311...7312...7313...7314...7315...7316...7317...7318...7319...7320...7321...7322...7323...7324...7325...7326...7327...7328...7329...7330...7331...7332...7333...7334...7335...7336...7337...7338...7339...7340...7341...7342...7343...7344...7345...7346...7347...7348...7349...7350...7351...7352...7353...7354...7355...7356...7357...7358...7359...7360...7361...7362...7363...7364...7365...7366...7367...7368...7369...7370...7371...7372...7373...7374...7375...7376...7377...7378...7379...7380...7381...7382...7383...7384...7385...7386...7387...7388...7389...7390...7391...7392...7393...7394...7395...7396...7397...7398...7399...7400...7401...7402...7403...7404...7405...7406...7407...7408...7409...7410...7411...7412...7413...7414...7415...7416...7417...7418...7419...7420...7421...7422...7423...7424...7425...7426...7427...7428...7429...7430...7431...7432...7433...7434...7435...7436...7437...7438...7439...7440...7441...7442...7443...7444...7445...7446...7447...7448...7449...7450...7451...7452...7453...7454...7455...7456...7457...7458...7459...7460...7461...7462...7463...7464...7465...7466...7467...7468...7469...7470...7471...7472...7473...7474...7475...7476...7477...7478...7479...7480...7481...7482...7483...7484...7485...7486...7487...7488...7489...7490...7491...7492...7493...7494...7495...7496...7497...7498...7499...7501...7501...7502...7503...7504...7505...7506...7507...7508...7509...7510...7511...7512...7513...7514...7515...7516...7517...7518...7519...7520...7521...7522...7523...7524...7525...7526...7527...7528...7529...7530...7531...7532...7533...7534...7535...7536...7537...7538...7539...7540...7541...7542...7543...7544...7545...7546...7547...7548...7549...7550...7551...7552...7553...7554...7555...7556...7557...7558...7559...7560...7561...7562...7563...7564...7565...7566...7567...7568...7569...7570...7571...7572...7573...7574...7575...7576...7577...7578...7579...7580...7581...7582...7583...7584...7585...7586...7587...7588...7589...7590...7591...7592...7593...7594...7595...7596...7597...7598...7599...7600...7601...7602...7603...7604...7605...7606...7607...7608...7609...7610...7611...7612...7613...7614...7615...7616...7617...7618...7619...7620...7621...7622...7623...7624...7625...7626...7627...7628...7629...7630...7631...7632...7633...7634...7635...7636...7637...7638...7639...7640...7641...7642...7643...7644...7645...7646...7647...7648...7649...7650...7651...7652...7653...7654...7655...7656...7657...7658...7659...7660...7661...7662...7663...7664...7665...7666...7667...7668...7669...7670...7671...7672...7673...7674...7675...7676...7677...7678...7679...7680...7681...7682...7683...7684...7685...7686...7687...7688...7689...7690...7691...7692...7693...7694...7695...7696...7697...7698...7699...7700...7701...7702...7703...7704...7705...7706...7707...7708...7709...7710...7711...7712...7713...7714...7715...7716...7717...7718...7719...7720...7721...7722...7723...7724...7725...7726...7727...7728...7729...7730...7731...7732...7733...7734...7735...7736...7737...7738...7739...7740...7741...7742...7743...7744...7745...7746...7747...7748...7749...7750...7751...7752...7753...7754...7755...7756...7757...7758...7759...7760...7761...7762...7763...7764...7765...7766...7767...7768...7769...7770...7771...7772...7773...7774...7775...7776...7777...7778...7779...7780...7781...7782...7783...7784...7785...7786...7787...7788...7789...7790...7791...7792...7793...7794...7795...7796...7797...7798...7799...7800...7801...7802...7803...7804...7805...7806...7807...7808...7809...7810...7811...7812...7813...7814...7815...7816...7817...7818...7819...7820...7821...7822...7823...7824...7825...7826...7827...7828...7829...7830...7831...7832...7833...7834...7835...7836...7837...7838...7839...7840...7841...7842...7843...7844...7845...7846...7847...7848...7849...7850...7851...7852...7853...7854...7855...7856...7857...7858...7859...7860...7861...7862...7863...7864...7865...7866...7867...7868...7869...7870...7871...7872...7873...7874...7875...7876...7877...7878...7879...7880...7881...7882...7883...7884...7885...7886...7887...7888...7889...7890...7891...7892...7893...7894...7895...7896...7897...7898...7899...7900...7901...7902...7903...7904...7905...7906...7907...7908...7909...7910...7911...7912...7913...7914...7915...7916...7917...7918...7919...7920...7921...7922...7923...7924...7925...7926...7927...7928...7929...7930...7931...7932...7933...7934...7935...7936...7937...7938...7939...7940...7941...7942...7943...7944...7945...7946...7947...7948...7949...7950...7951...7952...7953...7954...7955...7956...7957...7958...7959...7960...7961...7962...7963...7964...7965...7966...7967...7968...7970...7970...7971...7972...7973...7974...7975...7976...7977...7978...7979...7980...7981...7982...7983...7984...7985...7986...7987...7988...7989...7990...7991...7992...7993...7994...7995...7996...7997...7998...7999...8000...8001...8002...8003...8004...8005...8006...8007...8008...8009...8010...8011...8012...8013...8014...8015...8016...8017...8018...8019...8020...8021...8022...8023...8024...8025...8026...8027...8028...8029...8030...8031...8032...8033...8034...8035...8036...8037...8038...8039...8040...8041...8042...8043...8044...8045...8046...8047...8048...8049...8050...8051...8052...8053...8054...8055...8056...8057...8058...8059...8060...8061...8062...8063...8064...8065...8066...8067...8068...8069...8070...8071...8072...8073...8074...8075...8076...8077...8078...8079...8080...8081...8082...8083...8084...8085...8086...8087...8088...8089...8090...8091...8092...8093...8094...8095...8096...8097...8098...8099...8100...8101...8102...8103...8104...8105...8106...8107...8108...8109...8110...8111...8112...8113...8114...8115...8116...8117...8118...8119...8120...8121...8122...8123...8124...8125...8126...8127...8128...8129...8130...8131...8132...8133...8134...8135...8136...8137...8138...8139...8140...8141...8142...8143...8144...8145...8146...8147...8148...8149...8150...8151...8152...8153...8154...8155...8156...8157...8158...8159...8160...8161...8162...8163...8164...8165...8166...8167...8168...8169...8170...8171...8172...8173...8174...8175...8176...8177...8178...8179...8180...8181...8182...8183...8184...8185...8186...8187...8188...8189...8190...8191...8192...8193...8194...8195...8196...8197...8198...8199...8200...8201...8202...8203...8204...8205...8206...8207...8208...8209...8210...8211...8212...8213...8214...8215...8216...8217...8218...8219...8220...8221...8222...8223...8224...8225...8226...8227...8228...8229...8230...8231...8232...8233...8234...8235...8236...8237...8238...8239...8240...8241...8242...8243...8244...8245...8246...8247...8248...8249...8250...8251...8252...8253...8254...8255...8256...8257...8258...8259...8260...8261...8262...8263...8264...8265...8266...8267...8268...8269...8270...8271...8272...8273...8274...8275...8276...8277...8278...8279...8280...8281...8282...8283...8284...8285...8286...8287...8288...8289...8290...8291...8292...8293...8294...8295...8296...8297...8298...8299...8300...8301...8302...8303...8304...8305...8306...8307...8308...8309...8310...8311...8312...8313...8314...8315...8316...8317...8318...8319...8320...8321...8322...8323...8324...8325...8326...8327...8328...8329...8330...8331...8332...8333...8334...8335...8336...8337...8338...8339...8340...8341...8342...8343...8344...8345...8346...8347...8348...8349...8350...8351...8352...8353...8354...8355...8356...8357...8358...8359...8360...8361...8362...8363...8364...8365...8366...8367...8368...8369...8370...8371...8372...8373...8374...8375...8376...8377...8378...8379...8380...8381...8382...8383...8384...8385...8386...8387...8388...8389...8390...8391...8392...8393...8394...8395...8396...8397...8398...8399...8400...8401...8402...8403...8404...8405...8406...8407...8408...8409...8410...8411...8412...8413...8414...8415...8416...8417...8418...8419...8420...8421...8422...8423...8424...8425...8426...8427...8428...8429...8430...8431...8432...8433...8434...8435...8436...8437...8439...8439...8440...8441...8442...8443...8444...8445...8446...8447...8448...8449...8450...8451...8452...8453...8454...8455...8456...8457...8458...8459...8460...8461...8462...8463...8464...8465...8466...8467...8468...8469...8470...8471...8472...8473...8474...8475...8476...8477...8478...8479...8480...8481...8482...8483...8484...8485...8486...8487...8488...8489...8490...8491...8492...8493...8494...8495...8496...8497...8498...8499...8500...8501...8502...8503...8504...8505...8506...8507...8508...8509...8510...8511...8512...8513...8514...8515...8516...8517...8518...8519...8520...8521...8522...8523...8524...8525...8526...8527...8528...8529...8530...8531...8532...8533...8534...8535...8536...8537...8538...8539...8540...8541...8542...8543...8544...8545...8546...8547...8548...8549...8550...8551...8552...8553...8554...8555...8556...8557...8558...8559...8560...8561...8562...8563...8564...8565...8566...8567...8568...8569...8570...8571...8572...8573...8574...8575...8576...8577...8578...8579...8580...8581...8582...8583...8584...8585...8586...8587...8588...8589...8590...8591...8592...8593...8594...8595...8596...8597...8598...8599...8600...8601...8602...8603...8604...8605...8606...8607...8608...8609...8610...8611...8612...8613...8614...8615...8616...8617...8618...8619...8620...8621...8622...8623...8624...8625...8626...8627...8628...8629...8630...8631...8632...8633...8634...8635...8636...8637...8638...8639...8640...8641...8642...8643...8644...8645...8646...8647...8648...8649...8650...8651...8652...8653...8654...8655...8656...8657...8658...8659...8660...8661...8662...8663...8664...8665...8666...8667...8668...8669...8670...8671...8672...8673...8674...8675...8676...8677...8678...8679...8680...8681...8682...8683...8684...8685...8686...8687...8688...8689...8690...8691...8692...8693...8694...8695...8696...8697...8698...8699...8700...8701...8702...8703...8704...8705...8706...8707...8708...8709...8710...8711...8712...8713...8714...8715...8716...8717...8718...8719...8720...8721...8722...8723...8724...8725...8726...8727...8728...8729...8730...8731...8732...8733...8734...8735...8736...8737...8738...8739...8740...8741...8742...8743...8744...8745...8746...8747...8748...8749...8750...8751...8752...8753...8754...8755...8756...8757...8758...8759...8760...8761...8762...8763...8764...8765...8766...8767...8768...8769...8770...8771...8772...8773...8774...8775...8776...8777...8778...8779...8780...8781...8782...8783...8784...8785...8786...8787...8788...8789...8790...8791...8792...8793...8794...8795...8796...8797...8798...8799...8800...8801...8802...8803...8804...8805...8806...8807...8808...8809...8810...8811...8812...8813...8814...8815...8816...8817...8818...8819...8820...8821...8822...8823...8824...8825...8826...8827...8828...8829...8830...8831...8832...8833...8834...8835...8836...8837...8838...8839...8840...8841...8842...8843...8844...8845...8846...8847...8848...8849...8850...8851...8852...8853...8854...8855...8856...8857...8858...8859...8860...8861...8862...8863...8864...8865...8866...8867...8868...8869...8870...8871...8872...8873...8874...8875...8876...8877...8878...8879...8880...8881...8882...8883...8884...8885...8886...8887...8888...8889...8890...8891...8892...8893...8894...8895...8896...8897...8898...8899...8900...8901...8902...8903...8904...8905...8906...8908...8908...8909...8910...8911...8912...8913...8914...8915...8916...8917...8918...8919...8920...8921...8922...8923...8924...8925...8926...8927...8928...8929...8930...8931...8932...8933...8934...8935...8936...8937...8938...8939...8940...8941...8942...8943...8944...8945...8946...8947...8948...8949...8950...8951...8952...8953...8954...8955...8956...8957...8958...8959...8960...8961...8962...8963...8964...8965...8966...8967...8968...8969...8970...8971...8972...8973...8974...8975...8976...8977...8978...8979...8980...8981...8982...8983...8984...8985...8986...8987...8988...8989...8990...8991...8992...8993...8994...8995...8996...8997...8998...8999...9000...9001...9002...9003...9004...9005...9006...9007...9008...9009...9010...9011...9012...9013...9014...9015...9016...9017...9018...9019...9020...9021...9022...9023...9024...9025...9026...9027...9028...9029...9030...9031...9032...9033...9034...9035...9036...9037...9038...9039...9040...9041...9042...9043...9044...9045...9046...9047...9048...9049...9050...9051...9052...9053...9054...9055...9056...9057...9058...9059...9060...9061...9062...9063...9064...9065...9066...9067...9068...9069...9070...9071...9072...9073...9074...9075...9076...9077...9078...9079...9080...9081...9082...9083...9084...9085...9086...9087...9088...9089...9090...9091...9092...9093...9094...9095...9096...9097...9098...9099...9100...9101...9102...9103...9104...9105...9106...9107...9108...9109...9110...9111...9112...9113...9114...9115...9116...9117...9118...9119...9120...9121...9122...9123...9124...9125...9126...9127...9128...9129...9130...9131...9132...9133...9134...9135...9136...9137...9138...9139...9140...9141...9142...9143...9144...9145...9146...9147...9148...9149...9150...9151...9152...9153...9154...9155...9156...9157...9158...9159...9160...9161...9162...9163...9164...9165...9166...9167...9168...9169...9170...9171...9172...9173...9174...9175...9176...9177...9178...9179...9180...9181...9182...9183...9184...9185...9186...9187...9188...9189...9190...9191...9192...9193...9194...9195...9196...9197...9198...9199...9200...9201...9202...9203...9204...9205...9206...9207...9208...9209...9210...9211...9212...9213...9214...9215...9216...9217...9218...9219...9220...9221...9222...9223...9224...9225...9226...9227...9228...9229...9230...9231...9232...9233...9234...9235...9236...9237...9238...9239...9240...9241...9242...9243...9244...9245...9246...9247...9248...9249...9250...9251...9252...9253...9254...9255...9256...9257...9258...9259...9260...9261...9262...9263...9264...9265...9266...9267...9268...9269...9270...9271...9272...9273...9274...9275...9276...9277...9278...9279...9280...9281...9282...9283...9284...9285...9286...9287...9288...9289...9290...9291...9292...9293...9294...9295...9296...9297...9298...9299...9300...9301...9302...9303...9304...9305...9306...9307...9308...9309...9310...9311...9312...9313...9314...9315...9316...9317...9318...9319...9320...9321...9322...9323...9324...9325...9326...9327...9328...9329...9330...9331...9332...9333...9334...9335...9336...9337...9338...9339...9340...9341...9342...9343...9344...9345...9346...9347...9348...9349...9350...9351...9352...9353...9354...9355...9356...9357...9358...9359...9360...9361...9362...9363...9364...9365...9366...9367...9368...9369...9370...9371...9372...9373...9374...9375...9376...9377...9378...9379...9380...9381...9382...9383...9384...9385...9386...9387...9388...9389...9390...9391...9392...9393...9394...9395...9396...9397...9398...9399...9400...9401...9402...9403...9404...9405...9406...9407...9408...9409...9410...9411...9412...9413...9414...9415...9416...9417...9418...9419...9420...9421...9422...9423...9424...9425...9426...9427...9428...9429...9430...9431...9432...9433...9434...9435...9436...9437...9438...9439...9440...9441...9442...9443...9444...9445...9446...9447...9448...9449...9450...9451...9452...9453...9454...9455...9456...9457...9458...9459...9460...9461...9462...9463...9464...9465...9466...9467...9468...9469...9470...9471...9472...9473...9474...9475...9476...9477...9478...9479...9480...9481...9482...9483...9484...9485...9486...9487...9488...9489...9490...9491...9492...9493...9494...9495...9496...9497...9498...9499...9500...9501...9502...9503...9504...9505...9506...9507...9508...9509...9510...9511...9512...9513...9514...9515...9516...9517...9518...9519...9520...9521...9522...9523...9524...9525...9526...9527...9528...9529...9530...9531...9532...9533...9534...9535...9536...9537...9538...9539...9540...9541...9542...9543...9544...9545...9546...9547...9548...9549...9550...9551...9552...9553...9554...9555...9556...9557...9558...9559...9560...9561...9562...9563...9564...9565...9566...9567...9568...9569...9570...9571...9572...9573...9574...9575...9576...9577...9578...9579...9580...9581...9582...9583...9584...9585...9586...9587...9588...9589...9590...9591...9592...9593...9594...9595...9596...9597...9598...9599...9600...9601...9602...9603...9604...9605...9606...9607...9608...9609...9610...9611...9612...9613...9614...9615...9616...9617...9618...9619...9620...9621...9622...9623...9624...9625...9626...9627...9628...9629...9630...9631...9632...9633...9634...9635...9636...9637...9638...9639...9640...9641...9642...9643...9644...9645...9646...9647...9648...9649...9650...9651...9652...9653...9654...9655...9656...9657...9658...9659...9660...9661...9662...9663...9664...9665...9666...9667...9668...9669...9670...9671...9672...9673...9674...9675...9676...9677...9678...9679...9680...9681...9682...9683...9684...9685...9686...9687...9688...9689...9690...9691...9692...9693...9694...9695...9696...9697...9698...9699...9700...9701...9702...9703...9704...9705...9706...9707...9708...9709...9710...9711...9712...9713...9714...9715...9716...9717...9718...9719...9720...9721...9722...9723...9724...9725...9726...9727...9728...9729...9730...9731...9732...9733...9734...9735...9736...9737...9738...9739...9740...9741...9742...9743...9744...9745...9746...9747...9748...9749...9750...9751...9752...9753...9754...9755...9756...9757...9758...9759...9760...9761...9762...9763...9764...9765...9766...9767...9768...9769...9770...9771...9772...9773...9774...9775...9776...9777...9778...9779...9780...9781...9782...9783...9784...9785...9786...9787...9788...9789...9790...9791...9792...9793...9794...9795...9796...9797...9798...9799...9800...9801...9802...9803...9804...9805...9806...9807...9808...9809...9810...9811...9812...9813...9814...9815...9816...9817...9818...9819...9820...9821...9822...9823...9824...9825...9826...9827...9828...9829...9830...9831...9832...9833...9834...9835...9836...9837...9838...9839...9840...9841...9842...9843...9845...9845...9846...9847...9848...9849...9850...9851...9852...9853...9854...9855...9856...9857...9858...9859...9860...9861...9862...9863...9864...9865...9866...9867...9868...9869...9870...9871...9872...9873...9874...9875...9876...9877...9878...9879...9880...9881...9882...9883...9884...9885...9886...9887...9888...9889...9890...9891...9892...9893...9894...9895...9896...9897...9898...9899...9900...9901...9902...9903...9904...9905...9906...9907...9908...9909...9910...9911...9912...9913...9914...9915...9916...9917...9918...9919...9920...9921...9922...9923...9924...9925...9926...9927...9928...9929...9930...9931...9932...9933...9934...9935...9936...9937...9938...9939...9940...9941...9942...9943...9944...9945...9946...9947...9948...9949...9950...9951...9952...9953...9954...9955...9956...9957...9958...9959...9960...9961...9962...9963...9964...9965...9966...9967...9968...9969...9970...9971...9972...9973...9974...9975...9976...9977...9978...9979...9980...9981...9982...9983...9984...9985...9986...9987...9988...9989...9990...9991...9992...9993...9994...9995...9996...9997...9998...9999...10000...10001...10002...10003...10004...10005...10006...10007...10008...10009...10010...10011...10012...10013...10014...10015...10016...10017...10018...10019...10020...10021...10022...10023...10024...10025...10026...10027...10028...10029...10030...10031...10032...10033...10034...10035...10036...10037...10038...10039...10040...10041...10042...10043...10044...10045...10046...10047...10048...10049...10050...10051...10052...10053...10054...10055...10056...10057...10058...10059...10060...10061...10062...10063...10064...10065...10066...10067...10068...10069...10070...10071...10072...10073...10074...10075...10076...10077...10078...10079...10080...10081...10082...10083...10084...10085...10086...10087...10088...10089...10090...10091...10092...10093...10094...10095...10096...10097...10098...10099...10100...10101...10102...10103...10104...10105...10106...10107...10108...10109...10110...10111...10112...10113...10114...10115...10116...10117...10118...10119...10120...10121...10122...10123...10124...10125...10126...10127...10128...10129...10130...10131...10132...10133...10134...10135...10136...10137...10138...10139...10140...10141...10142...10143...10144...10145...10146...10147...10148...10149...10150...10151...10152...10153...10154...10155...10156...10157...10158...10159...10160...10161...10162...10163...10164...10165...10166...10167...10168...10169...10170...10171...10172...10173...10174...10175...10176...10177...10178...10179...10180...10181...10182...10183...10184...10185...10186...10187...10188...10189...10190...10191...10192...10193...10194...10195...10196...10197...10198...10199...10200...10201...10202...10203...10204...10205...10206...10207...10208...10209...10210...10211...10212...10213...10214...10215...10216...10217...10218...10219...10220...10221...10222...10223...10224...10225...10226...10227...10228...10229...10230...10231...10232...10233...10234...10235...10236...10237...10238...10239...10240...10241...10242...10243...10244...10245...10246...10247...10248...10249...10250...10251...10252...10253...10254...10255...10256...10257...10258...10259...10260...10261...10262...10263...10264...10265...10266...10267...10268...10269...10270...10271...10272...10273...10274...10275...10276...10277...10278...10279...10280...10281...10282...10283...10284...10285...10286...10287...10288...10289...10290...10291...10292...10293...10294...10295...10296...10297...10298...10299...10300...10301...10302...10303...10304...10305...10306...10307...10308...10309...10310...10311...10312...10314...10314...10315...10316...10317...10318...10319...10320...10321...10322...10323...10324...10325...10326...10327...10328...10329...10330...10331...10332...10333...10334...10335...10336...10337...10338...10339...10340...10341...10342...10343...10344...10345...10346...10347...10348...10349...10350...10351...10352...10353...10354...10355...10356...10357...10358...10359...10360...10361...10362...10363...10364...10365...10366...10367...10368...10369...10370...10371...10372...10373...10374...10375...10376...10377...10378...10379...10380...10381...10382...10383...10384...10385...10386...10387...10388...10389...10390...10391...10392...10393...10394...10395...10396...10397...10398...10399...10400...10401...10402...10403...10404...10405...10406...10407...10408...10409...10410...10411...10412...10413...10414...10415...10416...10417...10418...10419...10420...10421...10422...10423...10424...10425...10426...10427...10428...10429...10430...10431...10432...10433...10434...10435...10436...10437...10438...10439...10440...10441...10442...10443...10444...10445...10446...10447...10448...10449...10450...10451...10452...10453...10454...10455...10456...10457...10458...10459...10460...10461...10462...10463...10464...10465...10466...10467...10468...10469...10470...10471...10472...10473...10474...10475...10476...10477...10478...10479...10480...10481...10482...10483...10484...10485...10486...10487...10488...10489...10490...10491...10492...10493...10494...10495...10496...10497...10498...10499...10500...10501...10502...10503...10504...10505...10506...10507...10508...10509...10510...10511...10512...10513...10514...10515...10516...10517...10518...10519...10520...10521...10522...10523...10524...10525...10526...10527...10528...10529...10530...10531...10532...10533...10534...10535...10536...10537...10538...10539...10540...10541...10542...10543...10544...10545...10546...10547...10548...10549...10550...10551...10552...10553...10554...10555...10556...10557...10558...10559...10560...10561...10562...10563...10564...10565...10566...10567...10568...10569...10570...10571...10572...10573...10574...10575...10576...10577...10578...10579...10580...10581...10582...10583...10584...10585...10586...10587...10588...10589...10590...10591...10592...10593...10594...10595...10596...10597...10598...10599...10600...10601...10602...10603...10604...10605...10606...10607...10608...10609...10610...10611...10612...10613...10614...10615...10616...10617...10618...10619...10620...10621...10622...10623...10624...10625...10626...10627...10628...10629...10630...10631...10632...10633...10634...10635...10636...10637...10638...10639...10640...10641...10642...10643...10644...10645...10646...10647...10648...10649...10650...10651...10652...10653...10654...10655...10656...10657...10658...10659...10660...10661...10662...10663...10664...10665...10666...10667...10668...10669...10670...10671...10672...10673...10674...10675...10676...10677...10678...10679...10680...10681...10682...10683...10684...10685...10686...10687...10688...10689...10690...10691...10692...10693...10694...10695...10696...10697...10698...10699...10700...10701...10702...10703...10704...10705...10706...10707...10708...10709...10710...10711...10712...10713...10714...10715...10716...10717...10718...10719...10720...10721...10722...10723...10724...10725...10726...10727...10728...10729...10730...10731...10732...10733...10734...10735...10736...10737...10738...10739...10740...10741...10742...10743...10744...10745...10746...10747...10748...10749...10750...10751...10752...10753...10754...10755...10756...10757...10758...10759...10760...10761...10762...10763...10764...10765...10766...10767...10768...10769...10770...10771...10772...10773...10774...10775...10776...10777...10778...10779...10780...10781...10783...10783...10784...10785...10786...10787...10788...10789...10790...10791...10792...10793...10794...10795...10796...10797...10798...10799...10800...10801...10802...10803...10804...10805...10806...10807...10808...10809...10810...10811...10812...10813...10814...10815...10816...10817...10818...10819...10820...10821...10822...10823...10824...10825...10826...10827...10828...10829...10830...10831...10832...10833...10834...10835...10836...10837...10838...10839...10840...10841...10842...10843...10844...10845...10846...10847...10848...10849...10850...10851...10852...10853...10854...10855...10856...10857...10858...10859...10860...10861...10862...10863...10864...10865...10866...10867...10868...10869...10870...10871...10872...10873...10874...10875...10876...10877...10878...10879...10880...10881...10882...10883...10884...10885...10886...10887...10888...10889...10890...10891...10892...10893...10894...10895...10896...10897...10898...10899...10900...10901...10902...10903...10904...10905...10906...10907...10908...10909...10910...10911...10912...10913...10914...10915...10916...10917...10918...10919...10920...10921...10922...10923...10924...10925...10926...10927...10928...10929...10930...10931...10932...10933...10934...10935...10936...10937...10938...10939...10940...10941...10942...10943...10944...10945...10946...10947...10948...10949...10950...10951...10952...10953...10954...10955...10956...10957...10958...10959...10960...10961...10962...10963...10964...10965...10966...10967...10968...10969...10970...10971...10972...10973...10974...10975...10976...10977...10978...10979...10980...10981...10982...10983...10984...10985...10986...10987...10988...10989...10990...10991...10992...10993...10994...10995...10996...10997...10998...10999...11000...11001...11002...11003...11004...11005...11006...11007...11008...11009...11010...11011...11012...11013...11014...11015...11016...11017...11018...11019...11020...11021...11022...11023...11024...11025...11026...11027...11028...11029...11030...11031...11032...11033...11034...11035...11036...11037...11038...11039...11040...11041...11042...11043...11044...11045...11046...11047...11048...11049...11050...11051...11052...11053...11054...11055...11056...11057...11058...11059...11060...11061...11062...11063...11064...11065...11066...11067...11068...11069...11070...11071...11072...11073...11074...11075...11076...11077...11078...11079...11080...11081...11082...11083...11084...11085...11086...11087...11088...11089...11090...11091...11092...11093...11094...11095...11096...11097...11098...11099...11100...11101...11102...11103...11104...11105...11106...11107...11108...11109...11110...11111...11112...11113...11114...11115...11116...11117...11118...11119...11120...11121...11122...11123...11124...11125...11126...11127...11128...11129...11130...11131...11132...11133...11134...11135...11136...11137...11138...11139...11140...11141...11142...11143...11144...11145...11146...11147...11148...11149...11150...11151...11152...11153...11154...11155...11156...11157...11158...11159...11160...11161...11162...11163...11164...11165...11166...11167...11168...11169...11170...11171...11172...11173...11174...11175...11176...11177...11178...11179...11180...11181...11182...11183...11184...11185...11186...11187...11188...11189...11190...11191...11192...11193...11194...11195...11196...11197...11198...11199...11200...11201...11202...11203...11204...11205...11206...11207...11208...11209...11210...11211...11212...11213...11214...11215...11216...11217...11218...11219...11220...11221...11222...11223...11224...11225...11226...11227...11228...11229...11230...11231...11232...11233...11234...11235...11236...11237...11238...11239...11240...11241...11242...11243...11244...11245...11246...11247...11248...11249...11250...11252...11252...11253...11254...11255...11256...11257...11258...11259...11260...11261...11262...11263...11264...11265...11266...11267...11268...11269...11270...11271...11272...11273...11274...11275...11276...11277...11278...11279...11280...11281...11282...11283...11284...11285...11286...11287...11288...11289...11290...11291...11292...11293...11294...11295...11296...11297...11298...11299...11300...11301...11302...11303...11304...11305...11306...11307...11308...11309...11310...11311...11312...11313...11314...11315...11316...11317...11318...11319...11320...11321...11322...11323...11324...11325...11326...11327...11328...11329...11330...11331...11332...11333...11334...11335...11336...11337...11338...11339...11340...11341...11342...11343...11344...11345...11346...11347...11348...11349...11350...11351...11352...11353...11354...11355...11356...11357...11358...11359...11360...11361...11362...11363...11364...11365...11366...11367...11368...11369...11370...11371...11372...11373...11374...11375...11376...11377...11378...11379...11380...11381...11382...11383...11384...11385...11386...11387...11388...11389...11390...11391...11392...11393...11394...11395...11396...11397...11398...11399...11400...11401...11402...11403...11404...11405...11406...11407...11408...11409...11410...11411...11412...11413...11414...11415...11416...11417...11418...11419...11420...11421...11422...11423...11424...11425...11426...11427...11428...11429...11430...11431...11432...11433...11434...11435...11436...11437...11438...11439...11440...11441...11442...11443...11444...11445...11446...11447...11448...11449...11450...11451...11452...11453...11454...11455...11456...11457...11458...11459...11460...11461...11462...11463...11464...11465...11466...11467...11468...11469...11470...11471...11472...11473...11474...11475...11476...11477...11478...11479...11480...11481...11482...11483...11484...11485...11486...11487...11488...11489...11490...11491...11492...11493...11494...11495...11496...11497...11498...11499...11500...11501...11502...11503...11504...11505...11506...11507...11508...11509...11510...11511...11512...11513...11514...11515...11516...11517...11518...11519...11520...11521...11522...11523...11524...11525...11526...11527...11528...11529...11530...11531...11532...11533...11534...11535...11536...11537...11538...11539...11540...11541...11542...11543...11544...11545...11546...11547...11548...11549...11550...11551...11552...11553...11554...11555...11556...11557...11558...11559...11560...11561...11562...11563...11564...11565...11566...11567...11568...11569...11570...11571...11572...11573...11574...11575...11576...11577...11578...11579...11580...11581...11582...11583...11584...11585...11586...11587...11588...11589...11590...11591...11592...11593...11594...11595...11596...11597...11598...11599...11600...11601...11602...11603...11604...11605...11606...11607...11608...11609...11610...11611...11612...11613...11614...11615...11616...11617...11618...11619...11620...11621...11622...11623...11624...11625...11626...11627...11628...11629...11630...11631...11632...11633...11634...11635...11636...11637...11638...11639...11640...11641...11642...11643...11644...11645...11646...11647...11648...11649...11650...11651...11652...11653...11654...11655...11656...11657...11658...11659...11660...11661...11662...11663...11664...11665...11666...11667...11668...11669...11670...11671...11672...11673...11674...11675...11676...11677...11678...11679...11680...11681...11682...11683...11684...11685...11686...11687...11688...11689...11690...11691...11692...11693...11694...11695...11696...11697...11698...11699...11700...11701...11702...11703...11704...11705...11706...11707...11708...11709...11710...11711...11712...11713...11714...11715...11716...11717...11718...11719... \ No newline at end of file +0... 1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13... 14... 15... 16... 17... 18... 19... 20... 21... 22... 23... 24... 25... 26... 27... 28... 29... 30... 31... 32... 33... 34... 35... 36... 37... 38... 39... 40... 41... 42... 43... 44... 45... 46... 47... 48... 49... 50... 51... 52... 53... 54... 55... 56... 57... 58... 59... 60... 61... 62... 63... 64... 65... 66... 67... 68... 70... 70... 71... 72... 73... 74... 75... 76... 77... 78... 79... 80... 81... 82... 83... 84... 85... 86... 87... 88... 89... 90... 91... 92... 93... 94... 95... 96... 97... 98... 99... 100... 101... 102... 103... 104... 105... 106... 107... 108... 109... 110... 111... 112... 113... 114... 115... 116... 117... 118... 119... 120... 121... 122... 123... 124... 125... 126... 127... 128... 129... 130... 131... 132... 133... 134... 135... 136... 137... 138... 139... 140... 141... 142... 143... 144... 145... 146... 147... 148... 149... 150... 151... 152... 153... 154... 155... 156... 157... 158... 159... 160... 162...162... 163... 164... 165... 166... 167... 168... 169... 170... 171... 172... 173... 174... 175... 176... 177... 178... 179... 180... 181... 182... 183... 184... 185... 186... 187... 188... 189... 190... 191... 192... 193... 194... 195... 196... 197... 198... 199... 200... 201... 202... 203... 204... 205... 206... 207... 208... 209... 210... 211... 212... 213... 214... 215... 216... 217... 218... 219... 220... 221... 222... 223... 224... 225... 226... 227... 228... 229... 230... 232... 232... 233... 234... 235... 236... 237... 238... 239... 240... 241... 242... 243... 244... 245... 246... 247... 248... 249... 250... 251... 252... 253... 254... 255... 256... 257... 258... 259... 260... 261... 262... 263... 264... 265... 266... 267... 268... 269... 270... 271... 272... 273... 274... 275... 276... 277... 278... 279... 280... 281... 282... 283... 284... 285... 286... 287... 288... 289... 290... 291... 292... 293... 294... 295... 296... 297... 298... 299... 300... 301... 302... 303... 304... 305... 306... 307... 308... 309... 310... 311... 312... 313... 314... 315... 316... 317... 318... 319... 320... 321... 322... 324... \ No newline at end of file diff --git a/test/cases/comments/input.toffee b/test/cases/comments/input.toffee index 89cc52b..54655cf 100644 --- a/test/cases/comments/input.toffee +++ b/test/cases/comments/input.toffee @@ -17,5 +17,16 @@ Pass 2 ### #} -Pass 3 -{## Fail ##}{## Fail ##} \ No newline at end of file +Pass 3{## Fail ##}{## Fail ##} +{## + Fail + #{"Fail"} + {# + for x in [1...100] {: + #{"Fail"} + {# + print "Fail" + #} + :} + #} +##} \ No newline at end of file diff --git a/test/cases/custom_escape/input.toffee b/test/cases/custom_escape/input.toffee index d308ca6..6f45042 100644 --- a/test/cases/custom_escape/input.toffee +++ b/test/cases/custom_escape/input.toffee @@ -1,31 +1,11 @@ {# - x = '"Hello world"' + x = '"Hello world"' y = '' z = 'click&clack' w = [1, 2, {"place": "The Dreadfort"}] #}

    - default x = #{x} - default y = #{y} - default z = #{z} - default w = #{w} -

    -

    - raw x = #{raw x} - raw y = #{raw y} - raw z = #{raw z} - raw w = #{raw w} -

    - -

    -{# - print " raw printed x = #{x}\n" - print " raw printed y = #{y}\n" - print " raw printed z = #{z}\n" - print " raw printed w = #{w}" -#} + custom x = #{x} + custom y = #{y} + custom z = #{z} + custom w = #{w}

    \ No newline at end of file diff --git a/test/cases/custom_escape/output.toffee b/test/cases/custom_escape/output.toffee index 5da6c21..008e9a4 100644 --- a/test/cases/custom_escape/output.toffee +++ b/test/cases/custom_escape/output.toffee @@ -1,24 +1,6 @@

    - default x = ["Hello world"] - default y = [] - default z = [click&clack] - default w = [1,2,[object Object]] -

    -

    - raw x = "Hello world" - raw y = - raw z = click&clack - raw w = 1,2,[object Object] -

    - -

    - raw printed x = "Hello world" - raw printed y = - raw printed z = click&clack - raw printed w = 1,2,[object Object] + custom x = Helloworldscriptvarx100script + custom y = td + custom z = clickclack + custom w = 12objectObject

    \ No newline at end of file diff --git a/test/cases/custom_escape/vars.coffee b/test/cases/custom_escape/vars.coffee new file mode 100644 index 0000000..643dc53 --- /dev/null +++ b/test/cases/custom_escape/vars.coffee @@ -0,0 +1,3 @@ +{ + escape: (s) -> "#{s}".replace /[^a-z0-9]/gi, '' +} \ No newline at end of file diff --git a/test/cases/custom_escape/vars.js b/test/cases/custom_escape/vars.js deleted file mode 100644 index 61d8a4d..0000000 --- a/test/cases/custom_escape/vars.js +++ /dev/null @@ -1,3 +0,0 @@ -{ - "escape": function(str) { return "[" + str + "]"; } -} \ No newline at end of file diff --git a/test/cases/escape/input.toffee b/test/cases/escape/input.toffee index 1a6aa5c..697235e 100644 --- a/test/cases/escape/input.toffee +++ b/test/cases/escape/input.toffee @@ -1,13 +1,20 @@ {# x = '"Hello world"' - y = '' + y = '
    ' z = 'click&clack' - w = [1, 2, {"place": "The Dreadfort"}] + w = [1, 2, {"place": "The Dreadfort", "evil \"code\"": "italic"}] + v = ["\u2028", "\u2029"] + dir = ["hi\u{202e}there"] # ltr type things #}

    default x = #{x} default y = #{y} default z = #{z} default w = #{w} + default r = #{r}eol + default w.foo = #{w.foo}eol + default v = #{v} + default dir = #{dir} + default dir0 = #{dir[0]}

    raw x = #{raw x} @@ -15,11 +22,16 @@ raw z = #{raw z} raw w = #{raw w}

    +
    +  w_as_json_stringify=#{JSON.stringify w}
    +  w_as_json_stringify_raw=#{raw JSON.stringify w}
    +

    {# @@ -34,7 +46,8 @@ print " json printed x = #{ raw raw raw raw json x }\n" print " json printed y = #{ raw raw raw raw json y }\n" print " json printed z = #{ raw raw raw raw json z }\n" - print " json printed w = #{ raw raw raw raw json w }" + print " json printed w = #{ raw raw raw raw json w }\n" + print " json printed v = #{ raw raw raw raw json v }" #}

    @@ -44,4 +57,4 @@ print " html printed longhand z = #{ __toffee.html z }\n" print " html printed longhand w = #{ __toffee.html w }" #} -

    \ No newline at end of file +

    diff --git a/test/cases/escape/output.toffee b/test/cases/escape/output.toffee index e35fd5a..7624efa 100644 --- a/test/cases/escape/output.toffee +++ b/test/cases/escape/output.toffee @@ -1,36 +1,47 @@

    default x = "Hello world" - default y = <td> + default y = <hr /> default z = click&clack - default w = [1,2,{"place":"The Dreadfort"}] + default w = [1,2,{"place":"The Dreadfort","evil \u003Cb\u003E\"code\"\u003C/b\u003E":"\u003Ci\u003Eitalic\u003C/i\u003E"}] + default r = eol + default w.foo = eol + default v = ["\u2028","\u2029"] + default dir = ["hi\u202ethere"] + default dir0 = hithere

    raw x = "Hello world" - raw y = + raw y =


    raw z = click&clack raw w = 1,2,[object Object]

    +
    +  w_as_json_stringify=[1,2,{"place":"The Dreadfort","evil <b>\"code\"</b>":"<i>italic</i>"}]
    +  w_as_json_stringify_raw=[1,2,{"place":"The Dreadfort","evil \"code\"":"italic"}]
    +

    raw printed x = "Hello world" - raw printed y = + raw printed y =


    raw printed z = click&clack raw printed w = 1,2,[object Object]

    json printed x = "\"Hello world\"" - json printed y = "" - json printed z = "click&clack" - json printed w = [1,2,{"place":"The Dreadfort"}] + json printed y = "\u003Chr /\u003E" + json printed z = "click\u0026clack" + json printed w = [1,2,{"place":"The Dreadfort","evil \u003Cb\u003E\"code\"\u003C/b\u003E":"\u003Ci\u003Eitalic\u003C/i\u003E"}] + json printed v = ["\u2028","\u2029"]

    html printed longhand x = "Hello world" - html printed longhand y = <td> + html printed longhand y = <hr /> html printed longhand z = click&clack html printed longhand w = 1,2,[object Object] -

    \ No newline at end of file +

    diff --git a/test/cases/include_order/input.toffee b/test/cases/include_order/input.toffee index 663c0be..76d5abf 100644 --- a/test/cases/include_order/input.toffee +++ b/test/cases/include_order/input.toffee @@ -1,6 +1,6 @@ {# say_hi = -> - -{:hi:} + {:hi:} #}1 2 #{partial "child.toffee", say_hi: say_hi} diff --git a/test/cases/include_techniques/input.toffee b/test/cases/include_techniques/input.toffee index 61cb308..63b1a9b 100644 --- a/test/cases/include_techniques/input.toffee +++ b/test/cases/include_techniques/input.toffee @@ -2,6 +2,6 @@ #{partial "message.toffee", from: "Max & Sam"} {# print partial "message.toffee", from: "Christian" - -{:#{partial "message.toffee", from: "Jennie"}:} - print partial "message.toffee", sender: "The enemy" + {:#{ partial "message.toffee", from: "Jennie"}:} + print partial "message.toffee", sender: "The enemy" #} \ No newline at end of file diff --git a/test/cases/indent_attack/input.toffee b/test/cases/indent_attack/input.toffee index f63c1bc..d552e88 100644 --- a/test/cases/indent_attack/input.toffee +++ b/test/cases/indent_attack/input.toffee @@ -51,21 +51,52 @@ print 'Pass7' else print 'Fail' - {:Fail8:} - -{:Pass8:} + {:Fail8:} + {:Pass8:} #} {# - -{:...passed with flying colors.:} + {:...passed with flying colors.:} +#}{## +{# + if true and 10 is 10 + {: + Pass9 + :} + print "Pass10" + if 11 is 12 + print "Fail" + if 12 is 13 {: + Fail + :} + else + {: + Pass11 + :} + else if 11 is 12 + {: + Fail + :} #} +##}

    {# - x = 10 + x = 20 if x > 1 - for i in [0...x] - {:
    #{i}{# - if i is 3 {: (my favorite number) :} + for i in [12...x] + square = 16 + {:Pass#{i}{# + if i is square {:(a perfect square):} #}:} #} + {# + x = 20 + if x > 1 + for i in [12...x] + square = 16 + {:Pass#{i}{# + if i is square {:(a perfect square):} + #}:} + #}

    \ No newline at end of file diff --git a/test/cases/indent_attack/output.toffee b/test/cases/indent_attack/output.toffee index eb0dc63..5da2813 100644 --- a/test/cases/indent_attack/output.toffee +++ b/test/cases/indent_attack/output.toffee @@ -11,5 +11,6 @@ Pass7Pass8 ...passed with flying colors.

    -
    0
    1
    2
    3 (my favorite number)
    4
    5
    6
    7
    8
    9 + Pass12Pass13Pass14Pass15Pass16(a perfect square)Pass17Pass18Pass19 + Pass20

    \ No newline at end of file diff --git a/test/cases/json_formatting/input.toffee b/test/cases/json_formatting/input.toffee new file mode 100644 index 0000000..673bead --- /dev/null +++ b/test/cases/json_formatting/input.toffee @@ -0,0 +1,12 @@ +{# + x = + foo: [1,2,3] + bar: + car: [4,5,"<\/html",{zar: [6,7,null]}] + y = [1,2,"<\/script>\""] +#} +#{x} +#{json x, {indent: ' '}} +#{json x, {indent: 2}} +#{json x, {indent: '\t'}} +#{__toffee.json y, {indent:3}} diff --git a/test/cases/json_formatting/output.toffee b/test/cases/json_formatting/output.toffee new file mode 100644 index 0000000..f9e8db4 --- /dev/null +++ b/test/cases/json_formatting/output.toffee @@ -0,0 +1,70 @@ + +{"foo":[1,2,3],"bar":{"car":[4,5,"\u003C/html",{"zar":[6,7,null]}]}} +{ + "foo": [ + 1, + 2, + 3 + ], + "bar": { + "car": [ + 4, + 5, + "\u003C/html", + { + "zar": [ + 6, + 7, + null + ] + } + ] + } +} +{ + "foo": [ + 1, + 2, + 3 + ], + "bar": { + "car": [ + 4, + 5, + "\u003C/html", + { + "zar": [ + 6, + 7, + null + ] + } + ] + } +} +{ + "foo": [ + 1, + 2, + 3 + ], + "bar": { + "car": [ + 4, + 5, + "\u003C/html", + { + "zar": [ + 6, + 7, + null + ] + } + ] + } +} +[ + 1, + 2, + "\u003C/script\u003E\"" +] diff --git a/test/cases/junk/input.toffee b/test/cases/junk/input.toffee index 7d402e3..c0420b0 100644 --- a/test/cases/junk/input.toffee +++ b/test/cases/junk/input.toffee @@ -2,4 +2,4 @@ supplies = ["broom", "mop", "vacuum"] #}
      {# for supply in supplies {:
    • #{supply}
    • :} #} -
    \ No newline at end of file + diff --git a/test/cases/junk/output.toffee b/test/cases/junk/output.toffee index 5e50d3c..f60f38f 100644 --- a/test/cases/junk/output.toffee +++ b/test/cases/junk/output.toffee @@ -1,3 +1,3 @@
    • broom
    • mop
    • vacuum
    • -
    \ No newline at end of file + diff --git a/test/cases/lambda_fns/input.toffee b/test/cases/lambda_fns/input.toffee index a3b4087..d827176 100644 --- a/test/cases/lambda_fns/input.toffee +++ b/test/cases/lambda_fns/input.toffee @@ -2,9 +2,9 @@ print_it = (msg) -> {:#{msg}:} print_it_twice = (msg) -> - -{:#{msg}:} + {:#{msg}:} m = msg - -{:#{m}:} + {:#{m}:} echo_it = (msg) -> v = msg diff --git a/test/cases/passback/const1.toffee b/test/cases/passback/const1.toffee new file mode 100644 index 0000000..9ade052 --- /dev/null +++ b/test/cases/passback/const1.toffee @@ -0,0 +1,7 @@ +{# + passback.vx = "vx1" + passback.vy = "vy1" + passback.x = "oh shit" + passback.y = "oh noze" +#} +This should output (1). \ No newline at end of file diff --git a/test/cases/passback/const2.toffee b/test/cases/passback/const2.toffee new file mode 100644 index 0000000..d626b3a --- /dev/null +++ b/test/cases/passback/const2.toffee @@ -0,0 +1,6 @@ +{# + passback.vz = "vz2" + vx = "Should not set." + vy = "Should not set." +#} +This should not output (2). \ No newline at end of file diff --git a/test/cases/passback/const3.toffee b/test/cases/passback/const3.toffee new file mode 100644 index 0000000..2f9d296 --- /dev/null +++ b/test/cases/passback/const3.toffee @@ -0,0 +1,5 @@ +{# + passback["vx"] = "vx3" + passback["vy"] = "vy3" +#} +This should not output (3). \ No newline at end of file diff --git a/test/cases/passback/const4.toffee b/test/cases/passback/const4.toffee new file mode 100644 index 0000000..fe80dcb --- /dev/null +++ b/test/cases/passback/const4.toffee @@ -0,0 +1,6 @@ +{# + passback.vx = "vx4" + passback.vy = "vy4" + partial "./const4_sub.toffee" +#} +This should not output (4). \ No newline at end of file diff --git a/test/cases/passback/const4_sub.toffee b/test/cases/passback/const4_sub.toffee new file mode 100644 index 0000000..515a618 --- /dev/null +++ b/test/cases/passback/const4_sub.toffee @@ -0,0 +1,5 @@ +{# + passback.vx = "vx4_sub" + passback.vy = "vy4_sub" +#} +This should not output (4_sub). \ No newline at end of file diff --git a/test/cases/passback/const5.toffee b/test/cases/passback/const5.toffee new file mode 100644 index 0000000..549fc16 --- /dev/null +++ b/test/cases/passback/const5.toffee @@ -0,0 +1,8 @@ +{# + passback.vx = "vx5" + passback.vy = "vy5" + print load "./const5_sub.toffee" + passback.vx = vx + passback.vy = vy +#} +This should not output (5). \ No newline at end of file diff --git a/test/cases/passback/const5_sub.toffee b/test/cases/passback/const5_sub.toffee new file mode 100644 index 0000000..b3453f2 --- /dev/null +++ b/test/cases/passback/const5_sub.toffee @@ -0,0 +1,5 @@ +{# + passback.vx = "vx5_sub" + passback.vy = "vy5_sub" +#} +This should not output (5_sub). \ No newline at end of file diff --git a/test/cases/passback/input.toffee b/test/cases/passback/input.toffee new file mode 100644 index 0000000..03104e0 --- /dev/null +++ b/test/cases/passback/input.toffee @@ -0,0 +1,11 @@ +vx,vy,vz = #{vx},#{vy},#{vz} +#{partial "./const1.toffee"} +vx,vy,vz = #{vx},#{vy},#{vz} +#{load "./const2.toffee"} +vx,vy,vz = #{vx},#{vy},#{vz} +#{load "./const3.toffee"} +vx,vy,vz = #{vx},#{vy},#{vz} +#{load "./const4.toffee"} +vx,vy,vz = #{vx},#{vy},#{vz} +#{load "./const5.toffee"} +vx,vy,vz = #{vx},#{vy},#{vz} \ No newline at end of file diff --git a/test/cases/passback/output.toffee b/test/cases/passback/output.toffee new file mode 100644 index 0000000..72bfdc2 --- /dev/null +++ b/test/cases/passback/output.toffee @@ -0,0 +1,12 @@ +vx,vy,vz = vx0,, + +This should output (1). +vx,vy,vz = vx1,vy1, + +vx,vy,vz = vx1,vy1,vz2 + +vx,vy,vz = vx3,vy3,vz2 + +vx,vy,vz = vx4,vy4,vz2 + +vx,vy,vz = vx5_sub,vy5_sub,vz2 \ No newline at end of file diff --git a/test/cases/passback/vars.js b/test/cases/passback/vars.js new file mode 100644 index 0000000..254c8e7 --- /dev/null +++ b/test/cases/passback/vars.js @@ -0,0 +1,4 @@ +{ + "vx": "vx0", + "x" : "hi" +} \ No newline at end of file diff --git a/test/cases/post_process/buncha_junk.toffee b/test/cases/post_process/buncha_junk.toffee new file mode 100644 index 0000000..e1bf4dc --- /dev/null +++ b/test/cases/post_process/buncha_junk.toffee @@ -0,0 +1 @@ +T3246h354is345-i3245s345-534a534-h534i543d534d534e534n543-m534e543s543s543ag5e534.543 \ No newline at end of file diff --git a/test/cases/post_process/input.toffee b/test/cases/post_process/input.toffee new file mode 100644 index 0000000..4e0f3e0 --- /dev/null +++ b/test/cases/post_process/input.toffee @@ -0,0 +1,7 @@ +#{greeting}, world. +#{partial './signature.toffee'} +{# + reverse = (s) -> (c for c in s by -1).join "" + clean = (s) -> (c for c in s when c.match /[a-z\-]/gi).join "" +#} +#{partial './buncha_junk.toffee', {postProcess: (s) -> reverse(clean(s))}} \ No newline at end of file diff --git a/test/cases/post_process/output.toffee b/test/cases/post_process/output.toffee new file mode 100644 index 0000000..7549b0b --- /dev/null +++ b/test/cases/post_process/output.toffee @@ -0,0 +1,4 @@ +This-is-a-hidden-message + +.dlrow leurc ,eybdooG + .dlrow ,olleH \ No newline at end of file diff --git a/test/cases/post_process/signature.toffee b/test/cases/post_process/signature.toffee new file mode 100644 index 0000000..89c169c --- /dev/null +++ b/test/cases/post_process/signature.toffee @@ -0,0 +1 @@ +Goodbye, cruel world. \ No newline at end of file diff --git a/test/cases/post_process/vars.coffee b/test/cases/post_process/vars.coffee new file mode 100644 index 0000000..d572995 --- /dev/null +++ b/test/cases/post_process/vars.coffee @@ -0,0 +1,4 @@ +{ + greeting: 'Hello' + postProcess: (s) -> (c for c in s by -1).join '' +} \ No newline at end of file diff --git a/test/cases/render_no_args/input.toffee b/test/cases/render_no_args/input.toffee new file mode 100644 index 0000000..951084a --- /dev/null +++ b/test/cases/render_no_args/input.toffee @@ -0,0 +1 @@ +No arguments passed. \ No newline at end of file diff --git a/test/cases/render_no_args/output.toffee b/test/cases/render_no_args/output.toffee new file mode 100644 index 0000000..951084a --- /dev/null +++ b/test/cases/render_no_args/output.toffee @@ -0,0 +1 @@ +No arguments passed. \ No newline at end of file diff --git a/test/cases/special_cases/input.toffee b/test/cases/special_cases/input.toffee index 32f977a..563d8a2 100644 --- a/test/cases/special_cases/input.toffee +++ b/test/cases/special_cases/input.toffee @@ -4,7 +4,7 @@ ##} {# - -{:"PASSED":} + {:"PASSED":} #} {## @@ -13,4 +13,13 @@ ##}

    #{print "#{'click & clack'}"} -

    \ No newline at end of file +

    +{## + + Make backslashes in text are handled ok. + +##} +A backslash is a \ + \ No newline at end of file diff --git a/test/cases/special_cases/output.toffee b/test/cases/special_cases/output.toffee index 5554959..1490d7f 100644 --- a/test/cases/special_cases/output.toffee +++ b/test/cases/special_cases/output.toffee @@ -3,4 +3,9 @@

    click & clack -

    \ No newline at end of file +

    + +A backslash is a \ + \ No newline at end of file diff --git a/test/express3/app.coffee b/test/express3/app.coffee deleted file mode 100644 index 96e25a3..0000000 --- a/test/express3/app.coffee +++ /dev/null @@ -1,31 +0,0 @@ - -express = require 'express' -routes = require './routes' -http = require 'http' -toffee = require 'toffee' - -app = express() - - -app.configure -> - - toffee.expressEngine.verbose = false - #toffee.expressEngine.prettyPrintErrors = true - - app.set 'port', process.env.PORT or 3033 - app.set 'views', __dirname + '/views' - app.set 'view engine', 'toffee' - app.use express.favicon() - app.use express.logger 'dev' - app.use express.bodyParser() - app.use express.methodOverride() - app.use app.router - app.use express.static __dirname + '/public' - -app.configure 'development', -> - app.use express.errorHandler() - -app.get '/', routes.index - -http.createServer(app).listen app.get('port'), -> - console.log "Express server listening on port #{app.get('port')}" \ No newline at end of file diff --git a/test/express3/routes/index.js b/test/express3/routes/index.js deleted file mode 100644 index 29fed96..0000000 --- a/test/express3/routes/index.js +++ /dev/null @@ -1,14 +0,0 @@ - -/* - * GET home page. - */ - -exports.index = function(req, res){ - var circular_obj = [1,2,3]; - circular_obj.push(circular_obj); - var vars = { - title: 'Express', - a_bad_test_function: function() {return JSON.stringify(circular_obj);} - } - res.render('index', vars); -}; \ No newline at end of file diff --git a/test/express3/views/index.toffee b/test/express3/views/index.toffee deleted file mode 100644 index 37306bd..0000000 --- a/test/express3/views/index.toffee +++ /dev/null @@ -1,8 +0,0 @@ -

    Test Results

    -{# - x = [1,2,3] - x.push x -#} -#{partial "./subdir1/hello_world.toffee", shit: (fake_thing) -> JSON.stringify x } -
    -#{partial "./subdir2/goodbye_world.toffee"} \ No newline at end of file diff --git a/test/express3/views/subdir1/hello_world.toffee b/test/express3/views/subdir1/hello_world.toffee deleted file mode 100644 index 3ded1a3..0000000 --- a/test/express3/views/subdir1/hello_world.toffee +++ /dev/null @@ -1,55 +0,0 @@ -Hello, world! -{# - i = 1 - foo = -> 100 - # a_bad_test_function "on something" -#} -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{j++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... -#{i++}... diff --git a/test/express3/views/subdir2/goodbye_world.toffee b/test/express3/views/subdir2/goodbye_world.toffee deleted file mode 100644 index 1484a43..0000000 --- a/test/express3/views/subdir2/goodbye_world.toffee +++ /dev/null @@ -1,8 +0,0 @@ -{# - if not countdown? then countdown = 32 - if countdown is 0 - print partial "foo/goodbye.toffee" - else {: - #{countdown}...#{partial './goodbye_world.toffee', {countdown: countdown - 1}} - :} -#} \ No newline at end of file diff --git a/test/express4/app.coffee b/test/express4/app.coffee new file mode 100644 index 0000000..6dc78ea --- /dev/null +++ b/test/express4/app.coffee @@ -0,0 +1,37 @@ + +run = (cb) -> + toffee = require '../../index.js' + express = require 'express' + http = require 'http' + + app = express() + + + app_configure = -> + + toffee.expressEngine.verbose = not module.parent + toffee.expressEngine.prettyPrintErrors = false + + app.set 'port', process.env.PORT or 3033 + app.set 'views', __dirname + '/views' + app.engine 'toffee', toffee.__express + app.use express.static __dirname + '/public' + app.route('/').get (req, res) => + circular_obj = [1,2,3] + circular_obj.push circular_obj + title = 'Express' + a_bad_test_function = -> return JSON.stringify circular_obj + vars = {title, a_bad_test_function} + res.render 'index.toffee', vars + + http.createServer(app).listen app.get('port'), -> + console.log "Express server listening on port #{app.get('port')}" + if cb? then cb() + + app_configure() + +if not module.parent + run() + +else + exports.run = (cb) -> run cb diff --git a/test/express4/public/javascripts/jquery-1.9.0.min.js b/test/express4/public/javascripts/jquery-1.9.0.min.js new file mode 100644 index 0000000..50d1b22 --- /dev/null +++ b/test/express4/public/javascripts/jquery-1.9.0.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.9.0 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license */(function(e,t){"use strict";function n(e){var t=e.length,n=st.type(e);return st.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e){var t=Tt[e]={};return st.each(e.match(lt)||[],function(e,n){t[n]=!0}),t}function i(e,n,r,i){if(st.acceptData(e)){var o,a,s=st.expando,u="string"==typeof n,l=e.nodeType,c=l?st.cache:e,f=l?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!u||r!==t)return f||(l?e[s]=f=K.pop()||st.guid++:f=s),c[f]||(c[f]={},l||(c[f].toJSON=st.noop)),("object"==typeof n||"function"==typeof n)&&(i?c[f]=st.extend(c[f],n):c[f].data=st.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[st.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[st.camelCase(n)])):a=o,a}}function o(e,t,n){if(st.acceptData(e)){var r,i,o,a=e.nodeType,u=a?st.cache:e,l=a?e[st.expando]:st.expando;if(u[l]){if(t&&(r=n?u[l]:u[l].data)){st.isArray(t)?t=t.concat(st.map(t,st.camelCase)):t in r?t=[t]:(t=st.camelCase(t),t=t in r?[t]:t.split(" "));for(i=0,o=t.length;o>i;i++)delete r[t[i]];if(!(n?s:st.isEmptyObject)(r))return}(n||(delete u[l].data,s(u[l])))&&(a?st.cleanData([e],!0):st.support.deleteExpando||u!=u.window?delete u[l]:u[l]=null)}}}function a(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(Nt,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:wt.test(r)?st.parseJSON(r):r}catch(o){}st.data(e,n,r)}else r=t}return r}function s(e){var t;for(t in e)if(("data"!==t||!st.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(){return!0}function l(){return!1}function c(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function f(e,t,n){if(t=t||0,st.isFunction(t))return st.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return st.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=st.grep(e,function(e){return 1===e.nodeType});if(Wt.test(t))return st.filter(t,r,!n);t=st.filter(t,r)}return st.grep(e,function(e){return st.inArray(e,t)>=0===n})}function p(e){var t=zt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function d(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function h(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function g(e){var t=nn.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function m(e,t){for(var n,r=0;null!=(n=e[r]);r++)st._data(n,"globalEval",!t||st._data(t[r],"globalEval"))}function y(e,t){if(1===t.nodeType&&st.hasData(e)){var n,r,i,o=st._data(e),a=st._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)st.event.add(t,n,s[n][r])}a.data&&(a.data=st.extend({},a.data))}}function v(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!st.support.noCloneEvent&&t[st.expando]){r=st._data(t);for(i in r.events)st.removeEvent(t,i,r.handle);t.removeAttribute(st.expando)}"script"===n&&t.text!==e.text?(h(t).text=e.text,g(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),st.support.html5Clone&&e.innerHTML&&!st.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Zt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function b(e,n){var r,i,o=0,a=e.getElementsByTagName!==t?e.getElementsByTagName(n||"*"):e.querySelectorAll!==t?e.querySelectorAll(n||"*"):t;if(!a)for(a=[],r=e.childNodes||e;null!=(i=r[o]);o++)!n||st.nodeName(i,n)?a.push(i):st.merge(a,b(i,n));return n===t||n&&st.nodeName(e,n)?st.merge([e],a):a}function x(e){Zt.test(e.type)&&(e.defaultChecked=e.checked)}function T(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Nn.length;i--;)if(t=Nn[i]+n,t in e)return t;return r}function w(e,t){return e=t||e,"none"===st.css(e,"display")||!st.contains(e.ownerDocument,e)}function N(e,t){for(var n,r=[],i=0,o=e.length;o>i;i++)n=e[i],n.style&&(r[i]=st._data(n,"olddisplay"),t?(r[i]||"none"!==n.style.display||(n.style.display=""),""===n.style.display&&w(n)&&(r[i]=st._data(n,"olddisplay",S(n.nodeName)))):r[i]||w(n)||st._data(n,"olddisplay",st.css(n,"display")));for(i=0;o>i;i++)n=e[i],n.style&&(t&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=t?r[i]||"":"none"));return e}function C(e,t,n){var r=mn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function k(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=st.css(e,n+wn[o],!0,i)),r?("content"===n&&(a-=st.css(e,"padding"+wn[o],!0,i)),"margin"!==n&&(a-=st.css(e,"border"+wn[o]+"Width",!0,i))):(a+=st.css(e,"padding"+wn[o],!0,i),"padding"!==n&&(a+=st.css(e,"border"+wn[o]+"Width",!0,i)));return a}function E(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=ln(e),a=st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=un(e,t,o),(0>i||null==i)&&(i=e.style[t]),yn.test(i))return i;r=a&&(st.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+k(e,t,n||(a?"border":"content"),r,o)+"px"}function S(e){var t=V,n=bn[e];return n||(n=A(e,t),"none"!==n&&n||(cn=(cn||st(" + + :} + {::} + #} + + + \ No newline at end of file diff --git a/test/express4_error_handling/views/test_bad_coffee_syntax.toffee b/test/express4_error_handling/views/test_bad_coffee_syntax.toffee new file mode 100644 index 0000000..1df5dd2 --- /dev/null +++ b/test/express4_error_handling/views/test_bad_coffee_syntax.toffee @@ -0,0 +1,15 @@ + +{# + x = "Foo" +#} + +{# + y = "Bar" + {: + Hello there + {# + var x = 100 + #} + :} +#} +Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah Bleah bleah bleah Bleah \ No newline at end of file diff --git a/test/express4_error_handling/views/test_bad_runtime.toffee b/test/express4_error_handling/views/test_bad_runtime.toffee new file mode 100644 index 0000000..0a8d912 --- /dev/null +++ b/test/express4_error_handling/views/test_bad_runtime.toffee @@ -0,0 +1,13 @@ + +About to convert a circular JSON structure + +{# + x = [1,2,3] + x.push x + {: +

    x as JSON

    + {# + print JSON.stringify x + #} + :} +#} diff --git a/test/express4_error_handling/views/test_bad_str_interpolate.toffee b/test/express4_error_handling/views/test_bad_str_interpolate.toffee new file mode 100644 index 0000000..d0e946d --- /dev/null +++ b/test/express4_error_handling/views/test_bad_str_interpolate.toffee @@ -0,0 +1,6 @@ + +This is a bad variable. + +foo.bar = #{foo.bar} + +Hah. \ No newline at end of file diff --git a/test/express4_error_handling/views/test_bad_toffee_syntax.toffee b/test/express4_error_handling/views/test_bad_toffee_syntax.toffee new file mode 100644 index 0000000..d5dff31 --- /dev/null +++ b/test/express4_error_handling/views/test_bad_toffee_syntax.toffee @@ -0,0 +1,10 @@ + +{# + x = "Foo" +#} + +{# + {: :} + y = "Bar" + {: +#} diff --git a/test/generate_express_test.coffee b/test/generate_express_test.coffee new file mode 100644 index 0000000..d62dbae --- /dev/null +++ b/test/generate_express_test.coffee @@ -0,0 +1,96 @@ +{spawn, exec} = require 'child_process' +fs = require 'fs' +path = require 'path' +coffee = require 'coffee-script' + + +generateExpressTest = (cb) -> + + proc = spawn path.join(__dirname,"../node_modules/.bin/coffee"), ['./src/command_line.coffee', '-n', './test/cases', '-o', './test/express4/public/javascripts/test_cases.js'] + proc.stderr.on 'data', (buffer) -> console.log buffer.toString() + proc.stdout.on 'data', (buffer) -> console.log buffer.toString() + proc.on 'exit', (status) -> + if status isnt 0 + console.log "Error running command line. #{status}" + process.exit 1 + cb() if typeof cb is 'function' + + {getCommonHeadersJs} = require '../lib/view' + headers = getCommonHeadersJs true, true + fs.writeFileSync "./test/express4/public/javascripts/toffee.js", headers, "utf8" + + # generate an index page that tests them all + + test_page = """ + + + Testing Toffee in the Browser + + + + + + + + + + """ + + case_dirs = fs.readdirSync "./test/cases/" + + for dir,i in case_dirs + expected_output = fs.readFileSync "./test/cases/#{dir}/output.toffee", "utf8" + if fs.existsSync "./test/cases/#{dir}/vars.coffee" + coffee_vars = fs.readFileSync "./test/cases/#{dir}/vars.coffee", "utf8" + js_vars = coffee.compile(coffee_vars, {bare: true}).replace(/;[ \n]*$/,'') + else if fs.existsSync "./test/cases/#{dir}/vars.js" + coffee_vars = fs.readFileSync "./test/cases/#{dir}/vars.js", "utf8" + js_vars = coffee_vars; + else + if dir == "render_no_args" + coffee_vars = "" + js_vars = "" + else + coffee_vars = "{}" + js_vars = "{}" + rid = i + test_page += """ + \n\n\n + + + + + + + + \n\n\n + """ + + test_page += """ +
    FILEEXPECTED OUTPUTSERVER RENDERBROWSER RENDER
    #{dir}#{expected_output}\#{partial '../../cases/#{dir}/input.toffee', #{coffee_vars}}
    + + + """ + fs.writeFileSync "./test/express4/views/index.toffee", test_page, "utf8" + +exports.generate = generateExpressTest + diff --git a/test/run_cases.coffee b/test/run_cases.coffee deleted file mode 100644 index 440e464..0000000 --- a/test/run_cases.coffee +++ /dev/null @@ -1,60 +0,0 @@ -{engine} = require '../lib/engine' -fs = require 'fs' -path = require 'path' - -e = new engine({ - verbose: false - prettyPrintErrors: false -}) - -run_case_dir = (dir, cb) -> - expected = fs.readFileSync "#{dir}/output.toffee", "utf8" - if path.existsSync "#{dir}/vars.js" - vars = fs.readFileSync "#{dir}/vars.js", "utf8" - vars = eval "(#{vars})" - else - vars = {} - d = Date.now() - e.run "#{dir}/input.toffee", vars, (err, res) -> - time_ms = Date.now() - d - if err - cb err, time_ms - else - if res isnt expected - cb "Failure in case #{dir}." + - "\n\nExpected\n=====\n#{expected}\n=====" + - "\nGot\n=====\n#{res}\n=====\n", time_ms - else - cb null, time_ms - -run_all_case_dirs = (cb) -> - time_ms = 0 - case_dirs = fs.readdirSync "#{__dirname}/cases/" - countdown = case_dirs.length - for dir in case_dirs - run_case_dir "#{__dirname}/cases/#{dir}", (err, ms) -> - countdown-- - time_ms += ms - if err - console.log err - process.exit 1 - if countdown is 0 - cb null, time_ms, case_dirs.length - -run_all_case_dirs (err, time, tests_run) -> - - console.log "SUCCESS for #{tests_run} cold tests in #{time}ms" - - times = [] - speed_runs = 20 - countdown = speed_runs - total_time = 0 - total_tests = 0 - for i in [0...speed_runs] - run_all_case_dirs (err, time, tests_run) -> - countdown-- - total_time += time - total_tests += tests_run - if countdown is 0 - console.log "SUCCESS for #{total_tests} hot tests in #{total_time}ms. #{total_time / total_tests}ms/test" - process.exit 0 \ No newline at end of file diff --git a/test/run_cases.iced b/test/run_cases.iced new file mode 100644 index 0000000..a64ec0e --- /dev/null +++ b/test/run_cases.iced @@ -0,0 +1,106 @@ +{engine} = require '../lib/engine' +fs = require 'fs' +path = require 'path' +Browser = require 'zombie' +coffee = require 'coffee-script' +tablify = require 'tablify' +colors = require 'colors' +jsdiff = require 'diff' + +regular_engine = new engine({ + verbose: false + prettyPrintErrors: false +}) + +# --------------------------------------------------------------- + +MULTI_RUNS = 50 + +file_cache = {} + +# --------------------------------------------------------------- + +read_file_sync = (fname) -> + if not file_cache[fname]? + file_cache[fname] = fs.readFileSync fname, "utf8" + return file_cache[fname] + +# --------------------------------------------------------------- + +run_case_dir = (eng, dir, cb) -> + start = Date.now() + expected = read_file_sync "#{dir}/output.toffee" + existsSync = if path.existsSync? then path.existsSync else fs.existsSync + if existsSync "#{dir}/vars.coffee" + txt = read_file_sync "#{dir}/vars.coffee" + vars = coffee.compile(txt, {bare: true}) + vars = eval "#{vars}" + else if existsSync "#{dir}/vars.js" + vars = read_file_sync "#{dir}/vars.js" + vars = eval "(#{vars})" + else + vars = {} + vars["rand_#{Math.random()}"] = ("foo" for i in [0...(~~(20000*Math.random()))]).join "" + await eng.run "#{dir}/input.toffee", vars, defer err, res + time_ms = Date.now() - start + if err + cb err, time_ms + else + if res isnt expected + diff = jsdiff.diffLines res, expected + delta = "" + diff.forEach (part) -> + c = if part.added then 'green' else if part.removed then 'red' else 'grey' + v = part.value + delta += v[c] + cb "Failure in case #{dir}." + + "#{delta}", time_ms + else + cb null, time_ms + +run_all_case_dirs = (eng, cb) -> + start = Date.now() + case_dirs = fs.readdirSync "#{__dirname}/cases/" + for dir in case_dirs + await run_case_dir eng, "#{__dirname}/cases/#{dir}", defer err, ms + if err + console.log err + process.exit 1 + cb null, (Date.now() - start), case_dirs.length + +run_multiple_runs = (eng, num_runs, cb) -> + total_tests = 0 + start = Date.now() + for i in [0...num_runs] + await setTimeout defer(), 1 + await run_all_case_dirs regular_engine, defer err, time, tests_run + total_tests += tests_run + cb null, (Date.now() - start), total_tests + +run_express_test = (cb) -> + require('./express4/app').run -> + browser = new Browser() + browser.visit 'http://127.0.0.1:3033', (e) -> + if e + console.log e + $ = browser.window.$ + successes = $('.success').length + fails = $('.fail').length + if (fails is 0) and (successes > 0) + console.log "Express SUCCESS: #{successes} succeeded, #{fails} failed" + return cb() + console.log "BROWSER ERROR! Server left running at http://localhost:3033 for your convenience" + +# ---------------------------------------------------------------- +go = -> + await run_all_case_dirs regular_engine, defer err, time, tests_run + console.log "Regular Engine: SUCCESS for #{tests_run} cold tests in #{time}ms (#{(time/tests_run).toFixed 2}ms/test)" + await run_multiple_runs regular_engine, MULTI_RUNS, defer err, time, tests_run + console.log "Regular Engine: SUCCESS for #{tests_run} hot tests in #{time}ms (#{(time/tests_run).toFixed 2}ms/test)" + await run_express_test defer() + process.exit 0 + +if not module.parent? + go() + +else exports.test = go diff --git a/toffee.js b/toffee.js index af1c6ee..5d6b01c 100644 --- a/toffee.js +++ b/toffee.js @@ -1,8505 +1,205 @@ +var toffee; -(function(/*! Stitch !*/) { - if (!this.require) { - var modules = {}, cache = {}, require = function(name, root) { - var path = expand(root, name), module = cache[path], fn; - if (module) { - return module.exports; - } else if (fn = modules[path] || modules[path = expand(path, './index')]) { - module = {id: path, exports: {}}; - try { - cache[path] = module; - fn(module.exports, function(name) { - return require(name, dirname(path)); - }, module); - return module.exports; - } catch (err) { - delete cache[path]; - throw err; - } - } else { - throw 'module \'' + name + '\' not found'; - } - }, expand = function(root, name) { - var results = [], parts, part; - if (/^\.\.?(\/|$)/.test(name)) { - parts = [root, name].join('/').split('/'); - } else { - parts = name.split('/'); - } - for (var i = 0, length = parts.length; i < length; i++) { - part = parts[i]; - if (part == '..') { - results.pop(); - } else if (part != '.' && part != '') { - results.push(part); - } - } - return results.join('/'); - }, dirname = function(path) { - return path.split('/').slice(0, -1).join('/'); - }; - this.require = function(name) { - return require(name, ''); - } - this.require.define = function(bundle) { - for (var key in bundle) - modules[key] = bundle[key]; - }; - } - return this.require.define; -}).call(this)({"coffee-script/browser": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var CoffeeScript, runScripts; - - CoffeeScript = require('./coffee-script'); - - CoffeeScript.require = require; +if (typeof toffee === "undefined" || toffee === null) { + toffee = {}; +} - CoffeeScript["eval"] = function(code, options) { - if (options == null) { - options = {}; - } - if (options.bare == null) { - options.bare = true; - } - return eval(CoffeeScript.compile(code, options)); - }; +if (!toffee.templates) { + toffee.templates = {}; +} - CoffeeScript.run = function(code, options) { - if (options == null) { - options = {}; - } - options.bare = true; - return Function(CoffeeScript.compile(code, options))(); - }; +toffee.states = { + "TOFFEE": 1, + "COFFEE": 2 +}; - if (typeof window === "undefined" || window === null) { - return; +toffee.__json = function(locals, o, opts) { + opts || (opts = {}); + opts.indent || (opts.indent = ""); + if (o == null) { + return "null"; + } else { + return "" + JSON.stringify(o, null, opts.indent).replace(//g, '\\u003E').replace(/&/g, '\\u0026').replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029').replace(/\u200e/g, '\\u200e').replace(/\u200f/g, '\\u200f').replace(/\u202a/g, '\\u202a').replace(/\u202b/g, '\\u202b').replace(/\u202c/g, '\\u202c').replace(/\u202d/g, '\\u202d').replace(/\u202e/g, '\\u202e').replace(/\u206a/g, '\\u206a').replace(/\u206b/g, '\\u206b').replace(/\u206c/g, '\\u206c').replace(/\u206d/g, '\\u206d').replace(/\u206e/g, '\\u206e').replace(/\u206f/g, '\\u206f').replace(/\u2066/g, '\\u2066').replace(/\u2067/g, '\\u2067').replace(/\u2068/g, '\\u2068').replace(/\u2069/g, '\\u2069'); } +}; - CoffeeScript.load = function(url, callback) { - 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() { - var _ref; - if (xhr.readyState === 4) { - if ((_ref = xhr.status) === 0 || _ref === 200) { - CoffeeScript.run(xhr.responseText); - } else { - throw new Error("Could not load " + url); - } - if (callback) { - return callback(); - } - } - }; - return xhr.send(null); - }; +toffee.__raw = function(locals, o) { + return o; +}; - runScripts = function() { - var coffees, execute, index, length, s, scripts; - scripts = document.getElementsByTagName('script'); - coffees = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = scripts.length; _i < _len; _i++) { - s = scripts[_i]; - if (s.type === 'text/coffeescript') { - _results.push(s); - } - } - return _results; - })(); - index = 0; - length = coffees.length; - (execute = function() { - var script; - script = coffees[index++]; - if ((script != null ? script.type : void 0) === 'text/coffeescript') { - if (script.src) { - return CoffeeScript.load(script.src, execute); - } else { - CoffeeScript.run(script.innerHTML); - return execute(); - } - } - })(); - return null; - }; +toffee.__html = function(locals, o) { + return ("" + o).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/\u200e/g, '').replace(/\u200f/g, '').replace(/\u202a/g, '').replace(/\u202b/g, '').replace(/\u202c/g, '').replace(/\u202d/g, '').replace(/\u202e/g, '').replace(/\u206a/g, '').replace(/\u206b/g, '').replace(/\u206c/g, '').replace(/\u206d/g, '').replace(/\u206e/g, '').replace(/\u206f/g, '').replace(/\u2066/g, '').replace(/\u2067/g, '').replace(/\u2068/g, '').replace(/\u2069/g, ''); +}; - if (window.addEventListener) { - addEventListener('DOMContentLoaded', runScripts, false); +toffee.__escape = function(locals, o) { + var ae; + if (locals.__toffee.autoEscape != null) { + ae = locals.__toffee.autoEscape; + } else if (true) { + ae = true; } else { - attachEvent('onload', runScripts); + ae = true; } - -}).call(this); -}, "coffee-script/cake": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var CoffeeScript, cakefileDirectory, fatalError, 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() { - var arg, args, _i, _len, _ref, _results; - global.__originalDirname = fs.realpathSync('.'); - process.chdir(cakefileDirectory(__originalDirname)); - args = process.argv.slice(2); - CoffeeScript.run(fs.readFileSync('Cakefile').toString(), { - filename: 'Cakefile' - }); - oparse = new optparse.OptionParser(switches); - if (!args.length) { - return printTasks(); - } - try { - options = oparse.parse(args); - } catch (e) { - return fatalError("" + e); - } - _ref = options["arguments"]; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - arg = _ref[_i]; - _results.push(invoke(arg)); - } - return _results; - }; - - printTasks = function() { - var cakefilePath, desc, name, relative, spaces, task; - relative = path.relative || path.resolve; - cakefilePath = path.join(relative(__originalDirname, process.cwd()), 'Cakefile'); - console.log("" + cakefilePath + " defines the following tasks:\n"); - for (name in tasks) { - task = tasks[name]; - spaces = 20 - name.length; - spaces = spaces > 0 ? Array(spaces + 1).join(' ') : ''; - desc = task.description ? "# " + task.description : ''; - console.log("cake " + name + spaces + " " + desc); + if (ae) { + if (o === void 0) { + return ''; } - if (switches.length) { - return console.log(oparse.help()); + if ((o != null) && (typeof o) === "object") { + return locals.json(o); } - }; - - fatalError = function(message) { - console.error(message + '\n'); - console.log('To see a list of all tasks/options, run "cake"'); - return process.exit(1); - }; - - missingTask = function(task) { - return fatalError("No such task: " + task); - }; + return locals.html(o); + } + return o; +}; - cakefileDirectory = function(dir) { - var parent; - if (path.existsSync(path.join(dir, 'Cakefile'))) { - return dir; - } - parent = path.normalize(path.join(dir, '..')); - if (parent !== dir) { - return cakefileDirectory(parent); - } - throw new Error("Cakefile not found in " + (process.cwd())); +toffee.__augmentLocals = function(locals, bundle_path) { + var _l, _t; + _l = locals; + _t = _l.__toffee = { + out: [] }; - -}).call(this); -}, "coffee-script/coffee-script": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var Lexer, RESERVED, compile, fs, lexer, parser, path, vm, _ref, - __hasProp = {}.hasOwnProperty; - - fs = require('fs'); - - path = require('path'); - - _ref = require('./lexer'), Lexer = _ref.Lexer, RESERVED = _ref.RESERVED; - - parser = require('./parser').parser; - - vm = require('vm'); - - if (require.extensions) { - require.extensions['.coffee'] = function(module, filename) { - var content; - content = compile(fs.readFileSync(filename, 'utf8'), { - filename: filename - }); - return module._compile(content, filename); + if (_l.print == null) { + _l.print = function(o) { + return toffee.__print(_l, o); }; - } else if (require.registerExtension) { - require.registerExtension('.coffee', function(content) { - return compile(content); - }); } + if (_l.json == null) { + _l.json = function(o, opts) { + return toffee.__json(_l, o, opts); + }; + } + if (_l.raw == null) { + _l.raw = function(o) { + return toffee.__raw(_l, o); + }; + } + if (_l.html == null) { + _l.html = function(o) { + return toffee.__html(_l, o); + }; + } + if (_l.escape == null) { + _l.escape = function(o) { + return toffee.__escape(_l, o); + }; + } + if (_l.partial == null) { + _l.partial = function(path, vars) { + return toffee.__partial(toffee.templates["" + bundle_path], _l, path, vars); + }; + } + if (_l.snippet == null) { + _l.snippet = function(path, vars) { + return toffee.__snippet(toffee.templates["" + bundle_path], _l, path, vars); + }; + } + if (_l.load == null) { + _l.load = function(path, vars) { + return toffee.__load(toffee.templates["" + bundle_path], _l, path, vars); + }; + } + _t.print = _l.print; + _t.json = _l.json; + _t.raw = _l.raw; + _t.html = _l.html; + _t.escape = _l.escape; + _t.partial = _l.partial; + _t.snippet = _l.snippet; + return _t.load = _l.load; +}; - exports.VERSION = '1.3.1'; - - exports.RESERVED = RESERVED; - - exports.helpers = require('./helpers'); - - exports.compile = compile = function(code, options) { - var header, js, merge; - if (options == null) { - options = {}; - } - merge = exports.helpers.merge; - try { - js = (parser.parse(lexer.tokenize(code))).compile(options); - if (!options.header) { - return js; - } - } catch (err) { - if (options.filename) { - err.message = "In " + options.filename + ", " + err.message; - } - throw err; - } - header = "Generated by CoffeeScript " + this.VERSION; - return "// " + header + "\n" + js; - }; - - exports.tokens = function(code, options) { - return lexer.tokenize(code, options); - }; - - exports.nodes = function(source, options) { - if (typeof source === 'string') { - return parser.parse(lexer.tokenize(source, options)); - } else { - return parser.parse(source); - } - }; - - exports.run = function(code, options) { - var mainModule; - if (options == null) { - options = {}; - } - mainModule = require.main; - mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.'; - mainModule.moduleCache && (mainModule.moduleCache = {}); - mainModule.paths = require('module')._nodeModulePaths(path.dirname(fs.realpathSync(options.filename))); - if (path.extname(mainModule.filename) !== '.coffee' || require.extensions) { - return mainModule._compile(compile(code, options), mainModule.filename); - } else { - return mainModule._compile(code, mainModule.filename); - } - }; +toffee.__print = function(locals, o) { + if (locals.__toffee.state === toffee.states.COFFEE) { + locals.__toffee.out.push(o); + return ''; + } else { + return "" + o; + } +}; - exports["eval"] = function(code, options) { - var Module, Script, js, k, o, r, sandbox, v, _i, _len, _module, _ref1, _ref2, _require; - if (options == null) { - options = {}; - } - if (!(code = code.trim())) { - return; +toffee.__normalize = function(path) { + var np, part, parts, _i, _len; + if ((path == null) || path === "/") { + return path; + } else { + parts = path.split("/"); + np = []; + if (parts[0]) { + np.push(''); } - Script = vm.Script; - if (Script) { - if (options.sandbox != null) { - if (options.sandbox instanceof Script.createContext().constructor) { - sandbox = options.sandbox; + for (_i = 0, _len = parts.length; _i < _len; _i++) { + part = parts[_i]; + if (part === "..") { + if (np.length > 1) { + np.pop(); } else { - sandbox = Script.createContext(); - _ref1 = options.sandbox; - for (k in _ref1) { - if (!__hasProp.call(_ref1, k)) continue; - v = _ref1[k]; - sandbox[k] = v; - } - } - sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox; - } else { - sandbox = global; - } - sandbox.__filename = options.filename || 'eval'; - sandbox.__dirname = path.dirname(sandbox.__filename); - if (!(sandbox !== global || sandbox.module || sandbox.require)) { - Module = require('module'); - sandbox.module = _module = new Module(options.modulename || 'eval'); - sandbox.require = _require = function(path) { - return Module._load(path, _module, true); - }; - _module.filename = sandbox.__filename; - _ref2 = Object.getOwnPropertyNames(require); - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - r = _ref2[_i]; - if (r !== 'paths') { - _require[r] = require[r]; - } - } - _require.paths = _module.paths = Module._nodeModulePaths(process.cwd()); - _require.resolve = function(request) { - return Module._resolveFilename(request, _module); - }; - } - } - o = {}; - for (k in options) { - if (!__hasProp.call(options, k)) continue; - v = options[k]; - o[k] = v; - } - o.bare = true; - js = compile(code, o); - if (sandbox === global) { - return vm.runInThisContext(js); - } else { - return vm.runInContext(js, sandbox); - } - }; - - lexer = new Lexer; - - parser.lexer = { - lex: function() { - var tag, _ref1; - _ref1 = this.tokens[this.pos++] || [''], tag = _ref1[0], this.yytext = _ref1[1], this.yylineno = _ref1[2]; - return tag; - }, - setInput: function(tokens) { - this.tokens = tokens; - return this.pos = 0; - }, - upcomingInput: function() { - return ""; - } - }; - - parser.yy = require('./nodes'); - -}).call(this); -}, "coffee-script/command": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, forkNode, fs, helpers, hidden, joinTimeout, lint, loadRequires, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, sourceCode, sources, spawn, timeLog, unwatchDir, usage, version, wait, watch, watchDir, watchers, writeJs, _ref; - - fs = require('fs'); - - path = require('path'); - - helpers = require('./helpers'); - - optparse = require('./optparse'); - - CoffeeScript = require('./coffee-script'); - - _ref = require('child_process'), spawn = _ref.spawn, exec = _ref.exec; - - EventEmitter = require('events').EventEmitter; - - helpers.extend(CoffeeScript, new EventEmitter); - - printLine = function(line) { - return process.stdout.write(line + '\n'); - }; - - printWarn = function(line) { - return process.stderr.write(line + '\n'); - }; - - hidden = function(file) { - return /^\.|~$/.test(file); - }; - - BANNER = 'Usage: coffee [options] path/to/script.coffee -- [args]\n\nIf called without options, `coffee` will run your script.'; - - SWITCHES = [['-b', '--bare', 'compile without a top-level function wrapper'], ['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-e', '--eval', 'pass a string from the command line as input'], ['-h', '--help', 'display this help message'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-j', '--join [FILE]', 'concatenate the source CoffeeScript before compiling'], ['-l', '--lint', 'pipe the compiled JavaScript through JavaScript Lint'], ['-n', '--nodes', 'print out the parse tree that the parser produces'], ['--nodejs [ARGS]', 'pass options directly to the "node" binary'], ['-o', '--output [DIR]', 'set the output directory for compiled JavaScript'], ['-p', '--print', 'print out the compiled JavaScript'], ['-r', '--require [FILE*]', 'require a library before executing your script'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-t', '--tokens', 'print out the tokens that the lexer/rewriter produce'], ['-v', '--version', 'display the version number'], ['-w', '--watch', 'watch scripts for changes and rerun commands']]; - - opts = {}; - - sources = []; - - sourceCode = []; - - notSources = {}; - - watchers = {}; - - optionParser = null; - - exports.run = function() { - var literals, source, _i, _len, _results; - parseOptions(); - if (opts.nodejs) { - return forkNode(); - } - if (opts.help) { - return usage(); - } - if (opts.version) { - return version(); - } - if (opts.require) { - loadRequires(); - } - if (opts.interactive) { - return require('./repl'); - } - if (opts.watch && !fs.watch) { - return printWarn("The --watch feature depends on Node v0.6.0+. You are running " + process.version + "."); - } - if (opts.stdio) { - return compileStdio(); - } - if (opts["eval"]) { - return compileScript(null, sources[0]); - } - if (!sources.length) { - return require('./repl'); - } - literals = opts.run ? sources.splice(1) : []; - process.argv = process.argv.slice(0, 2).concat(literals); - process.argv[0] = 'coffee'; - process.execPath = require.main.filename; - _results = []; - for (_i = 0, _len = sources.length; _i < _len; _i++) { - source = sources[_i]; - _results.push(compilePath(source, true, path.normalize(source))); - } - return _results; - }; - - compilePath = function(source, topLevel, base) { - return fs.stat(source, function(err, stats) { - if (err && err.code !== 'ENOENT') { - throw err; - } - if ((err != null ? err.code : void 0) === 'ENOENT') { - if (topLevel && source.slice(-7) !== '.coffee') { - source = sources[sources.indexOf(source)] = "" + source + ".coffee"; - return compilePath(source, topLevel, base); - } - if (topLevel) { - console.error("File not found: " + source); - process.exit(1); - } - return; - } - if (stats.isDirectory()) { - if (opts.watch) { - watchDir(source, base); - } - return fs.readdir(source, function(err, files) { - var file, index, _i, _len, _ref1, _ref2, _results; - if (err && err.code !== 'ENOENT') { - throw err; - } - if ((err != null ? err.code : void 0) === 'ENOENT') { - return; - } - index = sources.indexOf(source); - [].splice.apply(sources, [index, index - index + 1].concat(_ref1 = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - _results.push(path.join(source, file)); - } - return _results; - })())), _ref1; - [].splice.apply(sourceCode, [index, index - index + 1].concat(_ref2 = files.map(function() { - return null; - }))), _ref2; - _results = []; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - if (!hidden(file)) { - _results.push(compilePath(path.join(source, file), false, base)); - } - } - return _results; - }); - } else if (topLevel || path.extname(source) === '.coffee') { - if (opts.watch) { - watch(source, base); + np.push(part); } - return fs.readFile(source, function(err, code) { - if (err && err.code !== 'ENOENT') { - throw err; - } - if ((err != null ? err.code : void 0) === 'ENOENT') { - return; - } - return compileScript(source, code.toString(), base); - }); - } else { - notSources[source] = true; - return removeSource(source, base); - } - }); - }; - - compileScript = function(file, input, base) { - var o, options, t, task; - o = opts; - options = compileOptions(file); - 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 printLine(CoffeeScript.nodes(t.input).toString().trim()); - } else if (o.run) { - return CoffeeScript.run(t.input, t.options); - } else if (o.join && t.file !== o.join) { - sourceCode[sources.indexOf(t.file)] = t.input; - return compileJoin(); } else { - t.output = CoffeeScript.compile(t.input, t.options); - CoffeeScript.emit('success', task); - if (o.print) { - return printLine(t.output.trim()); - } else if (o.compile) { - return writeJs(t.file, t.output, base); - } else if (o.lint) { - return lint(t.file, t.output); - } - } - } catch (err) { - CoffeeScript.emit('failure', err, task); - if (CoffeeScript.listeners('failure').length) { - return; - } - if (o.watch) { - return printLine(err.message + '\x07'); - } - printWarn(err instanceof Error && err.stack || ("ERROR: " + err)); - return process.exit(1); - } - }; - - compileStdio = function() { - var code, stdin; - code = ''; - stdin = process.openStdin(); - stdin.on('data', function(buffer) { - if (buffer) { - return code += buffer.toString(); - } - }); - return stdin.on('end', function() { - return compileScript(null, code); - }); - }; - - joinTimeout = null; - - compileJoin = function() { - if (!opts.join) { - return; - } - if (!sourceCode.some(function(code) { - return code === null; - })) { - clearTimeout(joinTimeout); - return joinTimeout = wait(100, function() { - return compileScript(opts.join, sourceCode.join('\n'), opts.join); - }); - } - }; - - loadRequires = function() { - var realFilename, req, _i, _len, _ref1; - realFilename = module.filename; - module.filename = '.'; - _ref1 = opts.require; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - req = _ref1[_i]; - require(req); - } - return module.filename = realFilename; - }; - - watch = function(source, base) { - var compile, compileTimeout, prevStats, rewatch, watchErr, watcher; - prevStats = null; - compileTimeout = null; - watchErr = function(e) { - if (e.code === 'ENOENT') { - if (sources.indexOf(source) === -1) { - return; + if (part !== ".") { + np.push(part); } - try { - rewatch(); - return compile(); - } catch (e) { - removeSource(source, base, true); - return compileJoin(); - } - } else { - throw e; } - }; - compile = function() { - clearTimeout(compileTimeout); - return compileTimeout = wait(25, function() { - return fs.stat(source, function(err, stats) { - if (err) { - return watchErr(err); - } - if (prevStats && stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) { - return rewatch(); - } - prevStats = stats; - return fs.readFile(source, function(err, code) { - if (err) { - return watchErr(err); - } - compileScript(source, code.toString(), base); - return rewatch(); - }); - }); - }); - }; - try { - watcher = fs.watch(source, compile); - } catch (e) { - watchErr(e); } - return rewatch = function() { - if (watcher != null) { - watcher.close(); - } - return watcher = fs.watch(source, compile); - }; - }; - - watchDir = function(source, base) { - var readdirTimeout, watcher; - readdirTimeout = null; - try { - return watcher = fs.watch(source, function() { - clearTimeout(readdirTimeout); - return readdirTimeout = wait(25, function() { - return fs.readdir(source, function(err, files) { - var file, _i, _len, _results; - if (err) { - if (err.code !== 'ENOENT') { - throw err; - } - watcher.close(); - return unwatchDir(source, base); - } - _results = []; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - if (!(!hidden(file) && !notSources[file])) { - continue; - } - file = path.join(source, file); - if (sources.some(function(s) { - return s.indexOf(file) >= 0; - })) { - continue; - } - sources.push(file); - sourceCode.push(null); - _results.push(compilePath(file, false, base)); - } - return _results; - }); - }); - }); - } catch (e) { - if (e.code !== 'ENOENT') { - throw e; - } + path = np.join("/"); + if (!path) { + path = "/"; } - }; + return path; + } +}; - unwatchDir = function(source, base) { - var file, prevSources, toRemove, _i, _len; - prevSources = sources.slice(0); - toRemove = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = sources.length; _i < _len; _i++) { - file = sources[_i]; - if (file.indexOf(source) >= 0) { - _results.push(file); - } - } - return _results; - })(); - for (_i = 0, _len = toRemove.length; _i < _len; _i++) { - file = toRemove[_i]; - removeSource(file, base, true); - } - if (!sources.some(function(s, i) { - return prevSources[i] !== s; - })) { - return; - } - return compileJoin(); - }; +toffee.__partial = function(parent_tmpl, parent_locals, path, vars) { + path = toffee.__normalize(parent_tmpl.bundlePath + "/../" + path); + return toffee.__inlineInclude(path, vars, parent_locals); +}; - removeSource = function(source, base, removeJs) { - var index, jsPath; - index = sources.indexOf(source); - sources.splice(index, 1); - sourceCode.splice(index, 1); - if (removeJs && !opts.join) { - jsPath = outputPath(source, base); - return path.exists(jsPath, function(exists) { - if (exists) { - return fs.unlink(jsPath, function(err) { - if (err && err.code !== 'ENOENT') { - throw err; - } - return timeLog("removed " + source); - }); - } - }); - } - }; +toffee.__snippet = function(parent_tmpl, parent_locals, path, vars) { + path = toffee.__normalize(parent_tmpl.bundlePath + "/../" + path); + vars = vars != null ? vars : {}; + vars.__toffee = vars.__toffee || {}; + vars.__toffee.noInheritance = true; + return toffee.__inlineInclude(path, vars, parent_locals); +}; - outputPath = function(source, base) { - var baseDir, dir, filename, srcDir; - filename = path.basename(source, path.extname(source)) + '.js'; - srcDir = path.dirname(source); - baseDir = base === '.' ? srcDir : srcDir.substring(base.length); - dir = opts.output ? path.join(opts.output, baseDir) : srcDir; - return path.join(dir, filename); - }; +toffee.__load = function(parent_tmpl, parent_locals, path, vars) { + path = toffee.__normalize(parent_tmpl.bundlePath + "/../" + path); + vars = vars != null ? vars : {}; + vars.__toffee = vars.__toffee || {}; + vars.__toffee.repress = true; + return toffee.__inlineInclude(path, vars, parent_locals); +}; - writeJs = function(source, js, base) { - var compile, jsDir, jsPath; - jsPath = outputPath(source, base); - jsDir = path.dirname(jsPath); - compile = function() { - if (js.length <= 0) { - js = ' '; - } - return fs.writeFile(jsPath, js, function(err) { - if (err) { - return printLine(err.message); - } else if (opts.compile && opts.watch) { - return timeLog("compiled " + source); +toffee.__inlineInclude = function(path, locals, parent_locals) { + var k, options, res, reserved, v, _i, _len, _ref, _ref1; + options = locals || {}; + options.passback = {}; + options.__toffee = options.__toffee || {}; + reserved = {}; + _ref = ["passback", "load", "print", "partial", "snippet", "layout", "__toffee", "postProcess"]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + k = _ref[_i]; + reserved[k] = true; + } + if (!options.__toffee.noInheritance) { + for (k in parent_locals) { + v = parent_locals[k]; + if ((locals != null ? locals[k] : void 0) == null) { + if (reserved[k] == null) { + options[k] = v; } - }); - }; - return path.exists(jsDir, function(exists) { - if (exists) { - return compile(); - } else { - return exec("mkdir -p " + jsDir, compile); - } - }); - }; - - wait = function(milliseconds, func) { - return setTimeout(func, milliseconds); - }; - - timeLog = function(message) { - return console.log("" + ((new Date).toLocaleTimeString()) + " - " + message); - }; - - lint = function(file, js) { - var conf, jsl, printIt; - printIt = function(buffer) { - return printLine(file + ':\t' + 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 strings, tag, token, value; - strings = (function() { - var _i, _len, _ref1, _results; - _results = []; - for (_i = 0, _len = tokens.length; _i < _len; _i++) { - token = tokens[_i]; - _ref1 = [token[0], token[1].toString().replace(/\n/, '\\n')], tag = _ref1[0], value = _ref1[1]; - _results.push("[" + tag + " " + value + "]"); } - return _results; - })(); - return printLine(strings.join(' ')); - }; - - parseOptions = function() { - var i, o, source, _i, _len; - 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)); - sources = o["arguments"]; - for (i = _i = 0, _len = sources.length; _i < _len; i = ++_i) { - source = sources[i]; - sourceCode[i] = null; } - }; - - compileOptions = function(filename) { - return { - filename: filename, - bare: opts.bare, - header: opts.compile - }; - }; - - forkNode = function() { - var args, nodeArgs; - nodeArgs = opts.nodejs.split(/\s+/); - args = process.argv.slice(1); - args.splice(args.indexOf('--nodejs'), 2); - return spawn(process.execPath, nodeArgs.concat(args), { - cwd: process.cwd(), - env: process.env, - customFds: [0, 1, 2] - }); - }; - - usage = function() { - return printLine((new optparse.OptionParser(SWITCHES, BANNER)).help()); - }; - - version = function() { - return printLine("CoffeeScript version " + CoffeeScript.VERSION); - }; - -}).call(this); -}, "coffee-script/grammar": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap; - - Parser = require('jison').Parser; - - unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/; - - o = function(patternString, action, options) { - var match; - patternString = patternString.replace(/\s{2,}/g, ' '); - if (!action) { - return [patternString, '$$ = $1;', options]; + } + if (!toffee.templates[path]) { + return "Inline toffee include: Could not find " + path; + } else { + res = toffee.templates[path].pub(options); + _ref1 = options.passback; + for (k in _ref1) { + v = _ref1[k]; + parent_locals[k] = v; } - action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())"; - action = action.replace(/\bnew /g, '$&yy.'); - action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&'); - return [patternString, "$$ = " + action + ";", options]; - }; - - grammar = { - Root: [ - o('', function() { - return new Block; - }), o('Body'), o('Block TERMINATOR') - ], - Body: [ - o('Line', function() { - return Block.wrap([$1]); - }), o('Body TERMINATOR Line', function() { - return $1.push($3); - }), o('Body TERMINATOR') - ], - Line: [o('Expression'), o('Statement')], - Statement: [ - o('Return'), o('Comment'), o('STATEMENT', 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('Class'), o('Throw')], - Block: [ - o('INDENT OUTDENT', function() { - return new Block; - }), o('INDENT Body OUTDENT', function() { - return $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('DEBUGGER', function() { - return new Literal($1); - }), o('BOOL', function() { - var val; - val = new Literal($1); - if ($1 === 'undefined') { - val.isUndefined = true; - } - return val; - }) - ], - Assign: [ - o('Assignable = Expression', function() { - return new Assign($1, $3); - }), o('Assignable = TERMINATOR Expression', function() { - return new Assign($1, $4); - }), o('Assignable = INDENT Expression OUTDENT', function() { - return new Assign($1, $4); - }) - ], - AssignObj: [ - o('ObjAssignable', function() { - return new Value($1); - }), o('ObjAssignable : Expression', function() { - return new Assign(new Value($1), $3, 'object'); - }), o('ObjAssignable :\ - INDENT Expression OUTDENT', function() { - return new Assign(new Value($1), $4, 'object'); - }), o('Comment') - ], - ObjAssignable: [o('Identifier'), o('AlphaNumeric'), o('ThisProperty')], - Return: [ - o('RETURN Expression', function() { - return new Return($2); - }), o('RETURN', function() { - return new Return; - }) - ], - Comment: [ - o('HERECOMMENT', function() { - return new Comment($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('ParamVar', function() { - return new Param($1); - }), o('ParamVar ...', function() { - return new Param($1, null, true); - }), o('ParamVar = Expression', function() { - return new Param($1, $3); - }) - ], - ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')], - Splat: [ - o('Expression ...', function() { - return new Splat($1); - }) - ], - SimpleAssignable: [ - o('Identifier', function() { - return new Value($1); - }), o('Value Accessor', function() { - return $1.add($2); - }), o('Invocation Accessor', function() { - return new Value($1, [].concat($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('. Identifier', function() { - return new Access($2); - }), o('?. Identifier', function() { - return new Access($2, 'soak'); - }), o(':: Identifier', function() { - return [new Access(new Literal('prototype')), new Access($2)]; - }), o('::', function() { - return new Access(new Literal('prototype')); - }), o('Index') - ], - Index: [ - o('INDEX_START IndexValue INDEX_END', function() { - return $2; - }), o('INDEX_SOAK Index', function() { - return extend($2, { - soak: true - }); - }) - ], - IndexValue: [ - o('Expression', function() { - return new Index($1); - }), o('Slice', function() { - return new Slice($1); - }) - ], - Object: [ - o('{ AssignList OptComma }', function() { - return new Obj($2, $1.generated); - }) - ], - 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', function() { - return new Class; - }), o('CLASS Block', function() { - return new Class(null, null, $2); - }), o('CLASS EXTENDS Expression', function() { - return new Class(null, $3); - }), o('CLASS EXTENDS Expression Block', function() { - return new Class(null, $3, $4); - }), o('CLASS SimpleAssignable', function() { - return new Class($2); - }), o('CLASS SimpleAssignable Block', function() { - return new Class($2, null, $3); - }), o('CLASS SimpleAssignable EXTENDS Expression', function() { - return new Class($2, $4); - }), o('CLASS SimpleAssignable EXTENDS Expression Block', function() { - return new Class($2, $4, $5); - }) - ], - 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')); - }) - ], - ThisProperty: [ - o('@ Identifier', function() { - return new Value(new Literal('this'), [new Access($2)], 'this'); - }) - ], - Array: [ - o('[ ]', function() { - return new Arr([]); - }), o('[ ArgList OptComma ]', function() { - return new Arr($2); - }) - ], - RangeDots: [ - o('..', function() { - return 'inclusive'; - }), o('...', function() { - return 'exclusive'; - }) - ], - Range: [ - o('[ Expression RangeDots Expression ]', function() { - return new Range($2, $4, $3); - }) - ], - Slice: [ - o('Expression RangeDots Expression', function() { - return new Range($1, $3, $2); - }), o('Expression RangeDots', function() { - return new Range($1, null, $2); - }), o('RangeDots Expression', function() { - return new Range(null, $2, $1); - }), o('RangeDots', function() { - return new Range(null, null, $1); - }) - ], - 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('( Body )', function() { - return new Parens($2); - }), o('( INDENT Body OUTDENT )', function() { - return new Parens($3); - }) - ], - 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(Block.wrap([$1])); - }), o('Expression WhileSource', function() { - return $2.addBody(Block.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(Block.wrap([$2])); - }) - ], - For: [ - o('Statement ForBody', function() { - return new For($1, $2); - }), o('Expression ForBody', function() { - return new For($1, $2); - }), o('ForBody Block', function() { - return new For($2, $1); - }) - ], - ForBody: [ - o('FOR Range', function() { - return { - source: new Value($2) - }; - }), o('ForStart ForSource', function() { - $2.own = $1.own; - $2.name = $1[0]; - $2.index = $1[1]; - return $2; - }) - ], - ForStart: [ - o('FOR ForVariables', function() { - return $2; - }), o('FOR OWN ForVariables', function() { - $3.own = 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, { - type: $1 - }); - }), o('IfBlock ELSE IF Expression Block', function() { - return $1.addElse(new If($4, $5, { - type: $3 - })); - }) - ], - If: [ - o('IfBlock'), o('IfBlock ELSE Block', function() { - return $1.addElse($3); - }), o('Statement POST_IF Expression', function() { - return new If($3, Block.wrap([$1]), { - type: $2, - statement: true - }); - }), o('Expression POST_IF Expression', function() { - return new If($3, Block.wrap([$1]), { - type: $2, - statement: 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 ?', function() { - return new Existence($1); - }), 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('Expression RELATION Expression', function() { - if ($2.charAt(0) === '!') { - return new Op($2.slice(1), $1, $3).invert(); - } else { - return new Op($2, $1, $3); - } - }), o('SimpleAssignable COMPOUND_ASSIGN\ - Expression', function() { - return new Assign($1, $3, $2); - }), o('SimpleAssignable COMPOUND_ASSIGN\ - INDENT Expression OUTDENT', function() { - return new Assign($1, $4, $2); - }), o('SimpleAssignable EXTENDS Expression', function() { - return new Extends($1, $3); - }) - ] - }; - - operators = [['left', '.', '?.', '::'], ['left', 'CALL_START', 'CALL_END'], ['nonassoc', '++', '--'], ['left', '?'], ['right', 'UNARY'], ['left', 'MATH'], ['left', '+', '-'], ['left', 'SHIFT'], ['left', 'RELATION'], ['left', 'COMPARE'], ['left', 'LOGIC'], ['nonassoc', 'INDENT', 'OUTDENT'], ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS'], ['right', 'FORIN', 'FOROF', 'BY', 'WHEN'], ['right', 'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS'], ['right', 'POST_IF']]; - - tokens = []; - - for (name in grammar) { - alternatives = grammar[name]; - grammar[name] = (function() { - var _i, _j, _len, _len1, _ref, _results; - _results = []; - for (_i = 0, _len = alternatives.length; _i < _len; _i++) { - alt = alternatives[_i]; - _ref = alt[0].split(' '); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - token = _ref[_j]; - if (!grammar[token]) { - tokens.push(token); - } - } - if (name === 'Root') { - alt[1] = "return " + alt[1]; - } - _results.push(alt); - } - return _results; - })(); + return res; } - - exports.parser = new Parser({ - tokens: tokens.join(' '), - bnf: grammar, - operators: operators.reverse(), - startSymbol: 'Root' - }); - -}).call(this); -}, "coffee-script/helpers": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var extend, flatten; - - 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 item, _i, _len, _results; - _results = []; - for (_i = 0, _len = array.length; _i < _len; _i++) { - item = array[_i]; - if (item) { - _results.push(item); - } - } - return _results; - }; - - exports.count = function(string, substr) { - var num, pos; - num = pos = 0; - if (!substr.length) { - return 1 / 0; - } - while (pos = 1 + string.indexOf(substr, 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 element, flattened, _i, _len; - 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); -}, "coffee-script/index": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var key, val, _ref; - - _ref = require('./coffee-script'); - for (key in _ref) { - val = _ref[key]; - exports[key] = val; - } - -}).call(this); -}, "coffee-script/lexer": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref, _ref1, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - _ref = require('./rewriter'), Rewriter = _ref.Rewriter, INVERSES = _ref.INVERSES; - - _ref1 = require('./helpers'), count = _ref1.count, starts = _ref1.starts, compact = _ref1.compact, last = _ref1.last; - - exports.Lexer = Lexer = (function() { - - Lexer.name = 'Lexer'; - - function Lexer() {} - - Lexer.prototype.tokenize = function(code, opts) { - var i, tag; - if (opts == null) { - opts = {}; - } - if (WHITESPACE.test(code)) { - code = "\n" + code; - } - code = code.replace(/\r/g, '').replace(TRAILING_SPACES, ''); - this.code = code; - this.line = opts.line || 0; - this.indent = 0; - this.indebt = 0; - this.outdebt = 0; - this.indents = []; - this.ends = []; - this.tokens = []; - i = 0; - while (this.chunk = code.slice(i)) { - i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken(); - } - this.closeIndentation(); - if (tag = this.ends.pop()) { - this.error("missing " + tag); - } - if (opts.rewrite === false) { - return this.tokens; - } - return (new Rewriter).rewrite(this.tokens); - }; - - Lexer.prototype.identifierToken = function() { - var colon, forcedIdentifier, id, input, match, prev, tag, _ref2, _ref3; - if (!(match = IDENTIFIER.exec(this.chunk))) { - return 0; - } - input = match[0], id = match[1], colon = match[2]; - if (id === 'own' && this.tag() === 'FOR') { - this.token('OWN', id); - return id.length; - } - forcedIdentifier = colon || (prev = last(this.tokens)) && (((_ref2 = prev[0]) === '.' || _ref2 === '?.' || _ref2 === '::') || !prev.spaced && prev[0] === '@'); - tag = 'IDENTIFIER'; - if (!forcedIdentifier && (__indexOf.call(JS_KEYWORDS, id) >= 0 || __indexOf.call(COFFEE_KEYWORDS, id) >= 0)) { - tag = id.toUpperCase(); - if (tag === 'WHEN' && (_ref3 = this.tag(), __indexOf.call(LINE_BREAK, _ref3) >= 0)) { - tag = 'LEADING_WHEN'; - } else if (tag === 'FOR') { - this.seenFor = true; - } else if (tag === 'UNLESS') { - tag = 'IF'; - } else if (__indexOf.call(UNARY, tag) >= 0) { - tag = 'UNARY'; - } else if (__indexOf.call(RELATION, tag) >= 0) { - if (tag !== 'INSTANCEOF' && this.seenFor) { - tag = 'FOR' + tag; - this.seenFor = false; - } else { - tag = 'RELATION'; - if (this.value() === '!') { - this.tokens.pop(); - id = '!' + id; - } - } - } - } - if (__indexOf.call(JS_FORBIDDEN, id) >= 0) { - if (forcedIdentifier) { - tag = 'IDENTIFIER'; - id = new String(id); - id.reserved = true; - } else if (__indexOf.call(RESERVED, id) >= 0) { - this.error("reserved word \"" + id + "\""); - } - } - if (!forcedIdentifier) { - if (__indexOf.call(COFFEE_ALIASES, id) >= 0) { - id = COFFEE_ALIAS_MAP[id]; - } - tag = (function() { - switch (id) { - case '!': - return 'UNARY'; - case '==': - case '!=': - return 'COMPARE'; - case '&&': - case '||': - return 'LOGIC'; - case 'true': - case 'false': - case 'null': - case 'undefined': - return 'BOOL'; - case 'break': - case 'continue': - return 'STATEMENT'; - default: - return tag; - } - })(); - } - this.token(tag, id); - if (colon) { - this.token(':', ':'); - } - return input.length; - }; - - Lexer.prototype.numberToken = function() { - var binaryLiteral, lexedLength, match, number, octalLiteral; - if (!(match = NUMBER.exec(this.chunk))) { - return 0; - } - number = match[0]; - if (/^0[BOX]/.test(number)) { - this.error("radix prefix '" + number + "' must be lowercase"); - } else if (/E/.test(number) && !/^0x/.test(number)) { - this.error("exponential notation '" + number + "' must be indicated with a lowercase 'e'"); - } else if (/^0\d*[89]/.test(number)) { - this.error("decimal literal '" + number + "' must not be prefixed with '0'"); - } else if (/^0\d+/.test(number)) { - this.error("octal literal '" + number + "' must be prefixed with '0o'"); - } - lexedLength = number.length; - if (octalLiteral = /^0o([0-7]+)/.exec(number)) { - number = '0x' + (parseInt(octalLiteral[1], 8)).toString(16); - } - if (binaryLiteral = /^0b([01]+)/.exec(number)) { - number = '0x' + (parseInt(binaryLiteral[1], 2)).toString(16); - } - this.token('NUMBER', number); - return lexedLength; - }; - - Lexer.prototype.stringToken = function() { - var match, octalEsc, string; - switch (this.chunk.charAt(0)) { - case "'": - if (!(match = SIMPLESTR.exec(this.chunk))) { - return 0; - } - this.token('STRING', (string = match[0]).replace(MULTILINER, '\\\n')); - break; - case '"': - if (!(string = this.balancedString(this.chunk, '"'))) { - return 0; - } - if (0 < string.indexOf('#{', 1)) { - this.interpolateString(string.slice(1, -1)); - } else { - this.token('STRING', this.escapeLines(string)); - } - break; - default: - return 0; - } - if (octalEsc = /^(?:\\.|[^\\])*\\[0-7]/.test(string)) { - this.error("octal escape sequences " + string + " are not allowed"); - } - this.line += count(string, '\n'); - return string.length; - }; - - Lexer.prototype.heredocToken = function() { - var doc, heredoc, match, quote; - if (!(match = HEREDOC.exec(this.chunk))) { - return 0; - } - 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'); - return heredoc.length; - }; - - Lexer.prototype.commentToken = function() { - var comment, here, match; - if (!(match = this.chunk.match(COMMENT))) { - return 0; - } - comment = match[0], here = match[1]; - if (here) { - this.token('HERECOMMENT', this.sanitizeHeredoc(here, { - herecomment: true, - indent: Array(this.indent + 1).join(' ') - })); - } - this.line += count(comment, '\n'); - return comment.length; - }; - - Lexer.prototype.jsToken = function() { - var match, script; - if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) { - return 0; - } - this.token('JS', (script = match[0]).slice(1, -1)); - return script.length; - }; - - Lexer.prototype.regexToken = function() { - var flags, length, match, prev, regex, _ref2, _ref3; - if (this.chunk.charAt(0) !== '/') { - return 0; - } - if (match = HEREGEX.exec(this.chunk)) { - length = this.heregexToken(match); - this.line += count(match[0], '\n'); - return length; - } - prev = last(this.tokens); - if (prev && (_ref2 = prev[0], __indexOf.call((prev.spaced ? NOT_REGEX : NOT_SPACED_REGEX), _ref2) >= 0)) { - return 0; - } - if (!(match = REGEX.exec(this.chunk))) { - return 0; - } - _ref3 = match, match = _ref3[0], regex = _ref3[1], flags = _ref3[2]; - if (regex.slice(0, 2) === '/*') { - this.error('regular expressions cannot begin with `*`'); - } - if (regex === '//') { - regex = '/(?:)/'; - } - this.token('REGEX', "" + regex + flags); - return match.length; - }; - - Lexer.prototype.heregexToken = function(match) { - var body, flags, heregex, re, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4, _ref5; - heregex = match[0], body = match[1], flags = match[2]; - if (0 > body.indexOf('#{')) { - re = body.replace(HEREGEX_OMIT, '').replace(/\//g, '\\/'); - if (re.match(/^\*/)) { - this.error('regular expressions cannot begin with `*`'); - } - this.token('REGEX', "/" + (re || '(?:)') + "/" + flags); - return heregex.length; - } - this.token('IDENTIFIER', 'RegExp'); - this.tokens.push(['CALL_START', '(']); - tokens = []; - _ref2 = this.interpolateString(body, { - regex: true - }); - for (_i = 0, _len = _ref2.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] : void 0) !== 'STRING') { - this.tokens.push(['STRING', '""'], ['+', '+']); - } - (_ref5 = this.tokens).push.apply(_ref5, tokens); - if (flags) { - this.tokens.push([',', ','], ['STRING', '"' + flags + '"']); - } - this.token(')', ')'); - return heregex.length; - }; - - Lexer.prototype.lineToken = function() { - var diff, indent, match, noNewlines, prev, size; - if (!(match = MULTI_DENT.exec(this.chunk))) { - return 0; - } - indent = match[0]; - this.line += count(indent, '\n'); - this.seenFor = false; - prev = last(this.tokens, 1); - size = indent.length - 1 - indent.lastIndexOf('\n'); - noNewlines = this.unfinished(); - if (size - this.indebt === this.indent) { - if (noNewlines) { - this.suppressNewlines(); - } else { - this.newlineToken(); - } - return indent.length; - } - if (size > this.indent) { - if (noNewlines) { - this.indebt = size - this.indent; - this.suppressNewlines(); - return indent.length; - } - diff = size - this.indent + this.outdebt; - this.token('INDENT', diff); - this.indents.push(diff); - this.ends.push('OUTDENT'); - this.outdebt = this.indebt = 0; - } else { - this.indebt = 0; - this.outdentToken(this.indent - size, noNewlines); - } - this.indent = size; - return indent.length; - }; - - Lexer.prototype.outdentToken = function(moveOut, noNewlines) { - var dent, len; - while (moveOut > 0) { - len = this.indents.length - 1; - if (this.indents[len] === void 0) { - 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.pair('OUTDENT'); - this.token('OUTDENT', dent); - } - } - if (dent) { - this.outdebt -= moveOut; - } - while (this.value() === ';') { - this.tokens.pop(); - } - if (!(this.tag() === 'TERMINATOR' || noNewlines)) { - this.token('TERMINATOR', '\n'); - } - return this; - }; - - Lexer.prototype.whitespaceToken = function() { - var match, nline, prev; - if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\n'))) { - return 0; - } - prev = last(this.tokens); - if (prev) { - prev[match ? 'spaced' : 'newLine'] = true; - } - if (match) { - return match[0].length; - } else { - return 0; - } - }; - - Lexer.prototype.newlineToken = function() { - while (this.value() === ';') { - this.tokens.pop(); - } - if (this.tag() !== 'TERMINATOR') { - this.token('TERMINATOR', '\n'); - } - return this; - }; - - Lexer.prototype.suppressNewlines = function() { - if (this.value() === '\\') { - this.tokens.pop(); - } - return this; - }; - - Lexer.prototype.literalToken = function() { - var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5; - if (match = OPERATOR.exec(this.chunk)) { - value = match[0]; - if (CODE.test(value)) { - this.tagParameters(); - } - } else { - value = this.chunk.charAt(0); - } - tag = value; - prev = last(this.tokens); - if (value === '=' && prev) { - if (!prev[1].reserved && (_ref2 = prev[1], __indexOf.call(JS_FORBIDDEN, _ref2) >= 0)) { - this.error("reserved word \"" + (this.value()) + "\" can't be assigned"); - } - if ((_ref3 = prev[1]) === '||' || _ref3 === '&&') { - prev[0] = 'COMPOUND_ASSIGN'; - prev[1] += '='; - return value.length; - } - } - if (value === ';') { - this.seenFor = false; - tag = 'TERMINATOR'; - } else if (__indexOf.call(MATH, value) >= 0) { - tag = 'MATH'; - } else if (__indexOf.call(COMPARE, value) >= 0) { - tag = 'COMPARE'; - } else if (__indexOf.call(COMPOUND_ASSIGN, value) >= 0) { - tag = 'COMPOUND_ASSIGN'; - } else if (__indexOf.call(UNARY, value) >= 0) { - tag = 'UNARY'; - } else if (__indexOf.call(SHIFT, value) >= 0) { - tag = 'SHIFT'; - } else if (__indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : void 0)) { - tag = 'LOGIC'; - } else if (prev && !prev.spaced) { - if (value === '(' && (_ref4 = prev[0], __indexOf.call(CALLABLE, _ref4) >= 0)) { - if (prev[0] === '?') { - prev[0] = 'FUNC_EXIST'; - } - tag = 'CALL_START'; - } else if (value === '[' && (_ref5 = prev[0], __indexOf.call(INDEXABLE, _ref5) >= 0)) { - tag = 'INDEX_START'; - switch (prev[0]) { - case '?': - prev[0] = 'INDEX_SOAK'; - } - } - } - switch (value) { - case '(': - case '{': - case '[': - this.ends.push(INVERSES[value]); - break; - case ')': - case '}': - case ']': - this.pair(value); - } - this.token(tag, value); - return value.length; - }; - - Lexer.prototype.sanitizeHeredoc = function(doc, options) { - var attempt, herecomment, indent, match, _ref2; - indent = options.indent, herecomment = options.herecomment; - if (herecomment) { - if (HEREDOC_ILLEGAL.test(doc)) { - this.error("block comment cannot contain \"*/\", starting"); - } - if (doc.indexOf('\n') <= 0) { - return doc; - } - } else { - 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, stack, tok, tokens; - if (this.tag() !== ')') { - return this; - } - stack = []; - tokens = this.tokens; - i = tokens.length; - tokens[--i][0] = 'PARAM_END'; - while (tok = tokens[--i]) { - switch (tok[0]) { - case ')': - stack.push(tok); - break; - case '(': - case 'CALL_START': - if (stack.length) { - stack.pop(); - } else if (tok[0] === '(') { - tok[0] = 'PARAM_START'; - return this; - } else { - return this; - } - } - } - return this; - }; - - Lexer.prototype.closeIndentation = function() { - return this.outdentToken(this.indent); - }; - - Lexer.prototype.balancedString = function(str, end) { - var continueCount, i, letter, match, prev, stack, _i, _ref2; - continueCount = 0; - stack = [end]; - for (i = _i = 1, _ref2 = str.length; 1 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 1 <= _ref2 ? ++_i : --_i) { - if (continueCount) { - --continueCount; - continue; - } - switch (letter = str.charAt(i)) { - case '\\': - ++continueCount; - continue; - case end: - stack.pop(); - if (!stack.length) { - return str.slice(0, i + 1 || 9e9); - } - end = stack[stack.length - 1]; - continue; - } - if (end === '}' && (letter === '"' || letter === "'")) { - stack.push(end = letter); - } else if (end === '}' && letter === '/' && (match = HEREGEX.exec(str.slice(i)) || REGEX.exec(str.slice(i)))) { - continueCount += match[0].length - 1; - } else if (end === '}' && letter === '{') { - stack.push(end = '}'); - } else if (end === '"' && prev === '#' && letter === '{') { - stack.push(end = '}'); - } - prev = letter; - } - return this.error("missing " + (stack.pop()) + ", starting"); - }; - - Lexer.prototype.interpolateString = function(str, options) { - var expr, heredoc, i, inner, interpolated, len, letter, nested, pi, regex, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4; - if (options == null) { - options = {}; - } - heredoc = options.heredoc, regex = options.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(['NEOSTRING', str.slice(pi, i)]); - } - inner = expr.slice(1, -1); - if (inner.length) { - nested = new Lexer().tokenize(inner, { - line: this.line, - rewrite: false - }); - nested.pop(); - if (((_ref2 = nested[0]) != null ? _ref2[0] : void 0) === 'TERMINATOR') { - nested.shift(); - } - if (len = nested.length) { - if (len > 1) { - nested.unshift(['(', '(', this.line]); - nested.push([')', ')', this.line]); - } - tokens.push(['TOKENS', nested]); - } - } - i += expr.length; - pi = i + 1; - } - if ((i > pi && pi < str.length)) { - tokens.push(['NEOSTRING', str.slice(pi)]); - } - if (regex) { - return tokens; - } - if (!tokens.length) { - return this.token('STRING', '""'); - } - if (tokens[0][0] !== 'NEOSTRING') { - tokens.unshift(['', '']); - } - if (interpolated = tokens.length > 1) { - this.token('(', '('); - } - for (i = _i = 0, _len = tokens.length; _i < _len; i = ++_i) { - _ref3 = tokens[i], tag = _ref3[0], value = _ref3[1]; - if (i) { - this.token('+', '+'); - } - if (tag === 'TOKENS') { - (_ref4 = this.tokens).push.apply(_ref4, value); - } else { - this.token('STRING', this.makeString(value, '"', heredoc)); - } - } - if (interpolated) { - this.token(')', ')'); - } - return tokens; - }; - - Lexer.prototype.pair = function(tag) { - var size, wanted; - if (tag !== (wanted = last(this.ends))) { - if ('OUTDENT' !== wanted) { - this.error("unmatched " + tag); - } - this.indent -= size = last(this.indents); - this.outdentToken(size, true); - return this.pair(tag); - } - return this.ends.pop(); - }; - - 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 ? tok[0] = tag : tok[0]); - }; - - Lexer.prototype.value = function(index, val) { - var tok; - return (tok = last(this.tokens, index)) && (val ? tok[1] = val : tok[1]); - }; - - Lexer.prototype.unfinished = function() { - var _ref2; - return LINE_CONTINUER.test(this.chunk) || ((_ref2 = this.tag()) === '\\' || _ref2 === '.' || _ref2 === '?.' || _ref2 === 'UNARY' || _ref2 === 'MATH' || _ref2 === '+' || _ref2 === '-' || _ref2 === 'SHIFT' || _ref2 === 'RELATION' || _ref2 === 'COMPARE' || _ref2 === 'LOGIC' || _ref2 === 'THROW' || _ref2 === 'EXTENDS'); - }; - - 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) { - if (contents === '\n' || contents === quote) { - return contents; - } else { - return match; - } - }); - body = body.replace(RegExp("" + quote, "g"), '\\$&'); - return quote + this.escapeLines(body, heredoc) + quote; - }; - - Lexer.prototype.error = function(message) { - throw SyntaxError("" + message + " on line " + (this.line + 1)); - }; - - return Lexer; - - })(); - - JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super']; - - COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']; - - COFFEE_ALIAS_MAP = { - and: '&&', - or: '||', - is: '==', - isnt: '!=', - not: '!', - yes: 'true', - no: 'false', - on: 'true', - off: 'false' - }; - - COFFEE_ALIASES = (function() { - var _results; - _results = []; - for (key in COFFEE_ALIAS_MAP) { - _results.push(key); - } - return _results; - })(); - - COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES); - - RESERVED = ['case', 'default', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'export', 'import', 'native', '__hasProp', '__extends', '__slice', '__bind', '__indexOf', 'implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static', 'yield']; - - STRICT_PROSCRIBED = ['arguments', 'eval']; - - JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED); - - exports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS).concat(STRICT_PROSCRIBED); - - exports.STRICT_PROSCRIBED = STRICT_PROSCRIBED; - - IDENTIFIER = /^([$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)([^\n\S]*:(?!:))?/; - - NUMBER = /^0b[01]+|^0o[0-7]+|^0x[\da-f]+|^\d*\.?\d+(?:e[+-]?\d+)?/i; - - HEREDOC = /^("""|''')([\s\S]*?)(?:\n[^\n\S]*)?\1/; - - OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/; - - WHITESPACE = /^[^\n\S]+/; - - COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/; - - CODE = /^[-=]>/; - - MULTI_DENT = /^(?:\n[^\n\S]*)+/; - - SIMPLESTR = /^'[^\\']*(?:\\.[^\\']*)*'/; - - JSTOKEN = /^`[^\\`]*(?:\\.[^\\`]*)*`/; - - REGEX = /^(\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)([imgy]{0,4})(?!\w)/; - - HEREGEX = /^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?!\w)/; - - HEREGEX_OMIT = /\s+(?:#.*)?/g; - - MULTILINER = /\n/g; - - HEREDOC_INDENT = /\n+([^\n\S]*)/g; - - HEREDOC_ILLEGAL = /\*\//; - - LINE_CONTINUER = /^\s*(?:,|\??\.(?![.\d])|::)/; - - TRAILING_SPACES = /\s+$/; - - COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']; - - UNARY = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO']; - - LOGIC = ['&&', '||', '&', '|', '^']; - - SHIFT = ['<<', '>>', '>>>']; - - COMPARE = ['==', '!=', '<', '>', '<=', '>=']; - - MATH = ['*', '/', '%']; - - RELATION = ['IN', 'OF', 'INSTANCEOF']; - - BOOL = ['TRUE', 'FALSE', 'NULL', 'UNDEFINED']; - - NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', '++', '--', ']']; - - NOT_SPACED_REGEX = NOT_REGEX.concat(')', '}', 'THIS', 'IDENTIFIER', 'STRING'); - - CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER']; - - INDEXABLE = CALLABLE.concat('NUMBER', 'BOOL'); - - LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']; - -}).call(this); -}, "coffee-script/nodes": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var Access, Arr, Assign, Base, Block, Call, Class, Closure, Code, Comment, Existence, Extends, For, IDENTIFIER, IDENTIFIER_STR, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, Obj, Op, Param, Parens, RESERVED, Range, Return, SIMPLENUM, STRICT_PROSCRIBED, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, compact, del, ends, extend, flatten, last, merge, multident, starts, unfoldSoak, utility, _ref, _ref1, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Scope = require('./scope').Scope; - - _ref = require('./lexer'), RESERVED = _ref.RESERVED, STRICT_PROSCRIBED = _ref.STRICT_PROSCRIBED; - - _ref1 = require('./helpers'), compact = _ref1.compact, flatten = _ref1.flatten, extend = _ref1.extend, merge = _ref1.merge, del = _ref1.del, starts = _ref1.starts, ends = _ref1.ends, last = _ref1.last; - - exports.extend = extend; - - YES = function() { - return true; - }; - - NO = function() { - return false; - }; - - THIS = function() { - return this; - }; - - NEGATE = function() { - this.negated = !this.negated; - return this; - }; - - exports.Base = Base = (function() { - - Base.name = 'Base'; - - function Base() {} - - Base.prototype.compile = function(o, lvl) { - var node; - o = extend({}, o); - if (lvl) { - o.level = lvl; - } - node = this.unfoldSoak(o) || this; - node.tab = o.indent; - if (o.level === LEVEL_TOP || !node.isStatement(o)) { - return node.compileNode(o); - } else { - return node.compileClosure(o); - } - }; - - Base.prototype.compileClosure = function(o) { - if (this.jumps()) { - throw SyntaxError('cannot use a pure statement in an expression.'); - } - o.sharedScope = true; - return Closure.wrap(this).compileNode(o); - }; - - Base.prototype.cache = function(o, level, reused) { - var ref, sub; - if (!this.isComplex()) { - ref = level ? this.compile(o, level) : this; - return [ref, ref]; - } else { - ref = new Literal(reused || o.scope.freeVariable('ref')); - sub = new Assign(ref, this); - if (level) { - return [sub.compile(o, level), ref.value]; - } else { - return [sub, ref]; - } - } - }; - - Base.prototype.compileLoopReference = function(o, name) { - var src, tmp; - src = tmp = this.compile(o, LEVEL_LIST); - if (!((-Infinity < +src && +src < Infinity) || IDENTIFIER.test(src) && o.scope.check(src, true))) { - src = "" + (tmp = o.scope.freeVariable(name)) + " = " + src; - } - return [src, tmp]; - }; - - Base.prototype.makeReturn = function(res) { - var me; - me = this.unwrapAll(); - if (res) { - return new Call(new Literal("" + res + ".push"), [me]); - } else { - return new Return(me); - } - }; - - Base.prototype.contains = function(pred) { - var contains; - contains = false; - this.traverseChildren(false, function(node) { - if (pred(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.lastNonComment = function(list) { - var i; - i = list.length; - while (i--) { - if (!(list[i] instanceof Comment)) { - return list[i]; - } - } - return null; - }; - - Base.prototype.toString = function(idt, name) { - var tree; - if (idt == null) { - idt = ''; - } - if (name == null) { - name = this.constructor.name; - } - tree = '\n' + idt + name; - if (this.soak) { - tree += '?'; - } - this.eachChild(function(node) { - return tree += node.toString(idt + TAB); - }); - return tree; - }; - - Base.prototype.eachChild = function(func) { - var attr, child, _i, _j, _len, _len1, _ref2, _ref3; - if (!this.children) { - return this; - } - _ref2 = this.children; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - attr = _ref2[_i]; - if (this[attr]) { - _ref3 = flatten([this[attr]]); - for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { - child = _ref3[_j]; - if (func(child) === false) { - return this; - } - } - } - } - return this; - }; - - Base.prototype.traverseChildren = function(crossScope, func) { - return this.eachChild(function(child) { - if (func(child) === false) { - return false; - } - return child.traverseChildren(crossScope, func); - }); - }; - - Base.prototype.invert = function() { - return new Op('!', this); - }; - - Base.prototype.unwrapAll = function() { - var node; - node = this; - while (node !== (node = node.unwrap())) { - continue; - } - return node; - }; - - Base.prototype.children = []; - - Base.prototype.isStatement = NO; - - Base.prototype.jumps = NO; - - Base.prototype.isComplex = YES; - - Base.prototype.isChainable = NO; - - Base.prototype.isAssignable = NO; - - Base.prototype.unwrap = THIS; - - Base.prototype.unfoldSoak = NO; - - Base.prototype.assigns = NO; - - return Base; - - })(); - - exports.Block = Block = (function(_super) { - - __extends(Block, _super); - - Block.name = 'Block'; - - function Block(nodes) { - this.expressions = compact(flatten(nodes || [])); - } - - Block.prototype.children = ['expressions']; - - Block.prototype.push = function(node) { - this.expressions.push(node); - return this; - }; - - Block.prototype.pop = function() { - return this.expressions.pop(); - }; - - Block.prototype.unshift = function(node) { - this.expressions.unshift(node); - return this; - }; - - Block.prototype.unwrap = function() { - if (this.expressions.length === 1) { - return this.expressions[0]; - } else { - return this; - } - }; - - Block.prototype.isEmpty = function() { - return !this.expressions.length; - }; - - Block.prototype.isStatement = function(o) { - var exp, _i, _len, _ref2; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - exp = _ref2[_i]; - if (exp.isStatement(o)) { - return true; - } - } - return false; - }; - - Block.prototype.jumps = function(o) { - var exp, _i, _len, _ref2; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - exp = _ref2[_i]; - if (exp.jumps(o)) { - return exp; - } - } - }; - - Block.prototype.makeReturn = function(res) { - var expr, len; - len = this.expressions.length; - while (len--) { - expr = this.expressions[len]; - if (!(expr instanceof Comment)) { - this.expressions[len] = expr.makeReturn(res); - if (expr instanceof Return && !expr.expression) { - this.expressions.splice(len, 1); - } - break; - } - } - return this; - }; - - Block.prototype.compile = function(o, level) { - if (o == null) { - o = {}; - } - if (o.scope) { - return Block.__super__.compile.call(this, o, level); - } else { - return this.compileRoot(o); - } - }; - - Block.prototype.compileNode = function(o) { - var code, codes, node, top, _i, _len, _ref2; - this.tab = o.indent; - top = o.level === LEVEL_TOP; - codes = []; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - node = _ref2[_i]; - node = node.unwrapAll(); - node = node.unfoldSoak(o) || node; - if (node instanceof Block) { - codes.push(node.compileNode(o)); - } else if (top) { - node.front = true; - code = node.compile(o); - if (!node.isStatement(o)) { - code = "" + this.tab + code + ";"; - if (node instanceof Literal) { - code = "" + code + "\n"; - } - } - codes.push(code); - } else { - codes.push(node.compile(o, LEVEL_LIST)); - } - } - if (top) { - if (this.spaced) { - return "\n" + (codes.join('\n\n')) + "\n"; - } else { - return codes.join('\n'); - } - } - code = codes.join(', ') || 'void 0'; - if (codes.length > 1 && o.level >= LEVEL_LIST) { - return "(" + code + ")"; - } else { - return code; - } - }; - - Block.prototype.compileRoot = function(o) { - var code, exp, i, prelude, preludeExps, rest; - o.indent = o.bare ? '' : TAB; - o.scope = new Scope(null, this, null); - o.level = LEVEL_TOP; - this.spaced = true; - prelude = ""; - if (!o.bare) { - preludeExps = (function() { - var _i, _len, _ref2, _results; - _ref2 = this.expressions; - _results = []; - for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) { - exp = _ref2[i]; - if (!(exp.unwrap() instanceof Comment)) { - break; - } - _results.push(exp); - } - return _results; - }).call(this); - rest = this.expressions.slice(preludeExps.length); - this.expressions = preludeExps; - if (preludeExps.length) { - prelude = "" + (this.compileNode(merge(o, { - indent: '' - }))) + "\n"; - } - this.expressions = rest; - } - code = this.compileWithDeclarations(o); - if (o.bare) { - return code; - } - return "" + prelude + "(function() {\n" + code + "\n}).call(this);\n"; - }; - - Block.prototype.compileWithDeclarations = function(o) { - var assigns, code, declars, exp, i, post, rest, scope, spaced, _i, _len, _ref2, _ref3, _ref4; - code = post = ''; - _ref2 = this.expressions; - for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) { - exp = _ref2[i]; - exp = exp.unwrap(); - if (!(exp instanceof Comment || exp instanceof Literal)) { - break; - } - } - o = merge(o, { - level: LEVEL_TOP - }); - if (i) { - rest = this.expressions.splice(i, 9e9); - _ref3 = [this.spaced, false], spaced = _ref3[0], this.spaced = _ref3[1]; - _ref4 = [this.compileNode(o), spaced], code = _ref4[0], this.spaced = _ref4[1]; - this.expressions = rest; - } - post = this.compileNode(o); - scope = o.scope; - if (scope.expressions === this) { - declars = o.scope.hasDeclarations(); - assigns = scope.hasAssignments; - if (declars || assigns) { - if (i) { - code += '\n'; - } - code += "" + this.tab + "var "; - if (declars) { - code += scope.declaredVariables().join(', '); - } - if (assigns) { - if (declars) { - code += ",\n" + (this.tab + TAB); - } - code += scope.assignedVariables().join(",\n" + (this.tab + TAB)); - } - code += ';\n'; - } - } - return code + post; - }; - - Block.wrap = function(nodes) { - if (nodes.length === 1 && nodes[0] instanceof Block) { - return nodes[0]; - } - return new Block(nodes); - }; - - return Block; - - })(Base); - - exports.Literal = Literal = (function(_super) { - - __extends(Literal, _super); - - Literal.name = 'Literal'; - - function Literal(value) { - this.value = value; - } - - Literal.prototype.makeReturn = function() { - if (this.isStatement()) { - return this; - } else { - return Literal.__super__.makeReturn.apply(this, arguments); - } - }; - - Literal.prototype.isAssignable = function() { - return IDENTIFIER.test(this.value); - }; - - Literal.prototype.isStatement = function() { - var _ref2; - return (_ref2 = this.value) === 'break' || _ref2 === 'continue' || _ref2 === 'debugger'; - }; - - Literal.prototype.isComplex = NO; - - Literal.prototype.assigns = function(name) { - return name === this.value; - }; - - Literal.prototype.jumps = function(o) { - if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) { - return this; - } - if (this.value === 'continue' && !(o != null ? o.loop : void 0)) { - return this; - } - }; - - Literal.prototype.compileNode = function(o) { - var code, _ref2; - code = this.isUndefined ? o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0' : this.value === 'this' ? ((_ref2 = o.scope.method) != null ? _ref2.bound : void 0) ? o.scope.method.context : this.value : this.value.reserved ? "\"" + this.value + "\"" : this.value; - if (this.isStatement()) { - return "" + this.tab + code + ";"; - } else { - return code; - } - }; - - Literal.prototype.toString = function() { - return ' "' + this.value + '"'; - }; - - return Literal; - - })(Base); - - exports.Return = Return = (function(_super) { - - __extends(Return, _super); - - Return.name = 'Return'; - - function Return(expr) { - if (expr && !expr.unwrap().isUndefined) { - this.expression = expr; - } - } - - Return.prototype.children = ['expression']; - - Return.prototype.isStatement = YES; - - Return.prototype.makeReturn = THIS; - - Return.prototype.jumps = THIS; - - Return.prototype.compile = function(o, level) { - var expr, _ref2; - expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : void 0; - if (expr && !(expr instanceof Return)) { - return expr.compile(o, level); - } else { - return Return.__super__.compile.call(this, o, level); - } - }; - - Return.prototype.compileNode = function(o) { - return this.tab + ("return" + [this.expression ? " " + (this.expression.compile(o, LEVEL_PAREN)) : void 0] + ";"); - }; - - return Return; - - })(Base); - - exports.Value = Value = (function(_super) { - - __extends(Value, _super); - - Value.name = 'Value'; - - function Value(base, props, tag) { - if (!props && base instanceof Value) { - return base; - } - this.base = base; - this.properties = props || []; - if (tag) { - this[tag] = true; - } - return this; - } - - Value.prototype.children = ['base', 'properties']; - - Value.prototype.add = function(props) { - this.properties = this.properties.concat(props); - return this; - }; - - Value.prototype.hasProperties = function() { - return !!this.properties.length; - }; - - Value.prototype.isArray = function() { - return !this.properties.length && this.base instanceof Arr; - }; - - Value.prototype.isComplex = function() { - return this.hasProperties() || this.base.isComplex(); - }; - - Value.prototype.isAssignable = function() { - return this.hasProperties() || this.base.isAssignable(); - }; - - Value.prototype.isSimpleNumber = function() { - return this.base instanceof Literal && SIMPLENUM.test(this.base.value); - }; - - Value.prototype.isString = function() { - return this.base instanceof Literal && IS_STRING.test(this.base.value); - }; - - Value.prototype.isAtomic = function() { - var node, _i, _len, _ref2; - _ref2 = this.properties.concat(this.base); - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - node = _ref2[_i]; - if (node.soak || node instanceof Call) { - return false; - } - } - return true; - }; - - Value.prototype.isStatement = function(o) { - return !this.properties.length && this.base.isStatement(o); - }; - - Value.prototype.assigns = function(name) { - return !this.properties.length && this.base.assigns(name); - }; - - Value.prototype.jumps = function(o) { - return !this.properties.length && this.base.jumps(o); - }; - - Value.prototype.isObject = function(onlyGenerated) { - if (this.properties.length) { - return false; - } - return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated); - }; - - Value.prototype.isSplice = function() { - return last(this.properties) instanceof Slice; - }; - - Value.prototype.unwrap = function() { - if (this.properties.length) { - return this; - } else { - return this.base; - } - }; - - Value.prototype.cacheReference = function(o) { - var base, bref, name, nref; - name = last(this.properties); - if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) { - 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.add(name), new Value(bref || base.base, [nref || name])]; - }; - - Value.prototype.compileNode = function(o) { - var code, prop, props, _i, _len; - this.base.front = this.front; - props = this.properties; - code = this.base.compile(o, props.length ? LEVEL_ACCESS : null); - if ((this.base instanceof Parens || props.length) && SIMPLENUM.test(code)) { - 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 result, - _this = this; - if (this.unfoldedSoak != null) { - return this.unfoldedSoak; - } - result = (function() { - var fst, i, ifn, prop, ref, snd, _i, _len, _ref2; - if (ifn = _this.base.unfoldSoak(o)) { - Array.prototype.push.apply(ifn.body.properties, _this.properties); - return ifn; - } - _ref2 = _this.properties; - for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) { - prop = _ref2[i]; - if (!prop.soak) { - continue; - } - prop.soak = 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; - } - return new If(new Existence(fst), snd, { - soak: true - }); - } - return null; - })(); - return this.unfoldedSoak = result || false; - }; - - return Value; - - })(Base); - - exports.Comment = Comment = (function(_super) { - - __extends(Comment, _super); - - Comment.name = 'Comment'; - - function Comment(comment) { - this.comment = comment; - } - - Comment.prototype.isStatement = YES; - - Comment.prototype.makeReturn = THIS; - - Comment.prototype.compileNode = function(o, level) { - var code; - code = '/*' + multident(this.comment, this.tab) + ("\n" + this.tab + "*/\n"); - if ((level || o.level) === LEVEL_TOP) { - code = o.indent + code; - } - return code; - }; - - return Comment; - - })(Base); - - exports.Call = Call = (function(_super) { - - __extends(Call, _super); - - Call.name = 'Call'; - - function Call(variable, args, soak) { - this.args = args != null ? args : []; - this.soak = soak; - this.isNew = false; - this.isSuper = variable === 'super'; - this.variable = this.isSuper ? null : variable; - } - - Call.prototype.children = ['variable', 'args']; - - Call.prototype.newInstance = function() { - var base, _ref2; - base = ((_ref2 = this.variable) != null ? _ref2.base : void 0) || this.variable; - if (base instanceof Call && !base.isNew) { - base.newInstance(); - } else { - this.isNew = true; - } - return this; - }; - - Call.prototype.superReference = function(o) { - var accesses, method, name; - method = o.scope.method; - if (!method) { - throw SyntaxError('cannot call super outside of a function.'); - } - name = method.name; - if (name == null) { - throw SyntaxError('cannot call super on an anonymous function.'); - } - if (method.klass) { - accesses = [new Access(new Literal('__super__'))]; - if (method["static"]) { - accesses.push(new Access(new Literal('constructor'))); - } - accesses.push(new Access(new Literal(name))); - return (new Value(new Literal(method.klass), accesses)).compile(o); - } else { - return "" + name + ".__super__.constructor"; - } - }; - - Call.prototype.unfoldSoak = function(o) { - var call, ifn, left, list, rite, _i, _len, _ref2, _ref3; - if (this.soak) { - if (this.variable) { - if (ifn = unfoldSoak(o, this, 'variable')) { - return ifn; - } - _ref2 = new Value(this.variable).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\""); - return new If(left, new Value(rite), { - soak: true - }); - } - 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; - } - } - _ref3 = list.reverse(); - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - call = _ref3[_i]; - if (ifn) { - if (call.variable instanceof Call) { - call.variable = ifn; - } else { - call.variable.base = ifn; - } - } - ifn = unfoldSoak(o, call, 'variable'); - } - return ifn; - }; - - Call.prototype.filterImplicitObjects = function(list) { - var node, nodes, obj, prop, properties, _i, _j, _len, _len1, _ref2; - nodes = []; - for (_i = 0, _len = list.length; _i < _len; _i++) { - node = list[_i]; - if (!((typeof node.isObject === "function" ? node.isObject() : void 0) && node.base.generated)) { - nodes.push(node); - continue; - } - obj = null; - _ref2 = node.base.properties; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - prop = _ref2[_j]; - if (prop instanceof Assign || prop instanceof Comment) { - if (!obj) { - nodes.push(obj = new Obj(properties = [], true)); - } - properties.push(prop); - } else { - nodes.push(prop); - obj = null; - } - } - } - return nodes; - }; - - Call.prototype.compileNode = function(o) { - var arg, args, code, _ref2; - if ((_ref2 = this.variable) != null) { - _ref2.front = this.front; - } - if (code = Splat.compileSplattedArray(o, this.args, true)) { - return this.compileSplat(o, code); - } - args = this.filterImplicitObjects(this.args); - args = ((function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = args.length; _i < _len; _i++) { - arg = args[_i]; - _results.push(arg.compile(o, LEVEL_LIST)); - } - return _results; - })()).join(', '); - if (this.isSuper) { - return this.superReference(o) + (".call(this" + (args && ', ' + args) + ")"); - } else { - return (this.isNew ? 'new ' : '') + this.variable.compile(o, LEVEL_ACCESS) + ("(" + args + ")"); - } - }; - - Call.prototype.compileSuper = function(args, o) { - return "" + (this.superReference(o)) + ".call(this" + (args.length ? ', ' : '') + args + ")"; - }; - - Call.prototype.compileSplat = function(o, splatArgs) { - var base, fun, idt, name, ref; - if (this.isSuper) { - return "" + (this.superReference(o)) + ".apply(this, " + splatArgs + ")"; - } - if (this.isNew) { - idt = this.tab + TAB; - return "(function(func, args, ctor) {\n" + idt + "ctor.prototype = func.prototype;\n" + idt + "var child = new ctor, result = func.apply(child, args), t = typeof result;\n" + idt + "return t == \"object\" || t == \"function\" ? result || child : child;\n" + this.tab + "})(" + (this.variable.compile(o, LEVEL_LIST)) + ", " + splatArgs + ", function(){})"; - } - base = new Value(this.variable); - if ((name = base.properties.pop()) && base.isComplex()) { - ref = o.scope.freeVariable('ref'); - fun = "(" + ref + " = " + (base.compile(o, LEVEL_LIST)) + ")" + (name.compile(o)); - } else { - fun = base.compile(o, LEVEL_ACCESS); - if (SIMPLENUM.test(fun)) { - fun = "(" + fun + ")"; - } - if (name) { - ref = fun; - fun += name.compile(o); - } else { - ref = 'null'; - } - } - return "" + fun + ".apply(" + ref + ", " + splatArgs + ")"; - }; - - return Call; - - })(Base); - - exports.Extends = Extends = (function(_super) { - - __extends(Extends, _super); - - Extends.name = 'Extends'; - - function Extends(child, parent) { - this.child = child; - this.parent = parent; - } - - Extends.prototype.children = ['child', 'parent']; - - Extends.prototype.compile = function(o) { - return new Call(new Value(new Literal(utility('extends'))), [this.child, this.parent]).compile(o); - }; - - return Extends; - - })(Base); - - exports.Access = Access = (function(_super) { - - __extends(Access, _super); - - Access.name = 'Access'; - - function Access(name, tag) { - this.name = name; - this.name.asKey = true; - this.soak = tag === 'soak'; - } - - Access.prototype.children = ['name']; - - Access.prototype.compile = function(o) { - var name; - name = this.name.compile(o); - if (IDENTIFIER.test(name)) { - return "." + name; - } else { - return "[" + name + "]"; - } - }; - - Access.prototype.isComplex = NO; - - return Access; - - })(Base); - - exports.Index = Index = (function(_super) { - - __extends(Index, _super); - - Index.name = 'Index'; - - function Index(index) { - this.index = index; - } - - Index.prototype.children = ['index']; - - Index.prototype.compile = function(o) { - return "[" + (this.index.compile(o, LEVEL_PAREN)) + "]"; - }; - - Index.prototype.isComplex = function() { - return this.index.isComplex(); - }; - - return Index; - - })(Base); - - exports.Range = Range = (function(_super) { - - __extends(Range, _super); - - Range.name = 'Range'; - - Range.prototype.children = ['from', 'to']; - - function Range(from, to, tag) { - this.from = from; - this.to = to; - this.exclusive = tag === 'exclusive'; - this.equals = this.exclusive ? '' : '='; - } - - Range.prototype.compileVariables = function(o) { - var step, _ref2, _ref3, _ref4, _ref5; - o = merge(o, { - top: true - }); - _ref2 = this.from.cache(o, LEVEL_LIST), this.fromC = _ref2[0], this.fromVar = _ref2[1]; - _ref3 = this.to.cache(o, LEVEL_LIST), this.toC = _ref3[0], this.toVar = _ref3[1]; - if (step = del(o, 'step')) { - _ref4 = step.cache(o, LEVEL_LIST), this.step = _ref4[0], this.stepVar = _ref4[1]; - } - _ref5 = [this.fromVar.match(SIMPLENUM), this.toVar.match(SIMPLENUM)], this.fromNum = _ref5[0], this.toNum = _ref5[1]; - if (this.stepVar) { - return this.stepNum = this.stepVar.match(SIMPLENUM); - } - }; - - Range.prototype.compileNode = function(o) { - var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, stepPart, to, varPart, _ref2, _ref3; - if (!this.fromVar) { - this.compileVariables(o); - } - if (!o.index) { - return this.compileArray(o); - } - known = this.fromNum && this.toNum; - idx = del(o, 'index'); - idxName = del(o, 'name'); - namedIndex = idxName && idxName !== idx; - varPart = "" + idx + " = " + this.fromC; - if (this.toC !== this.toVar) { - varPart += ", " + this.toC; - } - if (this.step !== this.stepVar) { - varPart += ", " + this.step; - } - _ref2 = ["" + idx + " <" + this.equals, "" + idx + " >" + this.equals], lt = _ref2[0], gt = _ref2[1]; - condPart = this.stepNum ? +this.stepNum > 0 ? "" + lt + " " + this.toVar : "" + gt + " " + this.toVar : known ? ((_ref3 = [+this.fromNum, +this.toNum], from = _ref3[0], to = _ref3[1], _ref3), from <= to ? "" + lt + " " + to : "" + gt + " " + to) : (cond = "" + this.fromVar + " <= " + this.toVar, "" + cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar); - stepPart = this.stepVar ? "" + idx + " += " + this.stepVar : known ? namedIndex ? from <= to ? "++" + idx : "--" + idx : from <= to ? "" + idx + "++" : "" + idx + "--" : namedIndex ? "" + cond + " ? ++" + idx + " : --" + idx : "" + cond + " ? " + idx + "++ : " + idx + "--"; - if (namedIndex) { - varPart = "" + idxName + " = " + varPart; - } - if (namedIndex) { - stepPart = "" + idxName + " = " + stepPart; - } - return "" + varPart + "; " + condPart + "; " + stepPart; - }; - - Range.prototype.compileArray = function(o) { - var args, body, cond, hasArgs, i, idt, post, pre, range, result, vars, _i, _ref2, _ref3, _results; - if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) { - range = (function() { - _results = []; - for (var _i = _ref2 = +this.fromNum, _ref3 = +this.toNum; _ref2 <= _ref3 ? _i <= _ref3 : _i >= _ref3; _ref2 <= _ref3 ? _i++ : _i--){ _results.push(_i); } - return _results; - }).apply(this); - if (this.exclusive) { - range.pop(); - } - return "[" + (range.join(', ')) + "]"; - } - idt = this.tab + TAB; - i = o.scope.freeVariable('i'); - result = o.scope.freeVariable('results'); - pre = "\n" + idt + result + " = [];"; - if (this.fromNum && this.toNum) { - o.index = i; - body = this.compileNode(o); - } else { - vars = ("" + i + " = " + this.fromC) + (this.toC !== this.toVar ? ", " + this.toC : ''); - cond = "" + this.fromVar + " <= " + this.toVar; - body = "var " + vars + "; " + cond + " ? " + i + " <" + this.equals + " " + this.toVar + " : " + i + " >" + this.equals + " " + this.toVar + "; " + cond + " ? " + i + "++ : " + i + "--"; - } - post = "{ " + result + ".push(" + i + "); }\n" + idt + "return " + result + ";\n" + o.indent; - hasArgs = function(node) { - return node != null ? node.contains(function(n) { - return n instanceof Literal && n.value === 'arguments' && !n.asKey; - }) : void 0; - }; - if (hasArgs(this.from) || hasArgs(this.to)) { - args = ', arguments'; - } - return "(function() {" + pre + "\n" + idt + "for (" + body + ")" + post + "}).apply(this" + (args != null ? args : '') + ")"; - }; - - return Range; - - })(Base); - - exports.Slice = Slice = (function(_super) { - - __extends(Slice, _super); - - Slice.name = 'Slice'; - - Slice.prototype.children = ['range']; - - function Slice(range) { - this.range = range; - Slice.__super__.constructor.call(this); - } - - Slice.prototype.compileNode = function(o) { - var compiled, from, fromStr, to, toStr, _ref2; - _ref2 = this.range, to = _ref2.to, from = _ref2.from; - fromStr = from && from.compile(o, LEVEL_PAREN) || '0'; - compiled = to && to.compile(o, LEVEL_PAREN); - if (to && !(!this.range.exclusive && +compiled === -1)) { - toStr = ', ' + (this.range.exclusive ? compiled : SIMPLENUM.test(compiled) ? "" + (+compiled + 1) : (compiled = to.compile(o, LEVEL_ACCESS), "" + compiled + " + 1 || 9e9")); - } - return ".slice(" + fromStr + (toStr || '') + ")"; - }; - - return Slice; - - })(Base); - - exports.Obj = Obj = (function(_super) { - - __extends(Obj, _super); - - Obj.name = 'Obj'; - - function Obj(props, generated) { - this.generated = generated != null ? generated : false; - this.objects = this.properties = props || []; - } - - Obj.prototype.children = ['properties']; - - Obj.prototype.compileNode = function(o) { - var i, idt, indent, join, lastNoncom, node, obj, prop, propName, propNames, props, _i, _j, _len, _len1, _ref2; - props = this.properties; - propNames = []; - _ref2 = this.properties; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - prop = _ref2[_i]; - if (prop.isComplex()) { - prop = prop.variable; - } - if (prop != null) { - propName = prop.unwrapAll().value.toString(); - if (__indexOf.call(propNames, propName) >= 0) { - throw SyntaxError("multiple object literal properties named \"" + propName + "\""); - } - propNames.push(propName); - } - } - if (!props.length) { - return (this.front ? '({})' : '{}'); - } - if (this.generated) { - for (_j = 0, _len1 = props.length; _j < _len1; _j++) { - node = props[_j]; - if (node instanceof Value) { - throw new Error('cannot have an implicit value in an implicit object'); - } - } - } - idt = o.indent += TAB; - lastNoncom = this.lastNonComment(this.properties); - props = (function() { - var _k, _len2, _results; - _results = []; - for (i = _k = 0, _len2 = props.length; _k < _len2; i = ++_k) { - prop = props[i]; - join = i === props.length - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\n' : ',\n'; - indent = prop instanceof Comment ? '' : idt; - if (prop instanceof Value && prop["this"]) { - prop = new Assign(prop.properties[0].name, prop, 'object'); - } - if (!(prop instanceof Comment)) { - if (!(prop instanceof Assign)) { - prop = new Assign(prop, prop, 'object'); - } - (prop.variable.base || prop.variable).asKey = true; - } - _results.push(indent + prop.compile(o, LEVEL_TOP) + join); - } - return _results; - })(); - props = props.join(''); - obj = "{" + (props && '\n' + props + '\n' + this.tab) + "}"; - if (this.front) { - return "(" + obj + ")"; - } else { - return obj; - } - }; - - Obj.prototype.assigns = function(name) { - var prop, _i, _len, _ref2; - _ref2 = this.properties; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - prop = _ref2[_i]; - if (prop.assigns(name)) { - return true; - } - } - return false; - }; - - return Obj; - - })(Base); - - exports.Arr = Arr = (function(_super) { - - __extends(Arr, _super); - - Arr.name = 'Arr'; - - function Arr(objs) { - this.objects = objs || []; - } - - Arr.prototype.children = ['objects']; - - Arr.prototype.filterImplicitObjects = Call.prototype.filterImplicitObjects; - - Arr.prototype.compileNode = function(o) { - var code, obj, objs; - if (!this.objects.length) { - return '[]'; - } - o.indent += TAB; - objs = this.filterImplicitObjects(this.objects); - if (code = Splat.compileSplattedArray(o, objs)) { - return code; - } - code = ((function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = objs.length; _i < _len; _i++) { - obj = objs[_i]; - _results.push(obj.compile(o, LEVEL_LIST)); - } - return _results; - })()).join(', '); - if (code.indexOf('\n') >= 0) { - return "[\n" + o.indent + code + "\n" + this.tab + "]"; - } else { - return "[" + code + "]"; - } - }; - - Arr.prototype.assigns = function(name) { - var obj, _i, _len, _ref2; - _ref2 = this.objects; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - obj = _ref2[_i]; - if (obj.assigns(name)) { - return true; - } - } - return false; - }; - - return Arr; - - })(Base); - - exports.Class = Class = (function(_super) { - - __extends(Class, _super); - - Class.name = 'Class'; - - function Class(variable, parent, body) { - this.variable = variable; - this.parent = parent; - this.body = body != null ? body : new Block; - this.boundFuncs = []; - this.body.classBody = true; - } - - Class.prototype.children = ['variable', 'parent', 'body']; - - Class.prototype.determineName = function() { - var decl, tail; - if (!this.variable) { - return null; - } - decl = (tail = last(this.variable.properties)) ? tail instanceof Access && tail.name.value : this.variable.base.value; - if (__indexOf.call(STRICT_PROSCRIBED, decl) >= 0) { - throw SyntaxError("variable name may not be " + decl); - } - return decl && (decl = IDENTIFIER.test(decl) && decl); - }; - - Class.prototype.setContext = function(name) { - return this.body.traverseChildren(false, function(node) { - if (node.classBody) { - return false; - } - if (node instanceof Literal && node.value === 'this') { - return node.value = name; - } else if (node instanceof Code) { - node.klass = name; - if (node.bound) { - return node.context = name; - } - } - }); - }; - - Class.prototype.addBoundFunctions = function(o) { - var bvar, lhs, _i, _len, _ref2, _results; - if (this.boundFuncs.length) { - _ref2 = this.boundFuncs; - _results = []; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - bvar = _ref2[_i]; - lhs = (new Value(new Literal("this"), [new Access(bvar)])).compile(o); - _results.push(this.ctor.body.unshift(new Literal("" + lhs + " = " + (utility('bind')) + "(" + lhs + ", this)"))); - } - return _results; - } - }; - - Class.prototype.addProperties = function(node, name, o) { - var assign, base, exprs, func, props; - props = node.base.properties.slice(0); - exprs = (function() { - var _results; - _results = []; - while (assign = props.shift()) { - if (assign instanceof Assign) { - base = assign.variable.base; - delete assign.context; - func = assign.value; - if (base.value === 'constructor') { - if (this.ctor) { - throw new Error('cannot define more than one constructor in a class'); - } - if (func.bound) { - throw new Error('cannot define a constructor as a bound function'); - } - if (func instanceof Code) { - assign = this.ctor = func; - } else { - this.externalCtor = o.scope.freeVariable('class'); - assign = new Assign(new Literal(this.externalCtor), func); - } - } else { - if (assign.variable["this"]) { - func["static"] = true; - if (func.bound) { - func.context = name; - } - } else { - assign.variable = new Value(new Literal(name), [new Access(new Literal('prototype')), new Access(base)]); - if (func instanceof Code && func.bound) { - this.boundFuncs.push(base); - func.bound = false; - } - } - } - } - _results.push(assign); - } - return _results; - }).call(this); - return compact(exprs); - }; - - Class.prototype.walkBody = function(name, o) { - var _this = this; - return this.traverseChildren(false, function(child) { - var exps, i, node, _i, _len, _ref2; - if (child instanceof Class) { - return false; - } - if (child instanceof Block) { - _ref2 = exps = child.expressions; - for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) { - node = _ref2[i]; - if (node instanceof Value && node.isObject(true)) { - exps[i] = _this.addProperties(node, name, o); - } - } - return child.expressions = exps = flatten(exps); - } - }); - }; - - Class.prototype.hoistDirectivePrologue = function() { - var expressions, index, node; - index = 0; - expressions = this.body.expressions; - while ((node = expressions[index]) && node instanceof Comment || node instanceof Value && node.isString()) { - ++index; - } - return this.directives = expressions.splice(0, index); - }; - - Class.prototype.ensureConstructor = function(name) { - if (!this.ctor) { - this.ctor = new Code; - if (this.parent) { - this.ctor.body.push(new Literal("" + name + ".__super__.constructor.apply(this, arguments)")); - } - if (this.externalCtor) { - this.ctor.body.push(new Literal("" + this.externalCtor + ".apply(this, arguments)")); - } - this.ctor.body.makeReturn(); - this.body.expressions.unshift(this.ctor); - } - this.ctor.ctor = this.ctor.name = name; - this.ctor.klass = null; - return this.ctor.noReturn = true; - }; - - Class.prototype.compileNode = function(o) { - var call, decl, klass, lname, name, params, _ref2; - decl = this.determineName(); - name = decl || '_Class'; - if (name.reserved) { - name = "_" + name; - } - lname = new Literal(name); - this.hoistDirectivePrologue(); - this.setContext(name); - this.walkBody(name, o); - this.ensureConstructor(name); - this.body.spaced = true; - if (!(this.ctor instanceof Code)) { - this.body.expressions.unshift(this.ctor); - } - if (decl) { - this.body.expressions.unshift(new Assign(new Value(new Literal(name), [new Access(new Literal('name'))]), new Literal("'" + name + "'"))); - } - this.body.expressions.push(lname); - (_ref2 = this.body.expressions).unshift.apply(_ref2, this.directives); - this.addBoundFunctions(o); - call = Closure.wrap(this.body); - if (this.parent) { - this.superClass = new Literal(o.scope.freeVariable('super', false)); - this.body.expressions.unshift(new Extends(lname, this.superClass)); - call.args.push(this.parent); - params = call.variable.params || call.variable.base.params; - params.push(new Param(this.superClass)); - } - klass = new Parens(call, true); - if (this.variable) { - klass = new Assign(this.variable, klass); - } - return klass.compile(o); - }; - - return Class; - - })(Base); - - exports.Assign = Assign = (function(_super) { - - __extends(Assign, _super); - - Assign.name = 'Assign'; - - function Assign(variable, value, context, options) { - var forbidden, name, _ref2; - this.variable = variable; - this.value = value; - this.context = context; - this.param = options && options.param; - this.subpattern = options && options.subpattern; - forbidden = (_ref2 = (name = this.variable.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0); - if (forbidden && this.context !== 'object') { - throw SyntaxError("variable name may not be \"" + name + "\""); - } - } - - Assign.prototype.children = ['variable', 'value']; - - Assign.prototype.isStatement = function(o) { - return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && __indexOf.call(this.context, "?") >= 0; - }; - - Assign.prototype.assigns = function(name) { - return this[this.context === 'object' ? 'value' : 'variable'].assigns(name); - }; - - Assign.prototype.unfoldSoak = function(o) { - return unfoldSoak(o, this, 'variable'); - }; - - Assign.prototype.compileNode = function(o) { - var isValue, match, name, val, varBase, _ref2, _ref3, _ref4, _ref5; - if (isValue = this.variable instanceof Value) { - if (this.variable.isArray() || this.variable.isObject()) { - return this.compilePatternMatch(o); - } - if (this.variable.isSplice()) { - return this.compileSplice(o); - } - if ((_ref2 = this.context) === '||=' || _ref2 === '&&=' || _ref2 === '?=') { - return this.compileConditional(o); - } - } - name = this.variable.compile(o, LEVEL_LIST); - if (!this.context) { - if (!(varBase = this.variable.unwrapAll()).isAssignable()) { - throw SyntaxError("\"" + (this.variable.compile(o)) + "\" cannot be assigned."); - } - if (!(typeof varBase.hasProperties === "function" ? varBase.hasProperties() : void 0)) { - if (this.param) { - o.scope.add(name, 'var'); - } else { - o.scope.find(name); - } - } - } - if (this.value instanceof Code && (match = METHOD_DEF.exec(name))) { - if (match[1]) { - this.value.klass = match[1]; - } - this.value.name = (_ref3 = (_ref4 = (_ref5 = match[2]) != null ? _ref5 : match[3]) != null ? _ref4 : match[4]) != null ? _ref3 : match[5]; - } - val = this.value.compile(o, LEVEL_LIST); - if (this.context === 'object') { - return "" + name + ": " + val; - } - val = name + (" " + (this.context || '=') + " ") + val; - if (o.level <= LEVEL_LIST) { - return val; - } else { - return "(" + val + ")"; - } - }; - - Assign.prototype.compilePatternMatch = function(o) { - var acc, assigns, code, i, idx, isObject, ivar, name, obj, objects, olen, ref, rest, splat, top, val, value, vvar, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8; - top = o.level === LEVEL_TOP; - value = this.value; - objects = this.variable.base.objects; - if (!(olen = objects.length)) { - code = value.compile(o); - if (o.level >= LEVEL_OP) { - return "(" + code + ")"; - } else { - return code; - } - } - isObject = this.variable.isObject(); - if (top && olen === 1 && !((obj = objects[0]) instanceof Splat)) { - if (obj instanceof Assign) { - _ref2 = obj, (_ref3 = _ref2.variable, idx = _ref3.base), obj = _ref2.value; - } else { - if (obj.base instanceof Parens) { - _ref4 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref4[0], idx = _ref4[1]; - } else { - idx = isObject ? obj["this"] ? obj.properties[0].name : obj : new Literal(0); - } - } - acc = IDENTIFIER.test(idx.unwrap().value || 0); - value = new Value(value); - value.properties.push(new (acc ? Access : Index)(idx)); - if (_ref5 = obj.unwrap().value, __indexOf.call(RESERVED, _ref5) >= 0) { - throw new SyntaxError("assignment to a reserved word: " + (obj.compile(o)) + " = " + (value.compile(o))); - } - return new Assign(obj, value, null, { - param: this.param - }).compile(o, LEVEL_TOP); - } - vvar = value.compile(o, LEVEL_LIST); - assigns = []; - splat = false; - if (!IDENTIFIER.test(vvar) || this.variable.assigns(vvar)) { - assigns.push("" + (ref = o.scope.freeVariable('ref')) + " = " + vvar); - vvar = ref; - } - for (i = _i = 0, _len = objects.length; _i < _len; i = ++_i) { - obj = objects[i]; - idx = i; - if (isObject) { - if (obj instanceof Assign) { - _ref6 = obj, (_ref7 = _ref6.variable, idx = _ref7.base), obj = _ref6.value; - } else { - if (obj.base instanceof Parens) { - _ref8 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref8[0], idx = _ref8[1]; - } else { - idx = obj["this"] ? obj.properties[0].name : obj; - } - } - } - if (!splat && obj instanceof Splat) { - name = obj.name.unwrap().value; - obj = obj.unwrap(); - val = "" + olen + " <= " + vvar + ".length ? " + (utility('slice')) + ".call(" + vvar + ", " + i; - if (rest = olen - i - 1) { - ivar = o.scope.freeVariable('i'); - val += ", " + ivar + " = " + vvar + ".length - " + rest + ") : (" + ivar + " = " + i + ", [])"; - } else { - val += ") : []"; - } - val = new Literal(val); - splat = "" + ivar + "++"; - } else { - name = obj.unwrap().value; - if (obj instanceof Splat) { - obj = obj.name.compile(o); - throw new SyntaxError("multiple splats are disallowed in an assignment: " + obj + "..."); - } - if (typeof idx === 'number') { - idx = new Literal(splat || idx); - acc = false; - } else { - acc = isObject && IDENTIFIER.test(idx.unwrap().value || 0); - } - val = new Value(new Literal(vvar), [new (acc ? Access : Index)(idx)]); - } - if ((name != null) && __indexOf.call(RESERVED, name) >= 0) { - throw new SyntaxError("assignment to a reserved word: " + (obj.compile(o)) + " = " + (val.compile(o))); - } - assigns.push(new Assign(obj, val, null, { - param: this.param, - subpattern: true - }).compile(o, LEVEL_LIST)); - } - if (!(top || this.subpattern)) { - assigns.push(vvar); - } - code = assigns.join(', '); - if (o.level < LEVEL_LIST) { - return code; - } else { - return "(" + code + ")"; - } - }; - - Assign.prototype.compileConditional = function(o) { - var left, right, _ref2; - _ref2 = this.variable.cacheReference(o), left = _ref2[0], right = _ref2[1]; - if (!left.properties.length && left.base instanceof Literal && left.base.value !== "this" && !o.scope.check(left.base.value)) { - throw new Error("the variable \"" + left.base.value + "\" can't be assigned with " + this.context + " because it has not been defined."); - } - if (__indexOf.call(this.context, "?") >= 0) { - o.isExistentialEquals = true; - } - return new Op(this.context.slice(0, -1), left, new Assign(right, this.value, '=')).compile(o); - }; - - Assign.prototype.compileSplice = function(o) { - var code, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref2, _ref3, _ref4; - _ref2 = this.variable.properties.pop().range, from = _ref2.from, to = _ref2.to, exclusive = _ref2.exclusive; - name = this.variable.compile(o); - _ref3 = (from != null ? from.cache(o, LEVEL_OP) : void 0) || ['0', '0'], fromDecl = _ref3[0], fromRef = _ref3[1]; - if (to) { - if ((from != null ? from.isSimpleNumber() : void 0) && to.isSimpleNumber()) { - to = +to.compile(o) - +fromRef; - if (!exclusive) { - to += 1; - } - } else { - to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef; - if (!exclusive) { - to += ' + 1'; - } - } - } else { - to = "9e9"; - } - _ref4 = this.value.cache(o, LEVEL_LIST), valDef = _ref4[0], valRef = _ref4[1]; - code = "[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat(" + valDef + ")), " + valRef; - if (o.level > LEVEL_TOP) { - return "(" + code + ")"; - } else { - return code; - } - }; - - return Assign; - - })(Base); - - exports.Code = Code = (function(_super) { - - __extends(Code, _super); - - Code.name = 'Code'; - - function Code(params, body, tag) { - this.params = params || []; - this.body = body || new Block; - this.bound = tag === 'boundfunc'; - if (this.bound) { - this.context = '_this'; - } - } - - Code.prototype.children = ['params', 'body']; - - Code.prototype.isStatement = function() { - return !!this.ctor; - }; - - Code.prototype.jumps = NO; - - Code.prototype.compileNode = function(o) { - var code, exprs, i, idt, lit, name, p, param, params, ref, splats, uniqs, val, wasEmpty, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8; - o.scope = new Scope(o.scope, this.body, this); - o.scope.shared = del(o, 'sharedScope'); - o.indent += TAB; - delete o.bare; - delete o.isExistentialEquals; - params = []; - exprs = []; - _ref2 = this.paramNames(); - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - name = _ref2[_i]; - if (!o.scope.check(name)) { - o.scope.parameter(name); - } - } - _ref3 = this.params; - for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { - param = _ref3[_j]; - if (!param.splat) { - continue; - } - _ref4 = this.params; - for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { - p = _ref4[_k]; - if (p.name.value) { - o.scope.add(p.name.value, 'var', true); - } - } - splats = new Assign(new Value(new Arr((function() { - var _l, _len3, _ref5, _results; - _ref5 = this.params; - _results = []; - for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { - p = _ref5[_l]; - _results.push(p.asReference(o)); - } - return _results; - }).call(this))), new Value(new Literal('arguments'))); - break; - } - _ref5 = this.params; - for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { - param = _ref5[_l]; - if (param.isComplex()) { - val = ref = param.asReference(o); - if (param.value) { - val = new Op('?', ref, param.value); - } - exprs.push(new Assign(new Value(param.name), val, '=', { - param: true - })); - } else { - ref = param; - if (param.value) { - lit = new Literal(ref.name.value + ' == null'); - val = new Assign(new Value(param.name), param.value, '='); - exprs.push(new If(lit, val)); - } - } - if (!splats) { - params.push(ref); - } - } - wasEmpty = this.body.isEmpty(); - if (splats) { - exprs.unshift(splats); - } - if (exprs.length) { - (_ref6 = this.body.expressions).unshift.apply(_ref6, exprs); - } - for (i = _m = 0, _len4 = params.length; _m < _len4; i = ++_m) { - p = params[i]; - o.scope.parameter(params[i] = p.compile(o)); - } - uniqs = []; - _ref7 = this.paramNames(); - for (_n = 0, _len5 = _ref7.length; _n < _len5; _n++) { - name = _ref7[_n]; - if (__indexOf.call(uniqs, name) >= 0) { - throw SyntaxError("multiple parameters named '" + name + "'"); - } - uniqs.push(name); - } - if (!(wasEmpty || this.noReturn)) { - this.body.makeReturn(); - } - if (this.bound) { - if ((_ref8 = o.scope.parent.method) != null ? _ref8.bound : void 0) { - this.bound = this.context = o.scope.parent.method.context; - } else if (!this["static"]) { - o.scope.parent.assign('_this', 'this'); - } - } - idt = o.indent; - code = 'function'; - if (this.ctor) { - code += ' ' + this.name; - } - code += '(' + params.join(', ') + ') {'; - if (!this.body.isEmpty()) { - code += "\n" + (this.body.compileWithDeclarations(o)) + "\n" + this.tab; - } - code += '}'; - if (this.ctor) { - return this.tab + code; - } - if (this.front || (o.level >= LEVEL_ACCESS)) { - return "(" + code + ")"; - } else { - return code; - } - }; - - Code.prototype.paramNames = function() { - var names, param, _i, _len, _ref2; - names = []; - _ref2 = this.params; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - param = _ref2[_i]; - names.push.apply(names, param.names()); - } - return names; - }; - - Code.prototype.traverseChildren = function(crossScope, func) { - if (crossScope) { - return Code.__super__.traverseChildren.call(this, crossScope, func); - } - }; - - return Code; - - })(Base); - - exports.Param = Param = (function(_super) { - - __extends(Param, _super); - - Param.name = 'Param'; - - function Param(name, value, splat) { - var _ref2; - this.name = name; - this.value = value; - this.splat = splat; - if (_ref2 = (name = this.name.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) { - throw SyntaxError("parameter name \"" + name + "\" is not allowed"); - } - } - - Param.prototype.children = ['name', 'value']; - - Param.prototype.compile = function(o) { - return this.name.compile(o, LEVEL_LIST); - }; - - Param.prototype.asReference = function(o) { - var node; - if (this.reference) { - return this.reference; - } - node = this.name; - if (node["this"]) { - node = node.properties[0].name; - if (node.value.reserved) { - node = new Literal(o.scope.freeVariable(node.value)); - } - } else if (node.isComplex()) { - node = new Literal(o.scope.freeVariable('arg')); - } - node = new Value(node); - if (this.splat) { - node = new Splat(node); - } - return this.reference = node; - }; - - Param.prototype.isComplex = function() { - return this.name.isComplex(); - }; - - Param.prototype.names = function(name) { - var atParam, names, obj, _i, _len, _ref2; - if (name == null) { - name = this.name; - } - atParam = function(obj) { - var value; - value = obj.properties[0].name.value; - if (value.reserved) { - return []; - } else { - return [value]; - } - }; - if (name instanceof Literal) { - return [name.value]; - } - if (name instanceof Value) { - return atParam(name); - } - names = []; - _ref2 = name.objects; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - obj = _ref2[_i]; - if (obj instanceof Assign) { - names.push(obj.variable.base.value); - } else if (obj.isArray() || obj.isObject()) { - names.push.apply(names, this.names(obj.base)); - } else if (obj["this"]) { - names.push.apply(names, atParam(obj)); - } else { - names.push(obj.base.value); - } - } - return names; - }; - - return Param; - - })(Base); - - exports.Splat = Splat = (function(_super) { - - __extends(Splat, _super); - - Splat.name = 'Splat'; - - Splat.prototype.children = ['name']; - - Splat.prototype.isAssignable = YES; - - function Splat(name) { - this.name = name.compile ? name : new Literal(name); - } - - Splat.prototype.assigns = function(name) { - return this.name.assigns(name); - }; - - Splat.prototype.compile = function(o) { - if (this.index != null) { - return this.compileParam(o); - } else { - return this.name.compile(o); - } - }; - - Splat.prototype.unwrap = function() { - return this.name; - }; - - Splat.compileSplattedArray = function(o, list, apply) { - var args, base, code, i, index, node, _i, _len; - index = -1; - while ((node = list[++index]) && !(node instanceof Splat)) { - continue; - } - if (index >= list.length) { - return ''; - } - if (list.length === 1) { - code = list[0].compile(o, LEVEL_LIST); - if (apply) { - return code; - } - return "" + (utility('slice')) + ".call(" + code + ")"; - } - args = list.slice(index); - for (i = _i = 0, _len = args.length; _i < _len; i = ++_i) { - node = args[i]; - code = node.compile(o, LEVEL_LIST); - args[i] = node instanceof Splat ? "" + (utility('slice')) + ".call(" + code + ")" : "[" + code + "]"; - } - if (index === 0) { - return args[0] + (".concat(" + (args.slice(1).join(', ')) + ")"); - } - base = (function() { - var _j, _len1, _ref2, _results; - _ref2 = list.slice(0, index); - _results = []; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - node = _ref2[_j]; - _results.push(node.compile(o, LEVEL_LIST)); - } - return _results; - })(); - return "[" + (base.join(', ')) + "].concat(" + (args.join(', ')) + ")"; - }; - - return Splat; - - })(Base); - - exports.While = While = (function(_super) { - - __extends(While, _super); - - While.name = 'While'; - - function While(condition, options) { - this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition; - this.guard = options != null ? options.guard : void 0; - } - - While.prototype.children = ['condition', 'guard', 'body']; - - While.prototype.isStatement = YES; - - While.prototype.makeReturn = function(res) { - if (res) { - return While.__super__.makeReturn.apply(this, arguments); - } else { - this.returns = !this.jumps({ - loop: true - }); - return this; - } - }; - - While.prototype.addBody = function(body) { - this.body = body; - return this; - }; - - While.prototype.jumps = function() { - var expressions, node, _i, _len; - expressions = this.body.expressions; - if (!expressions.length) { - return false; - } - for (_i = 0, _len = expressions.length; _i < _len; _i++) { - node = expressions[_i]; - if (node.jumps({ - loop: true - })) { - return node; - } - } - return false; - }; - - While.prototype.compileNode = function(o) { - var body, code, rvar, set; - o.indent += TAB; - set = ''; - body = this.body; - if (body.isEmpty()) { - body = ''; - } else { - if (this.returns) { - body.makeReturn(rvar = o.scope.freeVariable('results')); - set = "" + this.tab + rvar + " = [];\n"; - } - if (this.guard) { - if (body.expressions.length > 1) { - body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal("continue"))); - } else { - if (this.guard) { - body = Block.wrap([new If(this.guard, body)]); - } - } - } - body = "\n" + (body.compile(o, LEVEL_TOP)) + "\n" + this.tab; - } - code = set + this.tab + ("while (" + (this.condition.compile(o, LEVEL_PAREN)) + ") {" + body + "}"); - if (this.returns) { - code += "\n" + this.tab + "return " + rvar + ";"; - } - return code; - }; - - return While; - - })(Base); - - exports.Op = Op = (function(_super) { - var CONVERSIONS, INVERSIONS; - - __extends(Op, _super); - - Op.name = 'Op'; - - function Op(op, first, second, flip) { - if (op === 'in') { - return new In(first, second); - } - if (op === 'do') { - return this.generateDo(first); - } - if (op === 'new') { - if (first instanceof Call && !first["do"] && !first.isNew) { - return first.newInstance(); - } - if (first instanceof Code && first.bound || first["do"]) { - first = new Parens(first); - } - } - this.operator = CONVERSIONS[op] || op; - this.first = first; - this.second = second; - this.flip = !!flip; - return this; - } - - CONVERSIONS = { - '==': '===', - '!=': '!==', - 'of': 'in' - }; - - INVERSIONS = { - '!==': '===', - '===': '!==' - }; - - Op.prototype.children = ['first', 'second']; - - Op.prototype.isSimpleNumber = NO; - - Op.prototype.isUnary = function() { - return !this.second; - }; - - Op.prototype.isComplex = function() { - var _ref2; - return !(this.isUnary() && ((_ref2 = this.operator) === '+' || _ref2 === '-')) || this.first.isComplex(); - }; - - Op.prototype.isChainable = function() { - var _ref2; - return (_ref2 = this.operator) === '<' || _ref2 === '>' || _ref2 === '>=' || _ref2 === '<=' || _ref2 === '===' || _ref2 === '!=='; - }; - - Op.prototype.invert = function() { - var allInvertable, curr, fst, op, _ref2; - if (this.isChainable() && this.first.isChainable()) { - allInvertable = true; - curr = this; - while (curr && curr.operator) { - allInvertable && (allInvertable = curr.operator in INVERSIONS); - curr = curr.first; - } - if (!allInvertable) { - return new Parens(this).invert(); - } - curr = this; - while (curr && curr.operator) { - curr.invert = !curr.invert; - curr.operator = INVERSIONS[curr.operator]; - curr = curr.first; - } - return this; - } else if (op = INVERSIONS[this.operator]) { - this.operator = op; - if (this.first.unwrap() instanceof Op) { - this.first.invert(); - } - return this; - } else if (this.second) { - return new Parens(this).invert(); - } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((_ref2 = fst.operator) === '!' || _ref2 === 'in' || _ref2 === 'instanceof')) { - return fst; - } else { - return new Op('!', this); - } - }; - - Op.prototype.unfoldSoak = function(o) { - var _ref2; - return ((_ref2 = this.operator) === '++' || _ref2 === '--' || _ref2 === 'delete') && unfoldSoak(o, this, 'first'); - }; - - Op.prototype.generateDo = function(exp) { - var call, func, param, passedParams, ref, _i, _len, _ref2; - passedParams = []; - func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp; - _ref2 = func.params || []; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - param = _ref2[_i]; - if (param.value) { - passedParams.push(param.value); - delete param.value; - } else { - passedParams.push(param); - } - } - call = new Call(exp, passedParams); - call["do"] = true; - return call; - }; - - Op.prototype.compileNode = function(o) { - var code, isChain, _ref2, _ref3; - isChain = this.isChainable() && this.first.isChainable(); - if (!isChain) { - this.first.front = this.front; - } - if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) { - throw SyntaxError('delete operand may not be argument or var'); - } - if (((_ref2 = this.operator) === '--' || _ref2 === '++') && (_ref3 = this.first.unwrapAll().value, __indexOf.call(STRICT_PROSCRIBED, _ref3) >= 0)) { - throw SyntaxError('prefix increment/decrement may not have eval or arguments operand'); - } - if (this.isUnary()) { - return this.compileUnary(o); - } - if (isChain) { - return this.compileChain(o); - } - if (this.operator === '?') { - return this.compileExistence(o); - } - code = this.first.compile(o, LEVEL_OP) + ' ' + this.operator + ' ' + this.second.compile(o, LEVEL_OP); - if (o.level <= LEVEL_OP) { - return code; - } else { - return "(" + code + ")"; - } - }; - - Op.prototype.compileChain = function(o) { - var code, fst, shared, _ref2; - _ref2 = this.first.second.cache(o), this.first.second = _ref2[0], shared = _ref2[1]; - fst = this.first.compile(o, LEVEL_OP); - code = "" + fst + " " + (this.invert ? '&&' : '||') + " " + (shared.compile(o)) + " " + this.operator + " " + (this.second.compile(o, LEVEL_OP)); - return "(" + code + ")"; - }; - - Op.prototype.compileExistence = function(o) { - var fst, ref; - if (this.first.isComplex() && o.level > LEVEL_TOP) { - ref = new Literal(o.scope.freeVariable('ref')); - fst = new Parens(new Assign(ref, this.first)); - } else { - fst = this.first; - ref = fst; - } - return new If(new Existence(fst), ref, { - type: 'if' - }).addElse(this.second).compile(o); - }; - - Op.prototype.compileUnary = function(o) { - var op, parts, plusMinus; - if (o.level >= LEVEL_ACCESS) { - return (new Parens(this)).compile(o); - } - parts = [op = this.operator]; - plusMinus = op === '+' || op === '-'; - if ((op === 'new' || op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) { - parts.push(' '); - } - if ((plusMinus && this.first instanceof Op) || (op === 'new' && this.first.isStatement(o))) { - this.first = new Parens(this.first); - } - parts.push(this.first.compile(o, LEVEL_OP)); - if (this.flip) { - parts.reverse(); - } - return parts.join(''); - }; - - Op.prototype.toString = function(idt) { - return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator); - }; - - return Op; - - })(Base); - - exports.In = In = (function(_super) { - - __extends(In, _super); - - In.name = 'In'; - - function In(object, array) { - this.object = object; - this.array = array; - } - - In.prototype.children = ['object', 'array']; - - In.prototype.invert = NEGATE; - - In.prototype.compileNode = function(o) { - var hasSplat, obj, _i, _len, _ref2; - if (this.array instanceof Value && this.array.isArray()) { - _ref2 = this.array.base.objects; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - obj = _ref2[_i]; - if (!(obj instanceof Splat)) { - continue; - } - hasSplat = true; - break; - } - if (!hasSplat) { - return this.compileOrTest(o); - } - } - return this.compileLoopTest(o); - }; - - In.prototype.compileOrTest = function(o) { - var cmp, cnj, i, item, ref, sub, tests, _ref2, _ref3; - if (this.array.base.objects.length === 0) { - return "" + (!!this.negated); - } - _ref2 = this.object.cache(o, LEVEL_OP), sub = _ref2[0], ref = _ref2[1]; - _ref3 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = _ref3[0], cnj = _ref3[1]; - tests = (function() { - var _i, _len, _ref4, _results; - _ref4 = this.array.base.objects; - _results = []; - for (i = _i = 0, _len = _ref4.length; _i < _len; i = ++_i) { - item = _ref4[i]; - _results.push((i ? ref : sub) + cmp + item.compile(o, LEVEL_ACCESS)); - } - return _results; - }).call(this); - tests = tests.join(cnj); - if (o.level < LEVEL_OP) { - return tests; - } else { - return "(" + tests + ")"; - } - }; - - In.prototype.compileLoopTest = function(o) { - var code, ref, sub, _ref2; - _ref2 = this.object.cache(o, LEVEL_LIST), sub = _ref2[0], ref = _ref2[1]; - code = utility('indexOf') + (".call(" + (this.array.compile(o, LEVEL_LIST)) + ", " + ref + ") ") + (this.negated ? '< 0' : '>= 0'); - if (sub === ref) { - return code; - } - code = sub + ', ' + code; - if (o.level < LEVEL_LIST) { - return code; - } else { - return "(" + code + ")"; - } - }; - - In.prototype.toString = function(idt) { - return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : '')); - }; - - return In; - - })(Base); - - exports.Try = Try = (function(_super) { - - __extends(Try, _super); - - Try.name = 'Try'; - - function Try(attempt, error, recovery, ensure) { - this.attempt = attempt; - this.error = error; - this.recovery = recovery; - this.ensure = ensure; - } - - Try.prototype.children = ['attempt', 'recovery', 'ensure']; - - Try.prototype.isStatement = YES; - - Try.prototype.jumps = function(o) { - var _ref2; - return this.attempt.jumps(o) || ((_ref2 = this.recovery) != null ? _ref2.jumps(o) : void 0); - }; - - Try.prototype.makeReturn = function(res) { - if (this.attempt) { - this.attempt = this.attempt.makeReturn(res); - } - if (this.recovery) { - this.recovery = this.recovery.makeReturn(res); - } - return this; - }; - - Try.prototype.compileNode = function(o) { - var catchPart, ensurePart, errorPart, tryPart; - o.indent += TAB; - errorPart = this.error ? " (" + (this.error.compile(o)) + ") " : ' '; - tryPart = this.attempt.compile(o, LEVEL_TOP); - catchPart = (function() { - var _ref2; - if (this.recovery) { - if (_ref2 = this.error.value, __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) { - throw SyntaxError("catch variable may not be \"" + this.error.value + "\""); - } - if (!o.scope.check(this.error.value)) { - o.scope.add(this.error.value, 'param'); - } - return " catch" + errorPart + "{\n" + (this.recovery.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}"; - } else if (!(this.ensure || this.recovery)) { - return ' catch (_error) {}'; - } - }).call(this); - ensurePart = this.ensure ? " finally {\n" + (this.ensure.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : ''; - return "" + this.tab + "try {\n" + tryPart + "\n" + this.tab + "}" + (catchPart || '') + ensurePart; - }; - - return Try; - - })(Base); - - exports.Throw = Throw = (function(_super) { - - __extends(Throw, _super); - - Throw.name = 'Throw'; - - function Throw(expression) { - this.expression = expression; - } - - Throw.prototype.children = ['expression']; - - Throw.prototype.isStatement = YES; - - Throw.prototype.jumps = NO; - - Throw.prototype.makeReturn = THIS; - - Throw.prototype.compileNode = function(o) { - return this.tab + ("throw " + (this.expression.compile(o)) + ";"); - }; - - return Throw; - - })(Base); - - exports.Existence = Existence = (function(_super) { - - __extends(Existence, _super); - - Existence.name = 'Existence'; - - function Existence(expression) { - this.expression = expression; - } - - Existence.prototype.children = ['expression']; - - Existence.prototype.invert = NEGATE; - - Existence.prototype.compileNode = function(o) { - var cmp, cnj, code, _ref2; - this.expression.front = this.front; - code = this.expression.compile(o, LEVEL_OP); - if (IDENTIFIER.test(code) && !o.scope.check(code)) { - _ref2 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = _ref2[0], cnj = _ref2[1]; - code = "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null"; - } else { - code = "" + code + " " + (this.negated ? '==' : '!=') + " null"; - } - if (o.level <= LEVEL_COND) { - return code; - } else { - return "(" + code + ")"; - } - }; - - return Existence; - - })(Base); - - exports.Parens = Parens = (function(_super) { - - __extends(Parens, _super); - - Parens.name = 'Parens'; - - function Parens(body) { - this.body = body; - } - - Parens.prototype.children = ['body']; - - Parens.prototype.unwrap = function() { - return this.body; - }; - - Parens.prototype.isComplex = function() { - return this.body.isComplex(); - }; - - Parens.prototype.compileNode = function(o) { - var bare, code, expr; - expr = this.body.unwrap(); - if (expr instanceof Value && expr.isAtomic()) { - expr.front = this.front; - return expr.compile(o); - } - code = expr.compile(o, LEVEL_PAREN); - bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns)); - if (bare) { - return code; - } else { - return "(" + code + ")"; - } - }; - - return Parens; - - })(Base); - - exports.For = For = (function(_super) { - - __extends(For, _super); - - For.name = 'For'; - - function For(body, source) { - var _ref2; - this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index; - this.body = Block.wrap([body]); - this.own = !!source.own; - this.object = !!source.object; - if (this.object) { - _ref2 = [this.index, this.name], this.name = _ref2[0], this.index = _ref2[1]; - } - if (this.index instanceof Value) { - throw SyntaxError('index cannot be a pattern matching expression'); - } - this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length; - this.pattern = this.name instanceof Value; - if (this.range && this.index) { - throw SyntaxError('indexes do not apply to range loops'); - } - if (this.range && this.pattern) { - throw SyntaxError('cannot pattern match over range loops'); - } - this.returns = false; - } - - For.prototype.children = ['body', 'source', 'guard', 'step']; - - For.prototype.compileNode = function(o) { - var body, defPart, forPart, forVarPart, guardPart, idt1, index, ivar, kvar, kvarAssign, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, stepPart, stepvar, svar, varPart, _ref2; - body = Block.wrap([this.body]); - lastJumps = (_ref2 = last(body.expressions)) != null ? _ref2.jumps() : void 0; - if (lastJumps && lastJumps instanceof Return) { - this.returns = false; - } - source = this.range ? this.source.base : this.source; - scope = o.scope; - name = this.name && this.name.compile(o, LEVEL_LIST); - index = this.index && this.index.compile(o, LEVEL_LIST); - if (name && !this.pattern) { - scope.find(name, { - immediate: true - }); - } - if (index) { - scope.find(index, { - immediate: true - }); - } - if (this.returns) { - rvar = scope.freeVariable('results'); - } - ivar = (this.object && index) || scope.freeVariable('i'); - kvar = (this.range && name) || index || ivar; - kvarAssign = kvar !== ivar ? "" + kvar + " = " : ""; - if (this.step && !this.range) { - stepvar = scope.freeVariable("step"); - } - if (this.pattern) { - name = ivar; - } - varPart = ''; - guardPart = ''; - defPart = ''; - idt1 = this.tab + TAB; - if (this.range) { - forPart = source.compile(merge(o, { - index: ivar, - name: name, - step: this.step - })); - } else { - svar = this.source.compile(o, LEVEL_LIST); - if ((name || this.own) && !IDENTIFIER.test(svar)) { - defPart = "" + this.tab + (ref = scope.freeVariable('ref')) + " = " + svar + ";\n"; - svar = ref; - } - if (name && !this.pattern) { - namePart = "" + name + " = " + svar + "[" + kvar + "]"; - } - if (!this.object) { - lvar = scope.freeVariable('len'); - forVarPart = "" + kvarAssign + ivar + " = 0, " + lvar + " = " + svar + ".length"; - if (this.step) { - forVarPart += ", " + stepvar + " = " + (this.step.compile(o, LEVEL_OP)); - } - stepPart = "" + kvarAssign + (this.step ? "" + ivar + " += " + stepvar : (kvar !== ivar ? "++" + ivar : "" + ivar + "++")); - forPart = "" + forVarPart + "; " + ivar + " < " + lvar + "; " + stepPart; - } - } - if (this.returns) { - resultPart = "" + this.tab + rvar + " = [];\n"; - returnResult = "\n" + this.tab + "return " + rvar + ";"; - body.makeReturn(rvar); - } - if (this.guard) { - if (body.expressions.length > 1) { - body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal("continue"))); - } else { - if (this.guard) { - body = Block.wrap([new If(this.guard, body)]); - } - } - } - if (this.pattern) { - body.expressions.unshift(new Assign(this.name, new Literal("" + svar + "[" + kvar + "]"))); - } - defPart += this.pluckDirectCall(o, body); - if (namePart) { - varPart = "\n" + idt1 + namePart + ";"; - } - if (this.object) { - forPart = "" + kvar + " in " + svar; - if (this.own) { - guardPart = "\n" + idt1 + "if (!" + (utility('hasProp')) + ".call(" + svar + ", " + kvar + ")) continue;"; - } - } - body = body.compile(merge(o, { - indent: idt1 - }), LEVEL_TOP); - if (body) { - body = '\n' + body + '\n'; - } - return "" + defPart + (resultPart || '') + this.tab + "for (" + forPart + ") {" + guardPart + varPart + body + this.tab + "}" + (returnResult || ''); - }; - - For.prototype.pluckDirectCall = function(o, body) { - var base, defs, expr, fn, idx, ref, val, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7; - defs = ''; - _ref2 = body.expressions; - for (idx = _i = 0, _len = _ref2.length; _i < _len; idx = ++_i) { - expr = _ref2[idx]; - expr = expr.unwrapAll(); - if (!(expr instanceof Call)) { - continue; - } - val = expr.variable.unwrapAll(); - if (!((val instanceof Code) || (val instanceof Value && ((_ref3 = val.base) != null ? _ref3.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((_ref4 = (_ref5 = val.properties[0].name) != null ? _ref5.value : void 0) === 'call' || _ref4 === 'apply')))) { - continue; - } - fn = ((_ref6 = val.base) != null ? _ref6.unwrapAll() : void 0) || val; - ref = new Literal(o.scope.freeVariable('fn')); - base = new Value(ref); - if (val.base) { - _ref7 = [base, val], val.base = _ref7[0], base = _ref7[1]; - } - body.expressions[idx] = new Call(base, expr.args); - defs += this.tab + new Assign(ref, fn).compile(o, LEVEL_TOP) + ';\n'; - } - return defs; - }; - - return For; - - })(While); - - exports.Switch = Switch = (function(_super) { - - __extends(Switch, _super); - - Switch.name = 'Switch'; - - function Switch(subject, cases, otherwise) { - this.subject = subject; - this.cases = cases; - this.otherwise = otherwise; - } - - Switch.prototype.children = ['subject', 'cases', 'otherwise']; - - Switch.prototype.isStatement = YES; - - Switch.prototype.jumps = function(o) { - var block, conds, _i, _len, _ref2, _ref3, _ref4; - if (o == null) { - o = { - block: true - }; - } - _ref2 = this.cases; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - _ref3 = _ref2[_i], conds = _ref3[0], block = _ref3[1]; - if (block.jumps(o)) { - return block; - } - } - return (_ref4 = this.otherwise) != null ? _ref4.jumps(o) : void 0; - }; - - Switch.prototype.makeReturn = function(res) { - var pair, _i, _len, _ref2, _ref3; - _ref2 = this.cases; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - pair = _ref2[_i]; - pair[1].makeReturn(res); - } - if (res) { - this.otherwise || (this.otherwise = new Block([new Literal('void 0')])); - } - if ((_ref3 = this.otherwise) != null) { - _ref3.makeReturn(res); - } - return this; - }; - - Switch.prototype.compileNode = function(o) { - var block, body, code, cond, conditions, expr, i, idt1, idt2, _i, _j, _len, _len1, _ref2, _ref3, _ref4, _ref5; - idt1 = o.indent + TAB; - idt2 = o.indent = idt1 + TAB; - code = this.tab + ("switch (" + (((_ref2 = this.subject) != null ? _ref2.compile(o, LEVEL_PAREN) : void 0) || false) + ") {\n"); - _ref3 = this.cases; - for (i = _i = 0, _len = _ref3.length; _i < _len; i = ++_i) { - _ref4 = _ref3[i], conditions = _ref4[0], block = _ref4[1]; - _ref5 = flatten([conditions]); - for (_j = 0, _len1 = _ref5.length; _j < _len1; _j++) { - cond = _ref5[_j]; - if (!this.subject) { - cond = cond.invert(); - } - code += idt1 + ("case " + (cond.compile(o, LEVEL_PAREN)) + ":\n"); - } - if (body = block.compile(o, LEVEL_TOP)) { - code += body + '\n'; - } - if (i === this.cases.length - 1 && !this.otherwise) { - break; - } - expr = this.lastNonComment(block.expressions); - if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) { - continue; - } - code += idt2 + 'break;\n'; - } - if (this.otherwise && this.otherwise.expressions.length) { - code += idt1 + ("default:\n" + (this.otherwise.compile(o, LEVEL_TOP)) + "\n"); - } - return code + this.tab + '}'; - }; - - return Switch; - - })(Base); - - exports.If = If = (function(_super) { - - __extends(If, _super); - - If.name = 'If'; - - function If(condition, body, options) { - this.body = body; - if (options == null) { - options = {}; - } - this.condition = options.type === 'unless' ? condition.invert() : condition; - this.elseBody = null; - this.isChain = false; - this.soak = options.soak; - } - - If.prototype.children = ['condition', 'body', 'elseBody']; - - If.prototype.bodyNode = function() { - var _ref2; - return (_ref2 = this.body) != null ? _ref2.unwrap() : void 0; - }; - - If.prototype.elseBodyNode = function() { - var _ref2; - return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : void 0; - }; - - If.prototype.addElse = function(elseBody) { - if (this.isChain) { - this.elseBodyNode().addElse(elseBody); - } else { - this.isChain = elseBody instanceof If; - this.elseBody = this.ensureBlock(elseBody); - } - return this; - }; - - If.prototype.isStatement = function(o) { - var _ref2; - return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : void 0); - }; - - If.prototype.jumps = function(o) { - var _ref2; - return this.body.jumps(o) || ((_ref2 = this.elseBody) != null ? _ref2.jumps(o) : void 0); - }; - - If.prototype.compileNode = function(o) { - if (this.isStatement(o)) { - return this.compileStatement(o); - } else { - return this.compileExpression(o); - } - }; - - If.prototype.makeReturn = function(res) { - if (res) { - this.elseBody || (this.elseBody = new Block([new Literal('void 0')])); - } - this.body && (this.body = new Block([this.body.makeReturn(res)])); - this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(res)])); - return this; - }; - - If.prototype.ensureBlock = function(node) { - if (node instanceof Block) { - return node; - } else { - return new Block([node]); - } - }; - - If.prototype.compileStatement = function(o) { - var body, child, cond, exeq, ifPart; - child = del(o, 'chainChild'); - exeq = del(o, 'isExistentialEquals'); - if (exeq) { - return new If(this.condition.invert(), this.elseBodyNode(), { - type: 'if' - }).compile(o); - } - cond = this.condition.compile(o, LEVEL_PAREN); - o.indent += TAB; - body = this.ensureBlock(this.body); - ifPart = "if (" + cond + ") {\n" + (body.compile(o)) + "\n" + this.tab + "}"; - if (!child) { - ifPart = this.tab + ifPart; - } - if (!this.elseBody) { - return ifPart; - } - return ifPart + ' else ' + (this.isChain ? (o.indent = this.tab, o.chainChild = true, this.elseBody.unwrap().compile(o, LEVEL_TOP)) : "{\n" + (this.elseBody.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}"); - }; - - If.prototype.compileExpression = function(o) { - var alt, body, code, cond; - cond = this.condition.compile(o, LEVEL_COND); - body = this.bodyNode().compile(o, LEVEL_LIST); - alt = this.elseBodyNode() ? this.elseBodyNode().compile(o, LEVEL_LIST) : 'void 0'; - code = "" + cond + " ? " + body + " : " + alt; - if (o.level >= LEVEL_COND) { - return "(" + code + ")"; - } else { - return code; - } - }; - - If.prototype.unfoldSoak = function() { - return this.soak && this; - }; - - return If; - - })(Base); - - Closure = { - wrap: function(expressions, statement, noReturn) { - var args, call, func, mentionsArgs, meth; - if (expressions.jumps()) { - return expressions; - } - func = new Code([], Block.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 Access(meth)]); - } - func.noReturn = noReturn; - call = new Call(func, args); - if (statement) { - return Block.wrap([call]); - } else { - return call; - } - }, - literalArgs: function(node) { - return node instanceof Literal && node.value === 'arguments' && !node.asKey; - }, - literalThis: function(node) { - return (node instanceof Literal && node.value === 'this' && !node.asKey) || (node instanceof Code && node.bound); - } - }; - - 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; - }; - - UTILITIES = { - "extends": function() { - return "function(child, parent) { for (var key in parent) { if (" + (utility('hasProp')) + ".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }"; - }, - bind: function() { - return 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }'; - }, - indexOf: function() { - return "[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"; - }, - hasProp: function() { - return '{}.hasOwnProperty'; - }, - slice: function() { - return '[].slice'; - } - }; - - LEVEL_TOP = 1; - - LEVEL_PAREN = 2; - - LEVEL_LIST = 3; - - LEVEL_COND = 4; - - LEVEL_OP = 5; - - LEVEL_ACCESS = 6; - - TAB = ' '; - - IDENTIFIER_STR = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"; - - IDENTIFIER = RegExp("^" + IDENTIFIER_STR + "$"); - - SIMPLENUM = /^[+-]?\d+$/; - - METHOD_DEF = RegExp("^(?:(" + IDENTIFIER_STR + ")\\.prototype(?:\\.(" + IDENTIFIER_STR + ")|\\[(\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"|'(?:[^\\\\'\\r\\n]|\\\\.)*')\\]|\\[(0x[\\da-fA-F]+|\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\]))|(" + IDENTIFIER_STR + ")$"); - - IS_STRING = /^['"]/; - - utility = function(name) { - var ref; - ref = "__" + name; - Scope.root.assign(ref, UTILITIES[name]()); - return ref; - }; - - multident = function(code, tab) { - code = code.replace(/\n/g, '$&' + tab); - return code.replace(/\s+$/, ''); - }; - -}).call(this); -}, "coffee-script/optparse": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments; - - exports.OptionParser = OptionParser = (function() { - - OptionParser.name = 'OptionParser'; - - function OptionParser(rules, banner) { - this.banner = banner; - this.rules = buildRules(rules); - } - - OptionParser.prototype.parse = function(args) { - var arg, i, isOption, matchedRule, options, originalArgs, pos, rule, seenNonOptionArg, skippingArgument, value, _i, _j, _len, _len1, _ref; - options = { - "arguments": [] - }; - skippingArgument = false; - originalArgs = args; - args = normalizeArguments(args); - for (i = _i = 0, _len = args.length; _i < _len; i = ++_i) { - arg = args[i]; - if (skippingArgument) { - skippingArgument = false; - continue; - } - if (arg === '--') { - pos = originalArgs.indexOf('--'); - options["arguments"] = options["arguments"].concat(originalArgs.slice(pos + 1)); - break; - } - isOption = !!(arg.match(LONG_FLAG) || arg.match(SHORT_FLAG)); - seenNonOptionArg = options["arguments"].length > 0; - if (!seenNonOptionArg) { - matchedRule = false; - _ref = this.rules; - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - rule = _ref[_j]; - if (rule.shortFlag === arg || rule.longFlag === arg) { - value = true; - if (rule.hasArgument) { - skippingArgument = true; - value = args[i + 1]; - } - options[rule.name] = rule.isList ? (options[rule.name] || []).concat(value) : value; - matchedRule = true; - break; - } - } - if (isOption && !matchedRule) { - throw new Error("unrecognized option: " + arg); - } - } - if (seenNonOptionArg || !isOption) { - options["arguments"].push(arg); - } - } - return options; - }; - - OptionParser.prototype.help = function() { - var letPart, lines, rule, spaces, _i, _len, _ref; - lines = []; - if (this.banner) { - lines.unshift("" + this.banner + "\n"); - } - _ref = this.rules; - for (_i = 0, _len = _ref.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 tuple, _i, _len, _results; - _results = []; - for (_i = 0, _len = rules.length; _i < _len; _i++) { - tuple = rules[_i]; - if (tuple.length < 3) { - tuple.unshift(null); - } - _results.push(buildRule.apply(null, tuple)); - } - return _results; - }; - - buildRule = function(shortFlag, longFlag, description, options) { - var match; - if (options == null) { - options = {}; - } - match = longFlag.match(OPTIONAL); - longFlag = longFlag.match(LONG_FLAG)[1]; - return { - name: longFlag.substr(2), - shortFlag: shortFlag, - longFlag: longFlag, - description: description, - hasArgument: !!(match && match[1]), - isList: !!(match && match[2]) - }; - }; - - normalizeArguments = function(args) { - var arg, l, match, result, _i, _j, _len, _len1, _ref; - args = args.slice(0); - result = []; - for (_i = 0, _len = args.length; _i < _len; _i++) { - arg = args[_i]; - if (match = arg.match(MULTI_FLAG)) { - _ref = match[1].split(''); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - l = _ref[_j]; - result.push('-' + l); - } - } else { - result.push(arg); - } - } - return result; - }; - -}).call(this); -}, "coffee-script/parser": function(exports, require, module) {/* Jison generated parser */ -var parser = (function(){ -undefined -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"Root":3,"Body":4,"Block":5,"TERMINATOR":6,"Line":7,"Expression":8,"Statement":9,"Return":10,"Comment":11,"STATEMENT":12,"Value":13,"Invocation":14,"Code":15,"Operation":16,"Assign":17,"If":18,"Try":19,"While":20,"For":21,"Switch":22,"Class":23,"Throw":24,"INDENT":25,"OUTDENT":26,"Identifier":27,"IDENTIFIER":28,"AlphaNumeric":29,"NUMBER":30,"STRING":31,"Literal":32,"JS":33,"REGEX":34,"DEBUGGER":35,"BOOL":36,"Assignable":37,"=":38,"AssignObj":39,"ObjAssignable":40,":":41,"ThisProperty":42,"RETURN":43,"HERECOMMENT":44,"PARAM_START":45,"ParamList":46,"PARAM_END":47,"FuncGlyph":48,"->":49,"=>":50,"OptComma":51,",":52,"Param":53,"ParamVar":54,"...":55,"Array":56,"Object":57,"Splat":58,"SimpleAssignable":59,"Accessor":60,"Parenthetical":61,"Range":62,"This":63,".":64,"?.":65,"::":66,"Index":67,"INDEX_START":68,"IndexValue":69,"INDEX_END":70,"INDEX_SOAK":71,"Slice":72,"{":73,"AssignList":74,"}":75,"CLASS":76,"EXTENDS":77,"OptFuncExist":78,"Arguments":79,"SUPER":80,"FUNC_EXIST":81,"CALL_START":82,"CALL_END":83,"ArgList":84,"THIS":85,"@":86,"[":87,"]":88,"RangeDots":89,"..":90,"Arg":91,"SimpleArgs":92,"TRY":93,"Catch":94,"FINALLY":95,"CATCH":96,"THROW":97,"(":98,")":99,"WhileSource":100,"WHILE":101,"WHEN":102,"UNTIL":103,"Loop":104,"LOOP":105,"ForBody":106,"FOR":107,"ForStart":108,"ForSource":109,"ForVariables":110,"OWN":111,"ForValue":112,"FORIN":113,"FOROF":114,"BY":115,"SWITCH":116,"Whens":117,"ELSE":118,"When":119,"LEADING_WHEN":120,"IfBlock":121,"IF":122,"POST_IF":123,"UNARY":124,"-":125,"+":126,"--":127,"++":128,"?":129,"MATH":130,"SHIFT":131,"COMPARE":132,"LOGIC":133,"RELATION":134,"COMPOUND_ASSIGN":135,"$accept":0,"$end":1}, -terminals_: {2:"error",6:"TERMINATOR",12:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"DEBUGGER",36:"BOOL",38:"=",41:":",43:"RETURN",44:"HERECOMMENT",45:"PARAM_START",47:"PARAM_END",49:"->",50:"=>",52:",",55:"...",64:".",65:"?.",66:"::",68:"INDEX_START",70:"INDEX_END",71:"INDEX_SOAK",73:"{",75:"}",76:"CLASS",77:"EXTENDS",80:"SUPER",81:"FUNC_EXIST",82:"CALL_START",83:"CALL_END",85:"THIS",86:"@",87:"[",88:"]",90:"..",93:"TRY",95:"FINALLY",96:"CATCH",97:"THROW",98:"(",99:")",101:"WHILE",102:"WHEN",103:"UNTIL",105:"LOOP",107:"FOR",111:"OWN",113:"FORIN",114:"FOROF",115:"BY",116:"SWITCH",118:"ELSE",120:"LEADING_WHEN",122:"IF",123:"POST_IF",124:"UNARY",125:"-",126:"+",127:"--",128:"++",129:"?",130:"MATH",131:"SHIFT",132:"COMPARE",133:"LOGIC",134:"RELATION",135:"COMPOUND_ASSIGN"}, -productions_: [0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,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],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[39,1],[39,3],[39,5],[39,1],[40,1],[40,1],[40,1],[10,2],[10,1],[11,1],[15,5],[15,2],[48,1],[48,1],[51,0],[51,1],[46,0],[46,1],[46,3],[53,1],[53,2],[53,3],[54,1],[54,1],[54,1],[54,1],[58,2],[59,1],[59,2],[59,2],[59,1],[37,1],[37,1],[37,1],[13,1],[13,1],[13,1],[13,1],[13,1],[60,2],[60,2],[60,2],[60,1],[60,1],[67,3],[67,2],[69,1],[69,1],[57,4],[74,0],[74,1],[74,3],[74,4],[74,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[78,0],[78,1],[79,2],[79,4],[63,1],[63,1],[42,2],[56,2],[56,4],[89,1],[89,1],[62,5],[72,3],[72,2],[72,2],[72,1],[84,1],[84,3],[84,4],[84,4],[84,6],[91,1],[91,1],[92,1],[92,3],[19,2],[19,3],[19,4],[19,5],[94,3],[24,2],[61,3],[61,5],[100,2],[100,4],[100,2],[100,4],[20,2],[20,2],[20,2],[20,1],[104,2],[104,2],[21,2],[21,2],[21,2],[106,2],[106,2],[108,2],[108,3],[112,1],[112,1],[112,1],[110,1],[110,3],[109,2],[109,2],[109,4],[109,4],[109,4],[109,6],[109,6],[22,5],[22,7],[22,4],[22,6],[117,1],[117,2],[119,3],[119,4],[121,3],[121,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,3]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1:return this.$ = new yy.Block; -break; -case 2:return this.$ = $$[$0]; -break; -case 3:return this.$ = $$[$0-1]; -break; -case 4:this.$ = yy.Block.wrap([$$[$0]]); -break; -case 5:this.$ = $$[$0-2].push($$[$0]); -break; -case 6:this.$ = $$[$0-1]; -break; -case 7:this.$ = $$[$0]; -break; -case 8:this.$ = $$[$0]; -break; -case 9:this.$ = $$[$0]; -break; -case 10:this.$ = $$[$0]; -break; -case 11:this.$ = new yy.Literal($$[$0]); -break; -case 12:this.$ = $$[$0]; -break; -case 13:this.$ = $$[$0]; -break; -case 14:this.$ = $$[$0]; -break; -case 15:this.$ = $$[$0]; -break; -case 16:this.$ = $$[$0]; -break; -case 17:this.$ = $$[$0]; -break; -case 18:this.$ = $$[$0]; -break; -case 19:this.$ = $$[$0]; -break; -case 20:this.$ = $$[$0]; -break; -case 21:this.$ = $$[$0]; -break; -case 22:this.$ = $$[$0]; -break; -case 23:this.$ = $$[$0]; -break; -case 24:this.$ = new yy.Block; -break; -case 25:this.$ = $$[$0-1]; -break; -case 26:this.$ = new yy.Literal($$[$0]); -break; -case 27:this.$ = new yy.Literal($$[$0]); -break; -case 28:this.$ = new yy.Literal($$[$0]); -break; -case 29:this.$ = $$[$0]; -break; -case 30:this.$ = new yy.Literal($$[$0]); -break; -case 31:this.$ = new yy.Literal($$[$0]); -break; -case 32:this.$ = new yy.Literal($$[$0]); -break; -case 33:this.$ = (function () { - var val; - val = new yy.Literal($$[$0]); - if ($$[$0] === 'undefined') val.isUndefined = true; - return val; - }()); -break; -case 34:this.$ = new yy.Assign($$[$0-2], $$[$0]); -break; -case 35:this.$ = new yy.Assign($$[$0-3], $$[$0]); -break; -case 36:this.$ = new yy.Assign($$[$0-4], $$[$0-1]); -break; -case 37:this.$ = new yy.Value($$[$0]); -break; -case 38:this.$ = new yy.Assign(new yy.Value($$[$0-2]), $$[$0], 'object'); -break; -case 39:this.$ = new yy.Assign(new yy.Value($$[$0-4]), $$[$0-1], 'object'); -break; -case 40:this.$ = $$[$0]; -break; -case 41:this.$ = $$[$0]; -break; -case 42:this.$ = $$[$0]; -break; -case 43:this.$ = $$[$0]; -break; -case 44:this.$ = new yy.Return($$[$0]); -break; -case 45:this.$ = new yy.Return; -break; -case 46:this.$ = new yy.Comment($$[$0]); -break; -case 47:this.$ = new yy.Code($$[$0-3], $$[$0], $$[$0-1]); -break; -case 48:this.$ = new yy.Code([], $$[$0], $$[$0-1]); -break; -case 49:this.$ = 'func'; -break; -case 50:this.$ = 'boundfunc'; -break; -case 51:this.$ = $$[$0]; -break; -case 52:this.$ = $$[$0]; -break; -case 53:this.$ = []; -break; -case 54:this.$ = [$$[$0]]; -break; -case 55:this.$ = $$[$0-2].concat($$[$0]); -break; -case 56:this.$ = new yy.Param($$[$0]); -break; -case 57:this.$ = new yy.Param($$[$0-1], null, true); -break; -case 58:this.$ = new yy.Param($$[$0-2], $$[$0]); -break; -case 59:this.$ = $$[$0]; -break; -case 60:this.$ = $$[$0]; -break; -case 61:this.$ = $$[$0]; -break; -case 62:this.$ = $$[$0]; -break; -case 63:this.$ = new yy.Splat($$[$0-1]); -break; -case 64:this.$ = new yy.Value($$[$0]); -break; -case 65:this.$ = $$[$0-1].add($$[$0]); -break; -case 66:this.$ = new yy.Value($$[$0-1], [].concat($$[$0])); -break; -case 67:this.$ = $$[$0]; -break; -case 68:this.$ = $$[$0]; -break; -case 69:this.$ = new yy.Value($$[$0]); -break; -case 70:this.$ = new yy.Value($$[$0]); -break; -case 71:this.$ = $$[$0]; -break; -case 72:this.$ = new yy.Value($$[$0]); -break; -case 73:this.$ = new yy.Value($$[$0]); -break; -case 74:this.$ = new yy.Value($$[$0]); -break; -case 75:this.$ = $$[$0]; -break; -case 76:this.$ = new yy.Access($$[$0]); -break; -case 77:this.$ = new yy.Access($$[$0], 'soak'); -break; -case 78:this.$ = [new yy.Access(new yy.Literal('prototype')), new yy.Access($$[$0])]; -break; -case 79:this.$ = new yy.Access(new yy.Literal('prototype')); -break; -case 80:this.$ = $$[$0]; -break; -case 81:this.$ = $$[$0-1]; -break; -case 82:this.$ = yy.extend($$[$0], { - soak: true - }); -break; -case 83:this.$ = new yy.Index($$[$0]); -break; -case 84:this.$ = new yy.Slice($$[$0]); -break; -case 85:this.$ = new yy.Obj($$[$0-2], $$[$0-3].generated); -break; -case 86:this.$ = []; -break; -case 87:this.$ = [$$[$0]]; -break; -case 88:this.$ = $$[$0-2].concat($$[$0]); -break; -case 89:this.$ = $$[$0-3].concat($$[$0]); -break; -case 90:this.$ = $$[$0-5].concat($$[$0-2]); -break; -case 91:this.$ = new yy.Class; -break; -case 92:this.$ = new yy.Class(null, null, $$[$0]); -break; -case 93:this.$ = new yy.Class(null, $$[$0]); -break; -case 94:this.$ = new yy.Class(null, $$[$0-1], $$[$0]); -break; -case 95:this.$ = new yy.Class($$[$0]); -break; -case 96:this.$ = new yy.Class($$[$0-1], null, $$[$0]); -break; -case 97:this.$ = new yy.Class($$[$0-2], $$[$0]); -break; -case 98:this.$ = new yy.Class($$[$0-3], $$[$0-1], $$[$0]); -break; -case 99:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]); -break; -case 100:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]); -break; -case 101:this.$ = new yy.Call('super', [new yy.Splat(new yy.Literal('arguments'))]); -break; -case 102:this.$ = new yy.Call('super', $$[$0]); -break; -case 103:this.$ = false; -break; -case 104:this.$ = true; -break; -case 105:this.$ = []; -break; -case 106:this.$ = $$[$0-2]; -break; -case 107:this.$ = new yy.Value(new yy.Literal('this')); -break; -case 108:this.$ = new yy.Value(new yy.Literal('this')); -break; -case 109:this.$ = new yy.Value(new yy.Literal('this'), [new yy.Access($$[$0])], 'this'); -break; -case 110:this.$ = new yy.Arr([]); -break; -case 111:this.$ = new yy.Arr($$[$0-2]); -break; -case 112:this.$ = 'inclusive'; -break; -case 113:this.$ = 'exclusive'; -break; -case 114:this.$ = new yy.Range($$[$0-3], $$[$0-1], $$[$0-2]); -break; -case 115:this.$ = new yy.Range($$[$0-2], $$[$0], $$[$0-1]); -break; -case 116:this.$ = new yy.Range($$[$0-1], null, $$[$0]); -break; -case 117:this.$ = new yy.Range(null, $$[$0], $$[$0-1]); -break; -case 118:this.$ = new yy.Range(null, null, $$[$0]); -break; -case 119:this.$ = [$$[$0]]; -break; -case 120:this.$ = $$[$0-2].concat($$[$0]); -break; -case 121:this.$ = $$[$0-3].concat($$[$0]); -break; -case 122:this.$ = $$[$0-2]; -break; -case 123:this.$ = $$[$0-5].concat($$[$0-2]); -break; -case 124:this.$ = $$[$0]; -break; -case 125:this.$ = $$[$0]; -break; -case 126:this.$ = $$[$0]; -break; -case 127:this.$ = [].concat($$[$0-2], $$[$0]); -break; -case 128:this.$ = new yy.Try($$[$0]); -break; -case 129:this.$ = new yy.Try($$[$0-1], $$[$0][0], $$[$0][1]); -break; -case 130:this.$ = new yy.Try($$[$0-2], null, null, $$[$0]); -break; -case 131:this.$ = new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0]); -break; -case 132:this.$ = [$$[$0-1], $$[$0]]; -break; -case 133:this.$ = new yy.Throw($$[$0]); -break; -case 134:this.$ = new yy.Parens($$[$0-1]); -break; -case 135:this.$ = new yy.Parens($$[$0-2]); -break; -case 136:this.$ = new yy.While($$[$0]); -break; -case 137:this.$ = new yy.While($$[$0-2], { - guard: $$[$0] - }); -break; -case 138:this.$ = new yy.While($$[$0], { - invert: true - }); -break; -case 139:this.$ = new yy.While($$[$0-2], { - invert: true, - guard: $$[$0] - }); -break; -case 140:this.$ = $$[$0-1].addBody($$[$0]); -break; -case 141:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]])); -break; -case 142:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]])); -break; -case 143:this.$ = $$[$0]; -break; -case 144:this.$ = new yy.While(new yy.Literal('true')).addBody($$[$0]); -break; -case 145:this.$ = new yy.While(new yy.Literal('true')).addBody(yy.Block.wrap([$$[$0]])); -break; -case 146:this.$ = new yy.For($$[$0-1], $$[$0]); -break; -case 147:this.$ = new yy.For($$[$0-1], $$[$0]); -break; -case 148:this.$ = new yy.For($$[$0], $$[$0-1]); -break; -case 149:this.$ = { - source: new yy.Value($$[$0]) - }; -break; -case 150:this.$ = (function () { - $$[$0].own = $$[$0-1].own; - $$[$0].name = $$[$0-1][0]; - $$[$0].index = $$[$0-1][1]; - return $$[$0]; - }()); -break; -case 151:this.$ = $$[$0]; -break; -case 152:this.$ = (function () { - $$[$0].own = true; - return $$[$0]; - }()); -break; -case 153:this.$ = $$[$0]; -break; -case 154:this.$ = new yy.Value($$[$0]); -break; -case 155:this.$ = new yy.Value($$[$0]); -break; -case 156:this.$ = [$$[$0]]; -break; -case 157:this.$ = [$$[$0-2], $$[$0]]; -break; -case 158:this.$ = { - source: $$[$0] - }; -break; -case 159:this.$ = { - source: $$[$0], - object: true - }; -break; -case 160:this.$ = { - source: $$[$0-2], - guard: $$[$0] - }; -break; -case 161:this.$ = { - source: $$[$0-2], - guard: $$[$0], - object: true - }; -break; -case 162:this.$ = { - source: $$[$0-2], - step: $$[$0] - }; -break; -case 163:this.$ = { - source: $$[$0-4], - guard: $$[$0-2], - step: $$[$0] - }; -break; -case 164:this.$ = { - source: $$[$0-4], - step: $$[$0-2], - guard: $$[$0] - }; -break; -case 165:this.$ = new yy.Switch($$[$0-3], $$[$0-1]); -break; -case 166:this.$ = new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]); -break; -case 167:this.$ = new yy.Switch(null, $$[$0-1]); -break; -case 168:this.$ = new yy.Switch(null, $$[$0-3], $$[$0-1]); -break; -case 169:this.$ = $$[$0]; -break; -case 170:this.$ = $$[$0-1].concat($$[$0]); -break; -case 171:this.$ = [[$$[$0-1], $$[$0]]]; -break; -case 172:this.$ = [[$$[$0-2], $$[$0-1]]]; -break; -case 173:this.$ = new yy.If($$[$0-1], $$[$0], { - type: $$[$0-2] - }); -break; -case 174:this.$ = $$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], { - type: $$[$0-2] - })); -break; -case 175:this.$ = $$[$0]; -break; -case 176:this.$ = $$[$0-2].addElse($$[$0]); -break; -case 177:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), { - type: $$[$0-1], - statement: true - }); -break; -case 178:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), { - type: $$[$0-1], - statement: true - }); -break; -case 179:this.$ = new yy.Op($$[$0-1], $$[$0]); -break; -case 180:this.$ = new yy.Op('-', $$[$0]); -break; -case 181:this.$ = new yy.Op('+', $$[$0]); -break; -case 182:this.$ = new yy.Op('--', $$[$0]); -break; -case 183:this.$ = new yy.Op('++', $$[$0]); -break; -case 184:this.$ = new yy.Op('--', $$[$0-1], null, true); -break; -case 185:this.$ = new yy.Op('++', $$[$0-1], null, true); -break; -case 186:this.$ = new yy.Existence($$[$0-1]); -break; -case 187:this.$ = new yy.Op('+', $$[$0-2], $$[$0]); -break; -case 188:this.$ = new yy.Op('-', $$[$0-2], $$[$0]); -break; -case 189:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 190:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 191:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 192:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 193:this.$ = (function () { - if ($$[$0-1].charAt(0) === '!') { - return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert(); - } else { - return new yy.Op($$[$0-1], $$[$0-2], $$[$0]); - } - }()); -break; -case 194:this.$ = new yy.Assign($$[$0-2], $$[$0], $$[$0-1]); -break; -case 195:this.$ = new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]); -break; -case 196:this.$ = new yy.Extends($$[$0-2], $$[$0]); -break; -} -}, -table: [{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[3]},{1:[2,2],6:[1,72]},{6:[1,73]},{1:[2,4],6:[2,4],26:[2,4],99:[2,4]},{4:75,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,74],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,7],6:[2,7],26:[2,7],99:[2,7],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,8],6:[2,8],26:[2,8],99:[2,8],100:88,101:[1,63],103:[1,64],106:89,107:[1,66],108:67,123:[1,87]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],47:[2,12],52:[2,12],55:[2,12],60:91,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],70:[2,12],71:[1,98],75:[2,12],78:90,81:[1,92],82:[2,103],83:[2,12],88:[2,12],90:[2,12],99:[2,12],101:[2,12],102:[2,12],103:[2,12],107:[2,12],115:[2,12],123:[2,12],125:[2,12],126:[2,12],129:[2,12],130:[2,12],131:[2,12],132:[2,12],133:[2,12],134:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],47:[2,13],52:[2,13],55:[2,13],60:100,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],70:[2,13],71:[1,98],75:[2,13],78:99,81:[1,92],82:[2,103],83:[2,13],88:[2,13],90:[2,13],99:[2,13],101:[2,13],102:[2,13],103:[2,13],107:[2,13],115:[2,13],123:[2,13],125:[2,13],126:[2,13],129:[2,13],130:[2,13],131:[2,13],132:[2,13],133:[2,13],134:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],47:[2,14],52:[2,14],55:[2,14],70:[2,14],75:[2,14],83:[2,14],88:[2,14],90:[2,14],99:[2,14],101:[2,14],102:[2,14],103:[2,14],107:[2,14],115:[2,14],123:[2,14],125:[2,14],126:[2,14],129:[2,14],130:[2,14],131:[2,14],132:[2,14],133:[2,14],134:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],47:[2,15],52:[2,15],55:[2,15],70:[2,15],75:[2,15],83:[2,15],88:[2,15],90:[2,15],99:[2,15],101:[2,15],102:[2,15],103:[2,15],107:[2,15],115:[2,15],123:[2,15],125:[2,15],126:[2,15],129:[2,15],130:[2,15],131:[2,15],132:[2,15],133:[2,15],134:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],47:[2,16],52:[2,16],55:[2,16],70:[2,16],75:[2,16],83:[2,16],88:[2,16],90:[2,16],99:[2,16],101:[2,16],102:[2,16],103:[2,16],107:[2,16],115:[2,16],123:[2,16],125:[2,16],126:[2,16],129:[2,16],130:[2,16],131:[2,16],132:[2,16],133:[2,16],134:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],47:[2,17],52:[2,17],55:[2,17],70:[2,17],75:[2,17],83:[2,17],88:[2,17],90:[2,17],99:[2,17],101:[2,17],102:[2,17],103:[2,17],107:[2,17],115:[2,17],123:[2,17],125:[2,17],126:[2,17],129:[2,17],130:[2,17],131:[2,17],132:[2,17],133:[2,17],134:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],47:[2,18],52:[2,18],55:[2,18],70:[2,18],75:[2,18],83:[2,18],88:[2,18],90:[2,18],99:[2,18],101:[2,18],102:[2,18],103:[2,18],107:[2,18],115:[2,18],123:[2,18],125:[2,18],126:[2,18],129:[2,18],130:[2,18],131:[2,18],132:[2,18],133:[2,18],134:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],47:[2,19],52:[2,19],55:[2,19],70:[2,19],75:[2,19],83:[2,19],88:[2,19],90:[2,19],99:[2,19],101:[2,19],102:[2,19],103:[2,19],107:[2,19],115:[2,19],123:[2,19],125:[2,19],126:[2,19],129:[2,19],130:[2,19],131:[2,19],132:[2,19],133:[2,19],134:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],47:[2,20],52:[2,20],55:[2,20],70:[2,20],75:[2,20],83:[2,20],88:[2,20],90:[2,20],99:[2,20],101:[2,20],102:[2,20],103:[2,20],107:[2,20],115:[2,20],123:[2,20],125:[2,20],126:[2,20],129:[2,20],130:[2,20],131:[2,20],132:[2,20],133:[2,20],134:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],47:[2,21],52:[2,21],55:[2,21],70:[2,21],75:[2,21],83:[2,21],88:[2,21],90:[2,21],99:[2,21],101:[2,21],102:[2,21],103:[2,21],107:[2,21],115:[2,21],123:[2,21],125:[2,21],126:[2,21],129:[2,21],130:[2,21],131:[2,21],132:[2,21],133:[2,21],134:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],47:[2,22],52:[2,22],55:[2,22],70:[2,22],75:[2,22],83:[2,22],88:[2,22],90:[2,22],99:[2,22],101:[2,22],102:[2,22],103:[2,22],107:[2,22],115:[2,22],123:[2,22],125:[2,22],126:[2,22],129:[2,22],130:[2,22],131:[2,22],132:[2,22],133:[2,22],134:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],47:[2,23],52:[2,23],55:[2,23],70:[2,23],75:[2,23],83:[2,23],88:[2,23],90:[2,23],99:[2,23],101:[2,23],102:[2,23],103:[2,23],107:[2,23],115:[2,23],123:[2,23],125:[2,23],126:[2,23],129:[2,23],130:[2,23],131:[2,23],132:[2,23],133:[2,23],134:[2,23]},{1:[2,9],6:[2,9],26:[2,9],99:[2,9],101:[2,9],103:[2,9],107:[2,9],123:[2,9]},{1:[2,10],6:[2,10],26:[2,10],99:[2,10],101:[2,10],103:[2,10],107:[2,10],123:[2,10]},{1:[2,11],6:[2,11],26:[2,11],99:[2,11],101:[2,11],103:[2,11],107:[2,11],123:[2,11]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],38:[1,101],47:[2,71],52:[2,71],55:[2,71],64:[2,71],65:[2,71],66:[2,71],68:[2,71],70:[2,71],71:[2,71],75:[2,71],81:[2,71],82:[2,71],83:[2,71],88:[2,71],90:[2,71],99:[2,71],101:[2,71],102:[2,71],103:[2,71],107:[2,71],115:[2,71],123:[2,71],125:[2,71],126:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],47:[2,72],52:[2,72],55:[2,72],64:[2,72],65:[2,72],66:[2,72],68:[2,72],70:[2,72],71:[2,72],75:[2,72],81:[2,72],82:[2,72],83:[2,72],88:[2,72],90:[2,72],99:[2,72],101:[2,72],102:[2,72],103:[2,72],107:[2,72],115:[2,72],123:[2,72],125:[2,72],126:[2,72],129:[2,72],130:[2,72],131:[2,72],132:[2,72],133:[2,72],134:[2,72]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],47:[2,73],52:[2,73],55:[2,73],64:[2,73],65:[2,73],66:[2,73],68:[2,73],70:[2,73],71:[2,73],75:[2,73],81:[2,73],82:[2,73],83:[2,73],88:[2,73],90:[2,73],99:[2,73],101:[2,73],102:[2,73],103:[2,73],107:[2,73],115:[2,73],123:[2,73],125:[2,73],126:[2,73],129:[2,73],130:[2,73],131:[2,73],132:[2,73],133:[2,73],134:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],47:[2,74],52:[2,74],55:[2,74],64:[2,74],65:[2,74],66:[2,74],68:[2,74],70:[2,74],71:[2,74],75:[2,74],81:[2,74],82:[2,74],83:[2,74],88:[2,74],90:[2,74],99:[2,74],101:[2,74],102:[2,74],103:[2,74],107:[2,74],115:[2,74],123:[2,74],125:[2,74],126:[2,74],129:[2,74],130:[2,74],131:[2,74],132:[2,74],133:[2,74],134:[2,74]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],47:[2,75],52:[2,75],55:[2,75],64:[2,75],65:[2,75],66:[2,75],68:[2,75],70:[2,75],71:[2,75],75:[2,75],81:[2,75],82:[2,75],83:[2,75],88:[2,75],90:[2,75],99:[2,75],101:[2,75],102:[2,75],103:[2,75],107:[2,75],115:[2,75],123:[2,75],125:[2,75],126:[2,75],129:[2,75],130:[2,75],131:[2,75],132:[2,75],133:[2,75],134:[2,75]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],47:[2,101],52:[2,101],55:[2,101],64:[2,101],65:[2,101],66:[2,101],68:[2,101],70:[2,101],71:[2,101],75:[2,101],79:102,81:[2,101],82:[1,103],83:[2,101],88:[2,101],90:[2,101],99:[2,101],101:[2,101],102:[2,101],103:[2,101],107:[2,101],115:[2,101],123:[2,101],125:[2,101],126:[2,101],129:[2,101],130:[2,101],131:[2,101],132:[2,101],133:[2,101],134:[2,101]},{27:107,28:[1,71],42:108,46:104,47:[2,53],52:[2,53],53:105,54:106,56:109,57:110,73:[1,68],86:[1,111],87:[1,112]},{5:113,25:[1,5]},{8:114,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:116,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:117,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{13:119,14:120,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,56:47,57:48,59:118,61:25,62:26,63:27,73:[1,68],80:[1,28],85:[1,56],86:[1,57],87:[1,55],98:[1,54]},{13:119,14:120,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,56:47,57:48,59:122,61:25,62:26,63:27,73:[1,68],80:[1,28],85:[1,56],86:[1,57],87:[1,55],98:[1,54]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],38:[2,68],47:[2,68],52:[2,68],55:[2,68],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,68],71:[2,68],75:[2,68],77:[1,126],81:[2,68],82:[2,68],83:[2,68],88:[2,68],90:[2,68],99:[2,68],101:[2,68],102:[2,68],103:[2,68],107:[2,68],115:[2,68],123:[2,68],125:[2,68],126:[2,68],127:[1,123],128:[1,124],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[1,125]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],47:[2,175],52:[2,175],55:[2,175],70:[2,175],75:[2,175],83:[2,175],88:[2,175],90:[2,175],99:[2,175],101:[2,175],102:[2,175],103:[2,175],107:[2,175],115:[2,175],118:[1,127],123:[2,175],125:[2,175],126:[2,175],129:[2,175],130:[2,175],131:[2,175],132:[2,175],133:[2,175],134:[2,175]},{5:128,25:[1,5]},{5:129,25:[1,5]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],47:[2,143],52:[2,143],55:[2,143],70:[2,143],75:[2,143],83:[2,143],88:[2,143],90:[2,143],99:[2,143],101:[2,143],102:[2,143],103:[2,143],107:[2,143],115:[2,143],123:[2,143],125:[2,143],126:[2,143],129:[2,143],130:[2,143],131:[2,143],132:[2,143],133:[2,143],134:[2,143]},{5:130,25:[1,5]},{8:131,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,132],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,91],5:133,6:[2,91],13:119,14:120,25:[1,5],26:[2,91],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:121,42:61,47:[2,91],52:[2,91],55:[2,91],56:47,57:48,59:135,61:25,62:26,63:27,70:[2,91],73:[1,68],75:[2,91],77:[1,134],80:[1,28],83:[2,91],85:[1,56],86:[1,57],87:[1,55],88:[2,91],90:[2,91],98:[1,54],99:[2,91],101:[2,91],102:[2,91],103:[2,91],107:[2,91],115:[2,91],123:[2,91],125:[2,91],126:[2,91],129:[2,91],130:[2,91],131:[2,91],132:[2,91],133:[2,91],134:[2,91]},{8:136,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,45],6:[2,45],8:137,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,45],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],99:[2,45],100:39,101:[2,45],103:[2,45],104:40,105:[1,65],106:41,107:[2,45],108:67,116:[1,42],121:37,122:[1,62],123:[2,45],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,46],6:[2,46],25:[2,46],26:[2,46],52:[2,46],75:[2,46],99:[2,46],101:[2,46],103:[2,46],107:[2,46],123:[2,46]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],38:[2,69],47:[2,69],52:[2,69],55:[2,69],64:[2,69],65:[2,69],66:[2,69],68:[2,69],70:[2,69],71:[2,69],75:[2,69],81:[2,69],82:[2,69],83:[2,69],88:[2,69],90:[2,69],99:[2,69],101:[2,69],102:[2,69],103:[2,69],107:[2,69],115:[2,69],123:[2,69],125:[2,69],126:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],38:[2,70],47:[2,70],52:[2,70],55:[2,70],64:[2,70],65:[2,70],66:[2,70],68:[2,70],70:[2,70],71:[2,70],75:[2,70],81:[2,70],82:[2,70],83:[2,70],88:[2,70],90:[2,70],99:[2,70],101:[2,70],102:[2,70],103:[2,70],107:[2,70],115:[2,70],123:[2,70],125:[2,70],126:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],47:[2,29],52:[2,29],55:[2,29],64:[2,29],65:[2,29],66:[2,29],68:[2,29],70:[2,29],71:[2,29],75:[2,29],81:[2,29],82:[2,29],83:[2,29],88:[2,29],90:[2,29],99:[2,29],101:[2,29],102:[2,29],103:[2,29],107:[2,29],115:[2,29],123:[2,29],125:[2,29],126:[2,29],129:[2,29],130:[2,29],131:[2,29],132:[2,29],133:[2,29],134:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],47:[2,30],52:[2,30],55:[2,30],64:[2,30],65:[2,30],66:[2,30],68:[2,30],70:[2,30],71:[2,30],75:[2,30],81:[2,30],82:[2,30],83:[2,30],88:[2,30],90:[2,30],99:[2,30],101:[2,30],102:[2,30],103:[2,30],107:[2,30],115:[2,30],123:[2,30],125:[2,30],126:[2,30],129:[2,30],130:[2,30],131:[2,30],132:[2,30],133:[2,30],134:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],47:[2,31],52:[2,31],55:[2,31],64:[2,31],65:[2,31],66:[2,31],68:[2,31],70:[2,31],71:[2,31],75:[2,31],81:[2,31],82:[2,31],83:[2,31],88:[2,31],90:[2,31],99:[2,31],101:[2,31],102:[2,31],103:[2,31],107:[2,31],115:[2,31],123:[2,31],125:[2,31],126:[2,31],129:[2,31],130:[2,31],131:[2,31],132:[2,31],133:[2,31],134:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],47:[2,32],52:[2,32],55:[2,32],64:[2,32],65:[2,32],66:[2,32],68:[2,32],70:[2,32],71:[2,32],75:[2,32],81:[2,32],82:[2,32],83:[2,32],88:[2,32],90:[2,32],99:[2,32],101:[2,32],102:[2,32],103:[2,32],107:[2,32],115:[2,32],123:[2,32],125:[2,32],126:[2,32],129:[2,32],130:[2,32],131:[2,32],132:[2,32],133:[2,32],134:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],47:[2,33],52:[2,33],55:[2,33],64:[2,33],65:[2,33],66:[2,33],68:[2,33],70:[2,33],71:[2,33],75:[2,33],81:[2,33],82:[2,33],83:[2,33],88:[2,33],90:[2,33],99:[2,33],101:[2,33],102:[2,33],103:[2,33],107:[2,33],115:[2,33],123:[2,33],125:[2,33],126:[2,33],129:[2,33],130:[2,33],131:[2,33],132:[2,33],133:[2,33],134:[2,33]},{4:138,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,139],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:140,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:142,85:[1,56],86:[1,57],87:[1,55],88:[1,141],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],47:[2,107],52:[2,107],55:[2,107],64:[2,107],65:[2,107],66:[2,107],68:[2,107],70:[2,107],71:[2,107],75:[2,107],81:[2,107],82:[2,107],83:[2,107],88:[2,107],90:[2,107],99:[2,107],101:[2,107],102:[2,107],103:[2,107],107:[2,107],115:[2,107],123:[2,107],125:[2,107],126:[2,107],129:[2,107],130:[2,107],131:[2,107],132:[2,107],133:[2,107],134:[2,107]},{1:[2,108],6:[2,108],25:[2,108],26:[2,108],27:146,28:[1,71],47:[2,108],52:[2,108],55:[2,108],64:[2,108],65:[2,108],66:[2,108],68:[2,108],70:[2,108],71:[2,108],75:[2,108],81:[2,108],82:[2,108],83:[2,108],88:[2,108],90:[2,108],99:[2,108],101:[2,108],102:[2,108],103:[2,108],107:[2,108],115:[2,108],123:[2,108],125:[2,108],126:[2,108],129:[2,108],130:[2,108],131:[2,108],132:[2,108],133:[2,108],134:[2,108]},{25:[2,49]},{25:[2,50]},{1:[2,64],6:[2,64],25:[2,64],26:[2,64],38:[2,64],47:[2,64],52:[2,64],55:[2,64],64:[2,64],65:[2,64],66:[2,64],68:[2,64],70:[2,64],71:[2,64],75:[2,64],77:[2,64],81:[2,64],82:[2,64],83:[2,64],88:[2,64],90:[2,64],99:[2,64],101:[2,64],102:[2,64],103:[2,64],107:[2,64],115:[2,64],123:[2,64],125:[2,64],126:[2,64],127:[2,64],128:[2,64],129:[2,64],130:[2,64],131:[2,64],132:[2,64],133:[2,64],134:[2,64],135:[2,64]},{1:[2,67],6:[2,67],25:[2,67],26:[2,67],38:[2,67],47:[2,67],52:[2,67],55:[2,67],64:[2,67],65:[2,67],66:[2,67],68:[2,67],70:[2,67],71:[2,67],75:[2,67],77:[2,67],81:[2,67],82:[2,67],83:[2,67],88:[2,67],90:[2,67],99:[2,67],101:[2,67],102:[2,67],103:[2,67],107:[2,67],115:[2,67],123:[2,67],125:[2,67],126:[2,67],127:[2,67],128:[2,67],129:[2,67],130:[2,67],131:[2,67],132:[2,67],133:[2,67],134:[2,67],135:[2,67]},{8:147,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:148,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:149,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:150,8:151,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{27:156,28:[1,71],56:157,57:158,62:152,73:[1,68],87:[1,55],110:153,111:[1,154],112:155},{109:159,113:[1,160],114:[1,161]},{6:[2,86],11:165,25:[2,86],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:163,40:164,42:168,44:[1,46],52:[2,86],74:162,75:[2,86],86:[1,111]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],41:[2,27],47:[2,27],52:[2,27],55:[2,27],64:[2,27],65:[2,27],66:[2,27],68:[2,27],70:[2,27],71:[2,27],75:[2,27],81:[2,27],82:[2,27],83:[2,27],88:[2,27],90:[2,27],99:[2,27],101:[2,27],102:[2,27],103:[2,27],107:[2,27],115:[2,27],123:[2,27],125:[2,27],126:[2,27],129:[2,27],130:[2,27],131:[2,27],132:[2,27],133:[2,27],134:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],41:[2,28],47:[2,28],52:[2,28],55:[2,28],64:[2,28],65:[2,28],66:[2,28],68:[2,28],70:[2,28],71:[2,28],75:[2,28],81:[2,28],82:[2,28],83:[2,28],88:[2,28],90:[2,28],99:[2,28],101:[2,28],102:[2,28],103:[2,28],107:[2,28],115:[2,28],123:[2,28],125:[2,28],126:[2,28],129:[2,28],130:[2,28],131:[2,28],132:[2,28],133:[2,28],134:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],38:[2,26],41:[2,26],47:[2,26],52:[2,26],55:[2,26],64:[2,26],65:[2,26],66:[2,26],68:[2,26],70:[2,26],71:[2,26],75:[2,26],77:[2,26],81:[2,26],82:[2,26],83:[2,26],88:[2,26],90:[2,26],99:[2,26],101:[2,26],102:[2,26],103:[2,26],107:[2,26],113:[2,26],114:[2,26],115:[2,26],123:[2,26],125:[2,26],126:[2,26],127:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26]},{1:[2,6],6:[2,6],7:169,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],99:[2,6],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],47:[2,24],52:[2,24],55:[2,24],70:[2,24],75:[2,24],83:[2,24],88:[2,24],90:[2,24],95:[2,24],96:[2,24],99:[2,24],101:[2,24],102:[2,24],103:[2,24],107:[2,24],115:[2,24],118:[2,24],120:[2,24],123:[2,24],125:[2,24],126:[2,24],129:[2,24],130:[2,24],131:[2,24],132:[2,24],133:[2,24],134:[2,24]},{6:[1,72],26:[1,170]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],47:[2,186],52:[2,186],55:[2,186],70:[2,186],75:[2,186],83:[2,186],88:[2,186],90:[2,186],99:[2,186],101:[2,186],102:[2,186],103:[2,186],107:[2,186],115:[2,186],123:[2,186],125:[2,186],126:[2,186],129:[2,186],130:[2,186],131:[2,186],132:[2,186],133:[2,186],134:[2,186]},{8:171,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:172,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:173,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:174,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:175,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:176,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:177,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:178,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],47:[2,142],52:[2,142],55:[2,142],70:[2,142],75:[2,142],83:[2,142],88:[2,142],90:[2,142],99:[2,142],101:[2,142],102:[2,142],103:[2,142],107:[2,142],115:[2,142],123:[2,142],125:[2,142],126:[2,142],129:[2,142],130:[2,142],131:[2,142],132:[2,142],133:[2,142],134:[2,142]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],47:[2,147],52:[2,147],55:[2,147],70:[2,147],75:[2,147],83:[2,147],88:[2,147],90:[2,147],99:[2,147],101:[2,147],102:[2,147],103:[2,147],107:[2,147],115:[2,147],123:[2,147],125:[2,147],126:[2,147],129:[2,147],130:[2,147],131:[2,147],132:[2,147],133:[2,147],134:[2,147]},{8:179,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],47:[2,141],52:[2,141],55:[2,141],70:[2,141],75:[2,141],83:[2,141],88:[2,141],90:[2,141],99:[2,141],101:[2,141],102:[2,141],103:[2,141],107:[2,141],115:[2,141],123:[2,141],125:[2,141],126:[2,141],129:[2,141],130:[2,141],131:[2,141],132:[2,141],133:[2,141],134:[2,141]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],47:[2,146],52:[2,146],55:[2,146],70:[2,146],75:[2,146],83:[2,146],88:[2,146],90:[2,146],99:[2,146],101:[2,146],102:[2,146],103:[2,146],107:[2,146],115:[2,146],123:[2,146],125:[2,146],126:[2,146],129:[2,146],130:[2,146],131:[2,146],132:[2,146],133:[2,146],134:[2,146]},{79:180,82:[1,103]},{1:[2,65],6:[2,65],25:[2,65],26:[2,65],38:[2,65],47:[2,65],52:[2,65],55:[2,65],64:[2,65],65:[2,65],66:[2,65],68:[2,65],70:[2,65],71:[2,65],75:[2,65],77:[2,65],81:[2,65],82:[2,65],83:[2,65],88:[2,65],90:[2,65],99:[2,65],101:[2,65],102:[2,65],103:[2,65],107:[2,65],115:[2,65],123:[2,65],125:[2,65],126:[2,65],127:[2,65],128:[2,65],129:[2,65],130:[2,65],131:[2,65],132:[2,65],133:[2,65],134:[2,65],135:[2,65]},{82:[2,104]},{27:181,28:[1,71]},{27:182,28:[1,71]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],27:183,28:[1,71],38:[2,79],47:[2,79],52:[2,79],55:[2,79],64:[2,79],65:[2,79],66:[2,79],68:[2,79],70:[2,79],71:[2,79],75:[2,79],77:[2,79],81:[2,79],82:[2,79],83:[2,79],88:[2,79],90:[2,79],99:[2,79],101:[2,79],102:[2,79],103:[2,79],107:[2,79],115:[2,79],123:[2,79],125:[2,79],126:[2,79],127:[2,79],128:[2,79],129:[2,79],130:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],38:[2,80],47:[2,80],52:[2,80],55:[2,80],64:[2,80],65:[2,80],66:[2,80],68:[2,80],70:[2,80],71:[2,80],75:[2,80],77:[2,80],81:[2,80],82:[2,80],83:[2,80],88:[2,80],90:[2,80],99:[2,80],101:[2,80],102:[2,80],103:[2,80],107:[2,80],115:[2,80],123:[2,80],125:[2,80],126:[2,80],127:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80]},{8:185,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],55:[1,189],56:47,57:48,59:36,61:25,62:26,63:27,69:184,72:186,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],89:187,90:[1,188],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{67:190,68:[1,97],71:[1,98]},{79:191,82:[1,103]},{1:[2,66],6:[2,66],25:[2,66],26:[2,66],38:[2,66],47:[2,66],52:[2,66],55:[2,66],64:[2,66],65:[2,66],66:[2,66],68:[2,66],70:[2,66],71:[2,66],75:[2,66],77:[2,66],81:[2,66],82:[2,66],83:[2,66],88:[2,66],90:[2,66],99:[2,66],101:[2,66],102:[2,66],103:[2,66],107:[2,66],115:[2,66],123:[2,66],125:[2,66],126:[2,66],127:[2,66],128:[2,66],129:[2,66],130:[2,66],131:[2,66],132:[2,66],133:[2,66],134:[2,66],135:[2,66]},{6:[1,193],8:192,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,194],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,102],6:[2,102],25:[2,102],26:[2,102],47:[2,102],52:[2,102],55:[2,102],64:[2,102],65:[2,102],66:[2,102],68:[2,102],70:[2,102],71:[2,102],75:[2,102],81:[2,102],82:[2,102],83:[2,102],88:[2,102],90:[2,102],99:[2,102],101:[2,102],102:[2,102],103:[2,102],107:[2,102],115:[2,102],123:[2,102],125:[2,102],126:[2,102],129:[2,102],130:[2,102],131:[2,102],132:[2,102],133:[2,102],134:[2,102]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],83:[1,195],84:196,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{47:[1,198],52:[1,199]},{47:[2,54],52:[2,54]},{38:[1,201],47:[2,56],52:[2,56],55:[1,200]},{38:[2,59],47:[2,59],52:[2,59],55:[2,59]},{38:[2,60],47:[2,60],52:[2,60],55:[2,60]},{38:[2,61],47:[2,61],52:[2,61],55:[2,61]},{38:[2,62],47:[2,62],52:[2,62],55:[2,62]},{27:146,28:[1,71]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:142,85:[1,56],86:[1,57],87:[1,55],88:[1,141],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],47:[2,48],52:[2,48],55:[2,48],70:[2,48],75:[2,48],83:[2,48],88:[2,48],90:[2,48],99:[2,48],101:[2,48],102:[2,48],103:[2,48],107:[2,48],115:[2,48],123:[2,48],125:[2,48],126:[2,48],129:[2,48],130:[2,48],131:[2,48],132:[2,48],133:[2,48],134:[2,48]},{1:[2,179],6:[2,179],25:[2,179],26:[2,179],47:[2,179],52:[2,179],55:[2,179],70:[2,179],75:[2,179],83:[2,179],88:[2,179],90:[2,179],99:[2,179],100:85,101:[2,179],102:[2,179],103:[2,179],106:86,107:[2,179],108:67,115:[2,179],123:[2,179],125:[2,179],126:[2,179],129:[1,76],130:[2,179],131:[2,179],132:[2,179],133:[2,179],134:[2,179]},{100:88,101:[1,63],103:[1,64],106:89,107:[1,66],108:67,123:[1,87]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],47:[2,180],52:[2,180],55:[2,180],70:[2,180],75:[2,180],83:[2,180],88:[2,180],90:[2,180],99:[2,180],100:85,101:[2,180],102:[2,180],103:[2,180],106:86,107:[2,180],108:67,115:[2,180],123:[2,180],125:[2,180],126:[2,180],129:[1,76],130:[2,180],131:[2,180],132:[2,180],133:[2,180],134:[2,180]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],47:[2,181],52:[2,181],55:[2,181],70:[2,181],75:[2,181],83:[2,181],88:[2,181],90:[2,181],99:[2,181],100:85,101:[2,181],102:[2,181],103:[2,181],106:86,107:[2,181],108:67,115:[2,181],123:[2,181],125:[2,181],126:[2,181],129:[1,76],130:[2,181],131:[2,181],132:[2,181],133:[2,181],134:[2,181]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],47:[2,182],52:[2,182],55:[2,182],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,182],71:[2,68],75:[2,182],81:[2,68],82:[2,68],83:[2,182],88:[2,182],90:[2,182],99:[2,182],101:[2,182],102:[2,182],103:[2,182],107:[2,182],115:[2,182],123:[2,182],125:[2,182],126:[2,182],129:[2,182],130:[2,182],131:[2,182],132:[2,182],133:[2,182],134:[2,182]},{60:91,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],71:[1,98],78:90,81:[1,92],82:[2,103]},{60:100,64:[1,93],65:[1,94],66:[1,95],67:96,68:[1,97],71:[1,98],78:99,81:[1,92],82:[2,103]},{64:[2,71],65:[2,71],66:[2,71],68:[2,71],71:[2,71],81:[2,71],82:[2,71]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],47:[2,183],52:[2,183],55:[2,183],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,183],71:[2,68],75:[2,183],81:[2,68],82:[2,68],83:[2,183],88:[2,183],90:[2,183],99:[2,183],101:[2,183],102:[2,183],103:[2,183],107:[2,183],115:[2,183],123:[2,183],125:[2,183],126:[2,183],129:[2,183],130:[2,183],131:[2,183],132:[2,183],133:[2,183],134:[2,183]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],47:[2,184],52:[2,184],55:[2,184],70:[2,184],75:[2,184],83:[2,184],88:[2,184],90:[2,184],99:[2,184],101:[2,184],102:[2,184],103:[2,184],107:[2,184],115:[2,184],123:[2,184],125:[2,184],126:[2,184],129:[2,184],130:[2,184],131:[2,184],132:[2,184],133:[2,184],134:[2,184]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],47:[2,185],52:[2,185],55:[2,185],70:[2,185],75:[2,185],83:[2,185],88:[2,185],90:[2,185],99:[2,185],101:[2,185],102:[2,185],103:[2,185],107:[2,185],115:[2,185],123:[2,185],125:[2,185],126:[2,185],129:[2,185],130:[2,185],131:[2,185],132:[2,185],133:[2,185],134:[2,185]},{8:202,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,203],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:204,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{5:205,25:[1,5],122:[1,206]},{1:[2,128],6:[2,128],25:[2,128],26:[2,128],47:[2,128],52:[2,128],55:[2,128],70:[2,128],75:[2,128],83:[2,128],88:[2,128],90:[2,128],94:207,95:[1,208],96:[1,209],99:[2,128],101:[2,128],102:[2,128],103:[2,128],107:[2,128],115:[2,128],123:[2,128],125:[2,128],126:[2,128],129:[2,128],130:[2,128],131:[2,128],132:[2,128],133:[2,128],134:[2,128]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],47:[2,140],52:[2,140],55:[2,140],70:[2,140],75:[2,140],83:[2,140],88:[2,140],90:[2,140],99:[2,140],101:[2,140],102:[2,140],103:[2,140],107:[2,140],115:[2,140],123:[2,140],125:[2,140],126:[2,140],129:[2,140],130:[2,140],131:[2,140],132:[2,140],133:[2,140],134:[2,140]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],47:[2,148],52:[2,148],55:[2,148],70:[2,148],75:[2,148],83:[2,148],88:[2,148],90:[2,148],99:[2,148],101:[2,148],102:[2,148],103:[2,148],107:[2,148],115:[2,148],123:[2,148],125:[2,148],126:[2,148],129:[2,148],130:[2,148],131:[2,148],132:[2,148],133:[2,148],134:[2,148]},{25:[1,210],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{117:211,119:212,120:[1,213]},{1:[2,92],6:[2,92],25:[2,92],26:[2,92],47:[2,92],52:[2,92],55:[2,92],70:[2,92],75:[2,92],83:[2,92],88:[2,92],90:[2,92],99:[2,92],101:[2,92],102:[2,92],103:[2,92],107:[2,92],115:[2,92],123:[2,92],125:[2,92],126:[2,92],129:[2,92],130:[2,92],131:[2,92],132:[2,92],133:[2,92],134:[2,92]},{8:214,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,95],5:215,6:[2,95],25:[1,5],26:[2,95],47:[2,95],52:[2,95],55:[2,95],64:[2,68],65:[2,68],66:[2,68],68:[2,68],70:[2,95],71:[2,68],75:[2,95],77:[1,216],81:[2,68],82:[2,68],83:[2,95],88:[2,95],90:[2,95],99:[2,95],101:[2,95],102:[2,95],103:[2,95],107:[2,95],115:[2,95],123:[2,95],125:[2,95],126:[2,95],129:[2,95],130:[2,95],131:[2,95],132:[2,95],133:[2,95],134:[2,95]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],47:[2,133],52:[2,133],55:[2,133],70:[2,133],75:[2,133],83:[2,133],88:[2,133],90:[2,133],99:[2,133],100:85,101:[2,133],102:[2,133],103:[2,133],106:86,107:[2,133],108:67,115:[2,133],123:[2,133],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,44],6:[2,44],26:[2,44],99:[2,44],100:85,101:[2,44],103:[2,44],106:86,107:[2,44],108:67,123:[2,44],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,72],99:[1,217]},{4:218,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,124],25:[2,124],52:[2,124],55:[1,220],88:[2,124],89:219,90:[1,188],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],38:[2,110],47:[2,110],52:[2,110],55:[2,110],64:[2,110],65:[2,110],66:[2,110],68:[2,110],70:[2,110],71:[2,110],75:[2,110],81:[2,110],82:[2,110],83:[2,110],88:[2,110],90:[2,110],99:[2,110],101:[2,110],102:[2,110],103:[2,110],107:[2,110],113:[2,110],114:[2,110],115:[2,110],123:[2,110],125:[2,110],126:[2,110],129:[2,110],130:[2,110],131:[2,110],132:[2,110],133:[2,110],134:[2,110]},{6:[2,51],25:[2,51],51:221,52:[1,222],88:[2,51]},{6:[2,119],25:[2,119],26:[2,119],52:[2,119],83:[2,119],88:[2,119]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:223,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,125],25:[2,125],26:[2,125],52:[2,125],83:[2,125],88:[2,125]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],38:[2,109],41:[2,109],47:[2,109],52:[2,109],55:[2,109],64:[2,109],65:[2,109],66:[2,109],68:[2,109],70:[2,109],71:[2,109],75:[2,109],77:[2,109],81:[2,109],82:[2,109],83:[2,109],88:[2,109],90:[2,109],99:[2,109],101:[2,109],102:[2,109],103:[2,109],107:[2,109],115:[2,109],123:[2,109],125:[2,109],126:[2,109],127:[2,109],128:[2,109],129:[2,109],130:[2,109],131:[2,109],132:[2,109],133:[2,109],134:[2,109],135:[2,109]},{5:224,25:[1,5],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],47:[2,136],52:[2,136],55:[2,136],70:[2,136],75:[2,136],83:[2,136],88:[2,136],90:[2,136],99:[2,136],100:85,101:[1,63],102:[1,225],103:[1,64],106:86,107:[1,66],108:67,115:[2,136],123:[2,136],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],47:[2,138],52:[2,138],55:[2,138],70:[2,138],75:[2,138],83:[2,138],88:[2,138],90:[2,138],99:[2,138],100:85,101:[1,63],102:[1,226],103:[1,64],106:86,107:[1,66],108:67,115:[2,138],123:[2,138],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],47:[2,144],52:[2,144],55:[2,144],70:[2,144],75:[2,144],83:[2,144],88:[2,144],90:[2,144],99:[2,144],101:[2,144],102:[2,144],103:[2,144],107:[2,144],115:[2,144],123:[2,144],125:[2,144],126:[2,144],129:[2,144],130:[2,144],131:[2,144],132:[2,144],133:[2,144],134:[2,144]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],47:[2,145],52:[2,145],55:[2,145],70:[2,145],75:[2,145],83:[2,145],88:[2,145],90:[2,145],99:[2,145],100:85,101:[1,63],102:[2,145],103:[1,64],106:86,107:[1,66],108:67,115:[2,145],123:[2,145],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],47:[2,149],52:[2,149],55:[2,149],70:[2,149],75:[2,149],83:[2,149],88:[2,149],90:[2,149],99:[2,149],101:[2,149],102:[2,149],103:[2,149],107:[2,149],115:[2,149],123:[2,149],125:[2,149],126:[2,149],129:[2,149],130:[2,149],131:[2,149],132:[2,149],133:[2,149],134:[2,149]},{113:[2,151],114:[2,151]},{27:156,28:[1,71],56:157,57:158,73:[1,68],87:[1,112],110:227,112:155},{52:[1,228],113:[2,156],114:[2,156]},{52:[2,153],113:[2,153],114:[2,153]},{52:[2,154],113:[2,154],114:[2,154]},{52:[2,155],113:[2,155],114:[2,155]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],47:[2,150],52:[2,150],55:[2,150],70:[2,150],75:[2,150],83:[2,150],88:[2,150],90:[2,150],99:[2,150],101:[2,150],102:[2,150],103:[2,150],107:[2,150],115:[2,150],123:[2,150],125:[2,150],126:[2,150],129:[2,150],130:[2,150],131:[2,150],132:[2,150],133:[2,150],134:[2,150]},{8:229,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:230,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,51],25:[2,51],51:231,52:[1,232],75:[2,51]},{6:[2,87],25:[2,87],26:[2,87],52:[2,87],75:[2,87]},{6:[2,37],25:[2,37],26:[2,37],41:[1,233],52:[2,37],75:[2,37]},{6:[2,40],25:[2,40],26:[2,40],52:[2,40],75:[2,40]},{6:[2,41],25:[2,41],26:[2,41],41:[2,41],52:[2,41],75:[2,41]},{6:[2,42],25:[2,42],26:[2,42],41:[2,42],52:[2,42],75:[2,42]},{6:[2,43],25:[2,43],26:[2,43],41:[2,43],52:[2,43],75:[2,43]},{1:[2,5],6:[2,5],26:[2,5],99:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],47:[2,25],52:[2,25],55:[2,25],70:[2,25],75:[2,25],83:[2,25],88:[2,25],90:[2,25],95:[2,25],96:[2,25],99:[2,25],101:[2,25],102:[2,25],103:[2,25],107:[2,25],115:[2,25],118:[2,25],120:[2,25],123:[2,25],125:[2,25],126:[2,25],129:[2,25],130:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],47:[2,187],52:[2,187],55:[2,187],70:[2,187],75:[2,187],83:[2,187],88:[2,187],90:[2,187],99:[2,187],100:85,101:[2,187],102:[2,187],103:[2,187],106:86,107:[2,187],108:67,115:[2,187],123:[2,187],125:[2,187],126:[2,187],129:[1,76],130:[1,79],131:[2,187],132:[2,187],133:[2,187],134:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],47:[2,188],52:[2,188],55:[2,188],70:[2,188],75:[2,188],83:[2,188],88:[2,188],90:[2,188],99:[2,188],100:85,101:[2,188],102:[2,188],103:[2,188],106:86,107:[2,188],108:67,115:[2,188],123:[2,188],125:[2,188],126:[2,188],129:[1,76],130:[1,79],131:[2,188],132:[2,188],133:[2,188],134:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],47:[2,189],52:[2,189],55:[2,189],70:[2,189],75:[2,189],83:[2,189],88:[2,189],90:[2,189],99:[2,189],100:85,101:[2,189],102:[2,189],103:[2,189],106:86,107:[2,189],108:67,115:[2,189],123:[2,189],125:[2,189],126:[2,189],129:[1,76],130:[2,189],131:[2,189],132:[2,189],133:[2,189],134:[2,189]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],47:[2,190],52:[2,190],55:[2,190],70:[2,190],75:[2,190],83:[2,190],88:[2,190],90:[2,190],99:[2,190],100:85,101:[2,190],102:[2,190],103:[2,190],106:86,107:[2,190],108:67,115:[2,190],123:[2,190],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[2,190],132:[2,190],133:[2,190],134:[2,190]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],47:[2,191],52:[2,191],55:[2,191],70:[2,191],75:[2,191],83:[2,191],88:[2,191],90:[2,191],99:[2,191],100:85,101:[2,191],102:[2,191],103:[2,191],106:86,107:[2,191],108:67,115:[2,191],123:[2,191],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[2,191],133:[2,191],134:[1,83]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],47:[2,192],52:[2,192],55:[2,192],70:[2,192],75:[2,192],83:[2,192],88:[2,192],90:[2,192],99:[2,192],100:85,101:[2,192],102:[2,192],103:[2,192],106:86,107:[2,192],108:67,115:[2,192],123:[2,192],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[2,192],134:[1,83]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],47:[2,193],52:[2,193],55:[2,193],70:[2,193],75:[2,193],83:[2,193],88:[2,193],90:[2,193],99:[2,193],100:85,101:[2,193],102:[2,193],103:[2,193],106:86,107:[2,193],108:67,115:[2,193],123:[2,193],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[2,193],133:[2,193],134:[2,193]},{1:[2,178],6:[2,178],25:[2,178],26:[2,178],47:[2,178],52:[2,178],55:[2,178],70:[2,178],75:[2,178],83:[2,178],88:[2,178],90:[2,178],99:[2,178],100:85,101:[1,63],102:[2,178],103:[1,64],106:86,107:[1,66],108:67,115:[2,178],123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,177],6:[2,177],25:[2,177],26:[2,177],47:[2,177],52:[2,177],55:[2,177],70:[2,177],75:[2,177],83:[2,177],88:[2,177],90:[2,177],99:[2,177],100:85,101:[1,63],102:[2,177],103:[1,64],106:86,107:[1,66],108:67,115:[2,177],123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],47:[2,99],52:[2,99],55:[2,99],64:[2,99],65:[2,99],66:[2,99],68:[2,99],70:[2,99],71:[2,99],75:[2,99],81:[2,99],82:[2,99],83:[2,99],88:[2,99],90:[2,99],99:[2,99],101:[2,99],102:[2,99],103:[2,99],107:[2,99],115:[2,99],123:[2,99],125:[2,99],126:[2,99],129:[2,99],130:[2,99],131:[2,99],132:[2,99],133:[2,99],134:[2,99]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],38:[2,76],47:[2,76],52:[2,76],55:[2,76],64:[2,76],65:[2,76],66:[2,76],68:[2,76],70:[2,76],71:[2,76],75:[2,76],77:[2,76],81:[2,76],82:[2,76],83:[2,76],88:[2,76],90:[2,76],99:[2,76],101:[2,76],102:[2,76],103:[2,76],107:[2,76],115:[2,76],123:[2,76],125:[2,76],126:[2,76],127:[2,76],128:[2,76],129:[2,76],130:[2,76],131:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],38:[2,77],47:[2,77],52:[2,77],55:[2,77],64:[2,77],65:[2,77],66:[2,77],68:[2,77],70:[2,77],71:[2,77],75:[2,77],77:[2,77],81:[2,77],82:[2,77],83:[2,77],88:[2,77],90:[2,77],99:[2,77],101:[2,77],102:[2,77],103:[2,77],107:[2,77],115:[2,77],123:[2,77],125:[2,77],126:[2,77],127:[2,77],128:[2,77],129:[2,77],130:[2,77],131:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],38:[2,78],47:[2,78],52:[2,78],55:[2,78],64:[2,78],65:[2,78],66:[2,78],68:[2,78],70:[2,78],71:[2,78],75:[2,78],77:[2,78],81:[2,78],82:[2,78],83:[2,78],88:[2,78],90:[2,78],99:[2,78],101:[2,78],102:[2,78],103:[2,78],107:[2,78],115:[2,78],123:[2,78],125:[2,78],126:[2,78],127:[2,78],128:[2,78],129:[2,78],130:[2,78],131:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78]},{70:[1,234]},{55:[1,189],70:[2,83],89:235,90:[1,188],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{70:[2,84]},{8:236,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,70:[2,118],73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{12:[2,112],28:[2,112],30:[2,112],31:[2,112],33:[2,112],34:[2,112],35:[2,112],36:[2,112],43:[2,112],44:[2,112],45:[2,112],49:[2,112],50:[2,112],70:[2,112],73:[2,112],76:[2,112],80:[2,112],85:[2,112],86:[2,112],87:[2,112],93:[2,112],97:[2,112],98:[2,112],101:[2,112],103:[2,112],105:[2,112],107:[2,112],116:[2,112],122:[2,112],124:[2,112],125:[2,112],126:[2,112],127:[2,112],128:[2,112]},{12:[2,113],28:[2,113],30:[2,113],31:[2,113],33:[2,113],34:[2,113],35:[2,113],36:[2,113],43:[2,113],44:[2,113],45:[2,113],49:[2,113],50:[2,113],70:[2,113],73:[2,113],76:[2,113],80:[2,113],85:[2,113],86:[2,113],87:[2,113],93:[2,113],97:[2,113],98:[2,113],101:[2,113],103:[2,113],105:[2,113],107:[2,113],116:[2,113],122:[2,113],124:[2,113],125:[2,113],126:[2,113],127:[2,113],128:[2,113]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],38:[2,82],47:[2,82],52:[2,82],55:[2,82],64:[2,82],65:[2,82],66:[2,82],68:[2,82],70:[2,82],71:[2,82],75:[2,82],77:[2,82],81:[2,82],82:[2,82],83:[2,82],88:[2,82],90:[2,82],99:[2,82],101:[2,82],102:[2,82],103:[2,82],107:[2,82],115:[2,82],123:[2,82],125:[2,82],126:[2,82],127:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],47:[2,100],52:[2,100],55:[2,100],64:[2,100],65:[2,100],66:[2,100],68:[2,100],70:[2,100],71:[2,100],75:[2,100],81:[2,100],82:[2,100],83:[2,100],88:[2,100],90:[2,100],99:[2,100],101:[2,100],102:[2,100],103:[2,100],107:[2,100],115:[2,100],123:[2,100],125:[2,100],126:[2,100],129:[2,100],130:[2,100],131:[2,100],132:[2,100],133:[2,100],134:[2,100]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],47:[2,34],52:[2,34],55:[2,34],70:[2,34],75:[2,34],83:[2,34],88:[2,34],90:[2,34],99:[2,34],100:85,101:[2,34],102:[2,34],103:[2,34],106:86,107:[2,34],108:67,115:[2,34],123:[2,34],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:237,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:238,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],47:[2,105],52:[2,105],55:[2,105],64:[2,105],65:[2,105],66:[2,105],68:[2,105],70:[2,105],71:[2,105],75:[2,105],81:[2,105],82:[2,105],83:[2,105],88:[2,105],90:[2,105],99:[2,105],101:[2,105],102:[2,105],103:[2,105],107:[2,105],115:[2,105],123:[2,105],125:[2,105],126:[2,105],129:[2,105],130:[2,105],131:[2,105],132:[2,105],133:[2,105],134:[2,105]},{6:[2,51],25:[2,51],51:239,52:[1,222],83:[2,51]},{6:[2,124],25:[2,124],26:[2,124],52:[2,124],55:[1,240],83:[2,124],88:[2,124],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{48:241,49:[1,58],50:[1,59]},{27:107,28:[1,71],42:108,53:242,54:106,56:109,57:110,73:[1,68],86:[1,111],87:[1,112]},{47:[2,57],52:[2,57]},{8:243,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],47:[2,194],52:[2,194],55:[2,194],70:[2,194],75:[2,194],83:[2,194],88:[2,194],90:[2,194],99:[2,194],100:85,101:[2,194],102:[2,194],103:[2,194],106:86,107:[2,194],108:67,115:[2,194],123:[2,194],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:244,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],47:[2,196],52:[2,196],55:[2,196],70:[2,196],75:[2,196],83:[2,196],88:[2,196],90:[2,196],99:[2,196],100:85,101:[2,196],102:[2,196],103:[2,196],106:86,107:[2,196],108:67,115:[2,196],123:[2,196],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,176],6:[2,176],25:[2,176],26:[2,176],47:[2,176],52:[2,176],55:[2,176],70:[2,176],75:[2,176],83:[2,176],88:[2,176],90:[2,176],99:[2,176],101:[2,176],102:[2,176],103:[2,176],107:[2,176],115:[2,176],123:[2,176],125:[2,176],126:[2,176],129:[2,176],130:[2,176],131:[2,176],132:[2,176],133:[2,176],134:[2,176]},{8:245,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,129],6:[2,129],25:[2,129],26:[2,129],47:[2,129],52:[2,129],55:[2,129],70:[2,129],75:[2,129],83:[2,129],88:[2,129],90:[2,129],95:[1,246],99:[2,129],101:[2,129],102:[2,129],103:[2,129],107:[2,129],115:[2,129],123:[2,129],125:[2,129],126:[2,129],129:[2,129],130:[2,129],131:[2,129],132:[2,129],133:[2,129],134:[2,129]},{5:247,25:[1,5]},{27:248,28:[1,71]},{117:249,119:212,120:[1,213]},{26:[1,250],118:[1,251],119:252,120:[1,213]},{26:[2,169],118:[2,169],120:[2,169]},{8:254,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],92:253,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,93],5:255,6:[2,93],25:[1,5],26:[2,93],47:[2,93],52:[2,93],55:[2,93],70:[2,93],75:[2,93],83:[2,93],88:[2,93],90:[2,93],99:[2,93],100:85,101:[1,63],102:[2,93],103:[1,64],106:86,107:[1,66],108:67,115:[2,93],123:[2,93],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,96],6:[2,96],25:[2,96],26:[2,96],47:[2,96],52:[2,96],55:[2,96],70:[2,96],75:[2,96],83:[2,96],88:[2,96],90:[2,96],99:[2,96],101:[2,96],102:[2,96],103:[2,96],107:[2,96],115:[2,96],123:[2,96],125:[2,96],126:[2,96],129:[2,96],130:[2,96],131:[2,96],132:[2,96],133:[2,96],134:[2,96]},{8:256,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],47:[2,134],52:[2,134],55:[2,134],64:[2,134],65:[2,134],66:[2,134],68:[2,134],70:[2,134],71:[2,134],75:[2,134],81:[2,134],82:[2,134],83:[2,134],88:[2,134],90:[2,134],99:[2,134],101:[2,134],102:[2,134],103:[2,134],107:[2,134],115:[2,134],123:[2,134],125:[2,134],126:[2,134],129:[2,134],130:[2,134],131:[2,134],132:[2,134],133:[2,134],134:[2,134]},{6:[1,72],26:[1,257]},{8:258,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,63],12:[2,113],25:[2,63],28:[2,113],30:[2,113],31:[2,113],33:[2,113],34:[2,113],35:[2,113],36:[2,113],43:[2,113],44:[2,113],45:[2,113],49:[2,113],50:[2,113],52:[2,63],73:[2,113],76:[2,113],80:[2,113],85:[2,113],86:[2,113],87:[2,113],88:[2,63],93:[2,113],97:[2,113],98:[2,113],101:[2,113],103:[2,113],105:[2,113],107:[2,113],116:[2,113],122:[2,113],124:[2,113],125:[2,113],126:[2,113],127:[2,113],128:[2,113]},{6:[1,260],25:[1,261],88:[1,259]},{6:[2,52],8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,52],26:[2,52],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],83:[2,52],85:[1,56],86:[1,57],87:[1,55],88:[2,52],91:262,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,51],25:[2,51],26:[2,51],51:263,52:[1,222]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],47:[2,173],52:[2,173],55:[2,173],70:[2,173],75:[2,173],83:[2,173],88:[2,173],90:[2,173],99:[2,173],101:[2,173],102:[2,173],103:[2,173],107:[2,173],115:[2,173],118:[2,173],123:[2,173],125:[2,173],126:[2,173],129:[2,173],130:[2,173],131:[2,173],132:[2,173],133:[2,173],134:[2,173]},{8:264,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:265,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{113:[2,152],114:[2,152]},{27:156,28:[1,71],56:157,57:158,73:[1,68],87:[1,112],112:266},{1:[2,158],6:[2,158],25:[2,158],26:[2,158],47:[2,158],52:[2,158],55:[2,158],70:[2,158],75:[2,158],83:[2,158],88:[2,158],90:[2,158],99:[2,158],100:85,101:[2,158],102:[1,267],103:[2,158],106:86,107:[2,158],108:67,115:[1,268],123:[2,158],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,159],6:[2,159],25:[2,159],26:[2,159],47:[2,159],52:[2,159],55:[2,159],70:[2,159],75:[2,159],83:[2,159],88:[2,159],90:[2,159],99:[2,159],100:85,101:[2,159],102:[1,269],103:[2,159],106:86,107:[2,159],108:67,115:[2,159],123:[2,159],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,271],25:[1,272],75:[1,270]},{6:[2,52],11:165,25:[2,52],26:[2,52],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:273,40:164,42:168,44:[1,46],75:[2,52],86:[1,111]},{8:274,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,275],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],38:[2,81],47:[2,81],52:[2,81],55:[2,81],64:[2,81],65:[2,81],66:[2,81],68:[2,81],70:[2,81],71:[2,81],75:[2,81],77:[2,81],81:[2,81],82:[2,81],83:[2,81],88:[2,81],90:[2,81],99:[2,81],101:[2,81],102:[2,81],103:[2,81],107:[2,81],115:[2,81],123:[2,81],125:[2,81],126:[2,81],127:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81]},{8:276,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,70:[2,116],73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{70:[2,117],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],47:[2,35],52:[2,35],55:[2,35],70:[2,35],75:[2,35],83:[2,35],88:[2,35],90:[2,35],99:[2,35],100:85,101:[2,35],102:[2,35],103:[2,35],106:86,107:[2,35],108:67,115:[2,35],123:[2,35],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,277],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,260],25:[1,261],83:[1,278]},{6:[2,63],25:[2,63],26:[2,63],52:[2,63],83:[2,63],88:[2,63]},{5:279,25:[1,5]},{47:[2,55],52:[2,55]},{47:[2,58],52:[2,58],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,280],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{5:281,25:[1,5],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{5:282,25:[1,5]},{1:[2,130],6:[2,130],25:[2,130],26:[2,130],47:[2,130],52:[2,130],55:[2,130],70:[2,130],75:[2,130],83:[2,130],88:[2,130],90:[2,130],99:[2,130],101:[2,130],102:[2,130],103:[2,130],107:[2,130],115:[2,130],123:[2,130],125:[2,130],126:[2,130],129:[2,130],130:[2,130],131:[2,130],132:[2,130],133:[2,130],134:[2,130]},{5:283,25:[1,5]},{26:[1,284],118:[1,285],119:252,120:[1,213]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],47:[2,167],52:[2,167],55:[2,167],70:[2,167],75:[2,167],83:[2,167],88:[2,167],90:[2,167],99:[2,167],101:[2,167],102:[2,167],103:[2,167],107:[2,167],115:[2,167],123:[2,167],125:[2,167],126:[2,167],129:[2,167],130:[2,167],131:[2,167],132:[2,167],133:[2,167],134:[2,167]},{5:286,25:[1,5]},{26:[2,170],118:[2,170],120:[2,170]},{5:287,25:[1,5],52:[1,288]},{25:[2,126],52:[2,126],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,94],6:[2,94],25:[2,94],26:[2,94],47:[2,94],52:[2,94],55:[2,94],70:[2,94],75:[2,94],83:[2,94],88:[2,94],90:[2,94],99:[2,94],101:[2,94],102:[2,94],103:[2,94],107:[2,94],115:[2,94],123:[2,94],125:[2,94],126:[2,94],129:[2,94],130:[2,94],131:[2,94],132:[2,94],133:[2,94],134:[2,94]},{1:[2,97],5:289,6:[2,97],25:[1,5],26:[2,97],47:[2,97],52:[2,97],55:[2,97],70:[2,97],75:[2,97],83:[2,97],88:[2,97],90:[2,97],99:[2,97],100:85,101:[1,63],102:[2,97],103:[1,64],106:86,107:[1,66],108:67,115:[2,97],123:[2,97],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{99:[1,290]},{88:[1,291],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],38:[2,111],47:[2,111],52:[2,111],55:[2,111],64:[2,111],65:[2,111],66:[2,111],68:[2,111],70:[2,111],71:[2,111],75:[2,111],81:[2,111],82:[2,111],83:[2,111],88:[2,111],90:[2,111],99:[2,111],101:[2,111],102:[2,111],103:[2,111],107:[2,111],113:[2,111],114:[2,111],115:[2,111],123:[2,111],125:[2,111],126:[2,111],129:[2,111],130:[2,111],131:[2,111],132:[2,111],133:[2,111],134:[2,111]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],91:292,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:197,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,144],27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,58:145,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],84:293,85:[1,56],86:[1,57],87:[1,55],91:143,93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[2,120],25:[2,120],26:[2,120],52:[2,120],83:[2,120],88:[2,120]},{6:[1,260],25:[1,261],26:[1,294]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],47:[2,137],52:[2,137],55:[2,137],70:[2,137],75:[2,137],83:[2,137],88:[2,137],90:[2,137],99:[2,137],100:85,101:[1,63],102:[2,137],103:[1,64],106:86,107:[1,66],108:67,115:[2,137],123:[2,137],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],47:[2,139],52:[2,139],55:[2,139],70:[2,139],75:[2,139],83:[2,139],88:[2,139],90:[2,139],99:[2,139],100:85,101:[1,63],102:[2,139],103:[1,64],106:86,107:[1,66],108:67,115:[2,139],123:[2,139],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{113:[2,157],114:[2,157]},{8:295,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:296,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:297,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],38:[2,85],47:[2,85],52:[2,85],55:[2,85],64:[2,85],65:[2,85],66:[2,85],68:[2,85],70:[2,85],71:[2,85],75:[2,85],81:[2,85],82:[2,85],83:[2,85],88:[2,85],90:[2,85],99:[2,85],101:[2,85],102:[2,85],103:[2,85],107:[2,85],113:[2,85],114:[2,85],115:[2,85],123:[2,85],125:[2,85],126:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85]},{11:165,27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:298,40:164,42:168,44:[1,46],86:[1,111]},{6:[2,86],11:165,25:[2,86],26:[2,86],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],39:163,40:164,42:168,44:[1,46],52:[2,86],74:299,86:[1,111]},{6:[2,88],25:[2,88],26:[2,88],52:[2,88],75:[2,88]},{6:[2,38],25:[2,38],26:[2,38],52:[2,38],75:[2,38],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{8:300,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{70:[2,115],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],47:[2,36],52:[2,36],55:[2,36],70:[2,36],75:[2,36],83:[2,36],88:[2,36],90:[2,36],99:[2,36],101:[2,36],102:[2,36],103:[2,36],107:[2,36],115:[2,36],123:[2,36],125:[2,36],126:[2,36],129:[2,36],130:[2,36],131:[2,36],132:[2,36],133:[2,36],134:[2,36]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],47:[2,106],52:[2,106],55:[2,106],64:[2,106],65:[2,106],66:[2,106],68:[2,106],70:[2,106],71:[2,106],75:[2,106],81:[2,106],82:[2,106],83:[2,106],88:[2,106],90:[2,106],99:[2,106],101:[2,106],102:[2,106],103:[2,106],107:[2,106],115:[2,106],123:[2,106],125:[2,106],126:[2,106],129:[2,106],130:[2,106],131:[2,106],132:[2,106],133:[2,106],134:[2,106]},{1:[2,47],6:[2,47],25:[2,47],26:[2,47],47:[2,47],52:[2,47],55:[2,47],70:[2,47],75:[2,47],83:[2,47],88:[2,47],90:[2,47],99:[2,47],101:[2,47],102:[2,47],103:[2,47],107:[2,47],115:[2,47],123:[2,47],125:[2,47],126:[2,47],129:[2,47],130:[2,47],131:[2,47],132:[2,47],133:[2,47],134:[2,47]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],47:[2,195],52:[2,195],55:[2,195],70:[2,195],75:[2,195],83:[2,195],88:[2,195],90:[2,195],99:[2,195],101:[2,195],102:[2,195],103:[2,195],107:[2,195],115:[2,195],123:[2,195],125:[2,195],126:[2,195],129:[2,195],130:[2,195],131:[2,195],132:[2,195],133:[2,195],134:[2,195]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],47:[2,174],52:[2,174],55:[2,174],70:[2,174],75:[2,174],83:[2,174],88:[2,174],90:[2,174],99:[2,174],101:[2,174],102:[2,174],103:[2,174],107:[2,174],115:[2,174],118:[2,174],123:[2,174],125:[2,174],126:[2,174],129:[2,174],130:[2,174],131:[2,174],132:[2,174],133:[2,174],134:[2,174]},{1:[2,131],6:[2,131],25:[2,131],26:[2,131],47:[2,131],52:[2,131],55:[2,131],70:[2,131],75:[2,131],83:[2,131],88:[2,131],90:[2,131],99:[2,131],101:[2,131],102:[2,131],103:[2,131],107:[2,131],115:[2,131],123:[2,131],125:[2,131],126:[2,131],129:[2,131],130:[2,131],131:[2,131],132:[2,131],133:[2,131],134:[2,131]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],47:[2,132],52:[2,132],55:[2,132],70:[2,132],75:[2,132],83:[2,132],88:[2,132],90:[2,132],95:[2,132],99:[2,132],101:[2,132],102:[2,132],103:[2,132],107:[2,132],115:[2,132],123:[2,132],125:[2,132],126:[2,132],129:[2,132],130:[2,132],131:[2,132],132:[2,132],133:[2,132],134:[2,132]},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],47:[2,165],52:[2,165],55:[2,165],70:[2,165],75:[2,165],83:[2,165],88:[2,165],90:[2,165],99:[2,165],101:[2,165],102:[2,165],103:[2,165],107:[2,165],115:[2,165],123:[2,165],125:[2,165],126:[2,165],129:[2,165],130:[2,165],131:[2,165],132:[2,165],133:[2,165],134:[2,165]},{5:301,25:[1,5]},{26:[1,302]},{6:[1,303],26:[2,171],118:[2,171],120:[2,171]},{8:304,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],47:[2,98],52:[2,98],55:[2,98],70:[2,98],75:[2,98],83:[2,98],88:[2,98],90:[2,98],99:[2,98],101:[2,98],102:[2,98],103:[2,98],107:[2,98],115:[2,98],123:[2,98],125:[2,98],126:[2,98],129:[2,98],130:[2,98],131:[2,98],132:[2,98],133:[2,98],134:[2,98]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],47:[2,135],52:[2,135],55:[2,135],64:[2,135],65:[2,135],66:[2,135],68:[2,135],70:[2,135],71:[2,135],75:[2,135],81:[2,135],82:[2,135],83:[2,135],88:[2,135],90:[2,135],99:[2,135],101:[2,135],102:[2,135],103:[2,135],107:[2,135],115:[2,135],123:[2,135],125:[2,135],126:[2,135],129:[2,135],130:[2,135],131:[2,135],132:[2,135],133:[2,135],134:[2,135]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],47:[2,114],52:[2,114],55:[2,114],64:[2,114],65:[2,114],66:[2,114],68:[2,114],70:[2,114],71:[2,114],75:[2,114],81:[2,114],82:[2,114],83:[2,114],88:[2,114],90:[2,114],99:[2,114],101:[2,114],102:[2,114],103:[2,114],107:[2,114],115:[2,114],123:[2,114],125:[2,114],126:[2,114],129:[2,114],130:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114]},{6:[2,121],25:[2,121],26:[2,121],52:[2,121],83:[2,121],88:[2,121]},{6:[2,51],25:[2,51],26:[2,51],51:305,52:[1,222]},{6:[2,122],25:[2,122],26:[2,122],52:[2,122],83:[2,122],88:[2,122]},{1:[2,160],6:[2,160],25:[2,160],26:[2,160],47:[2,160],52:[2,160],55:[2,160],70:[2,160],75:[2,160],83:[2,160],88:[2,160],90:[2,160],99:[2,160],100:85,101:[2,160],102:[2,160],103:[2,160],106:86,107:[2,160],108:67,115:[1,306],123:[2,160],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,162],6:[2,162],25:[2,162],26:[2,162],47:[2,162],52:[2,162],55:[2,162],70:[2,162],75:[2,162],83:[2,162],88:[2,162],90:[2,162],99:[2,162],100:85,101:[2,162],102:[1,307],103:[2,162],106:86,107:[2,162],108:67,115:[2,162],123:[2,162],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,161],6:[2,161],25:[2,161],26:[2,161],47:[2,161],52:[2,161],55:[2,161],70:[2,161],75:[2,161],83:[2,161],88:[2,161],90:[2,161],99:[2,161],100:85,101:[2,161],102:[2,161],103:[2,161],106:86,107:[2,161],108:67,115:[2,161],123:[2,161],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[2,89],25:[2,89],26:[2,89],52:[2,89],75:[2,89]},{6:[2,51],25:[2,51],26:[2,51],51:308,52:[1,232]},{26:[1,309],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{26:[1,310]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],47:[2,168],52:[2,168],55:[2,168],70:[2,168],75:[2,168],83:[2,168],88:[2,168],90:[2,168],99:[2,168],101:[2,168],102:[2,168],103:[2,168],107:[2,168],115:[2,168],123:[2,168],125:[2,168],126:[2,168],129:[2,168],130:[2,168],131:[2,168],132:[2,168],133:[2,168],134:[2,168]},{26:[2,172],118:[2,172],120:[2,172]},{25:[2,127],52:[2,127],100:85,101:[1,63],103:[1,64],106:86,107:[1,66],108:67,123:[1,84],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[1,260],25:[1,261],26:[1,311]},{8:312,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{8:313,9:115,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:60,28:[1,71],29:49,30:[1,69],31:[1,70],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:23,42:61,43:[1,45],44:[1,46],45:[1,29],48:30,49:[1,58],50:[1,59],56:47,57:48,59:36,61:25,62:26,63:27,73:[1,68],76:[1,43],80:[1,28],85:[1,56],86:[1,57],87:[1,55],93:[1,38],97:[1,44],98:[1,54],100:39,101:[1,63],103:[1,64],104:40,105:[1,65],106:41,107:[1,66],108:67,116:[1,42],121:37,122:[1,62],124:[1,31],125:[1,32],126:[1,33],127:[1,34],128:[1,35]},{6:[1,271],25:[1,272],26:[1,314]},{6:[2,39],25:[2,39],26:[2,39],52:[2,39],75:[2,39]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],47:[2,166],52:[2,166],55:[2,166],70:[2,166],75:[2,166],83:[2,166],88:[2,166],90:[2,166],99:[2,166],101:[2,166],102:[2,166],103:[2,166],107:[2,166],115:[2,166],123:[2,166],125:[2,166],126:[2,166],129:[2,166],130:[2,166],131:[2,166],132:[2,166],133:[2,166],134:[2,166]},{6:[2,123],25:[2,123],26:[2,123],52:[2,123],83:[2,123],88:[2,123]},{1:[2,163],6:[2,163],25:[2,163],26:[2,163],47:[2,163],52:[2,163],55:[2,163],70:[2,163],75:[2,163],83:[2,163],88:[2,163],90:[2,163],99:[2,163],100:85,101:[2,163],102:[2,163],103:[2,163],106:86,107:[2,163],108:67,115:[2,163],123:[2,163],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{1:[2,164],6:[2,164],25:[2,164],26:[2,164],47:[2,164],52:[2,164],55:[2,164],70:[2,164],75:[2,164],83:[2,164],88:[2,164],90:[2,164],99:[2,164],100:85,101:[2,164],102:[2,164],103:[2,164],106:86,107:[2,164],108:67,115:[2,164],123:[2,164],125:[1,78],126:[1,77],129:[1,76],130:[1,79],131:[1,80],132:[1,81],133:[1,82],134:[1,83]},{6:[2,90],25:[2,90],26:[2,90],52:[2,90],75:[2,90]}], -defaultActions: {58:[2,49],59:[2,50],73:[2,3],92:[2,104],186:[2,84]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - if (typeof this.lexer.yylloc == "undefined") - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - if (typeof this.yy.parseError === "function") - this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - 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; - 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] + "'"); - } - var errStr = ""; - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + this.terminals_[symbol] + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -} -}; -return parser; -})(); -if (typeof require !== 'undefined' && typeof exports !== '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); -} -}}, "coffee-script/repl": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var ACCESSOR, CoffeeScript, Module, REPL_PROMPT, REPL_PROMPT_CONTINUATION, REPL_PROMPT_MULTILINE, SIMPLEVAR, Script, autocomplete, backlog, completeAttribute, completeVariable, enableColours, error, getCompletions, inspect, multilineMode, pipedInput, readline, repl, run, stdin, stdout; - - stdin = process.openStdin(); - - stdout = process.stdout; - - CoffeeScript = require('./coffee-script'); - - readline = require('readline'); - - inspect = require('util').inspect; - - Script = require('vm').Script; - - Module = require('module'); - - REPL_PROMPT = 'coffee> '; - - REPL_PROMPT_MULTILINE = '------> '; - - REPL_PROMPT_CONTINUATION = '......> '; - - enableColours = false; - - if (process.platform !== 'win32') { - enableColours = !process.env.NODE_DISABLE_COLORS; - } - - error = function(err) { - return stdout.write((err.stack || err.toString()) + '\n'); - }; - - ACCESSOR = /\s*([\w\.]+)(?:\.(\w*))$/; - - SIMPLEVAR = /(\w+)$/i; - - autocomplete = function(text) { - return completeAttribute(text) || completeVariable(text) || [[], text]; - }; - - completeAttribute = function(text) { - var all, completions, match, obj, prefix, val; - if (match = text.match(ACCESSOR)) { - all = match[0], obj = match[1], prefix = match[2]; - try { - val = Script.runInThisContext(obj); - } catch (error) { - return; - } - completions = getCompletions(prefix, Object.getOwnPropertyNames(Object(val))); - return [completions, prefix]; - } - }; - - completeVariable = function(text) { - var completions, free, keywords, possibilities, r, vars, _ref; - free = (_ref = text.match(SIMPLEVAR)) != null ? _ref[1] : void 0; - if (text === "") { - free = ""; - } - if (free != null) { - vars = Script.runInThisContext('Object.getOwnPropertyNames(Object(this))'); - keywords = (function() { - var _i, _len, _ref1, _results; - _ref1 = CoffeeScript.RESERVED; - _results = []; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - r = _ref1[_i]; - if (r.slice(0, 2) !== '__') { - _results.push(r); - } - } - return _results; - })(); - possibilities = vars.concat(keywords); - completions = getCompletions(free, possibilities); - return [completions, free]; - } - }; - - getCompletions = function(prefix, candidates) { - var el, _i, _len, _results; - _results = []; - for (_i = 0, _len = candidates.length; _i < _len; _i++) { - el = candidates[_i]; - if (el.indexOf(prefix) === 0) { - _results.push(el); - } - } - return _results; - }; - - process.on('uncaughtException', error); - - backlog = ''; - - run = function(buffer) { - var code, returnValue, _; - buffer = buffer.replace(/[\r\n]+$/, ""); - if (multilineMode) { - backlog += "" + buffer + "\n"; - repl.setPrompt(REPL_PROMPT_CONTINUATION); - repl.prompt(); - return; - } - if (!buffer.toString().trim() && !backlog) { - repl.prompt(); - return; - } - code = backlog += buffer; - if (code[code.length - 1] === '\\') { - backlog = "" + backlog.slice(0, -1) + "\n"; - repl.setPrompt(REPL_PROMPT_CONTINUATION); - repl.prompt(); - return; - } - repl.setPrompt(REPL_PROMPT); - backlog = ''; - try { - _ = global._; - returnValue = CoffeeScript["eval"]("_=(undefined\n;" + code + "\n)", { - filename: 'repl', - modulename: 'repl' - }); - if (returnValue === void 0) { - global._ = _; - } - repl.output.write("" + (inspect(returnValue, false, 2, enableColours)) + "\n"); - } catch (err) { - error(err); - } - return repl.prompt(); - }; - - if (stdin.readable) { - pipedInput = ''; - repl = { - prompt: function() { - return stdout.write(this._prompt); - }, - setPrompt: function(p) { - return this._prompt = p; - }, - input: stdin, - output: stdout, - on: function() {} - }; - stdin.on('data', function(chunk) { - return pipedInput += chunk; - }); - stdin.on('end', function() { - var line, _i, _len, _ref; - _ref = pipedInput.trim().split("\n"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - line = _ref[_i]; - stdout.write("" + line + "\n"); - run(line); - } - stdout.write('\n'); - return process.exit(0); - }); - } else { - if (readline.createInterface.length < 3) { - repl = readline.createInterface(stdin, autocomplete); - stdin.on('data', function(buffer) { - return repl.write(buffer); - }); - } else { - repl = readline.createInterface(stdin, stdout, autocomplete); - } - } - - multilineMode = false; - - repl.input.on('keypress', function(char, key) { - var cursorPos, newPrompt; - if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) { - return; - } - cursorPos = repl.cursor; - repl.output.cursorTo(0); - repl.output.clearLine(1); - multilineMode = !multilineMode; - if (!multilineMode && backlog) { - repl._line(); - } - backlog = ''; - repl.setPrompt((newPrompt = multilineMode ? REPL_PROMPT_MULTILINE : REPL_PROMPT)); - repl.prompt(); - return repl.output.cursorTo(newPrompt.length + (repl.cursor = cursorPos)); - }); - - repl.input.on('keypress', function(char, key) { - if (!(multilineMode && repl.line)) { - return; - } - if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'd')) { - return; - } - multilineMode = false; - return repl._line(); - }); - - repl.on('attemptClose', function() { - if (multilineMode) { - multilineMode = false; - repl.output.cursorTo(0); - repl.output.clearLine(1); - repl._onLine(repl.line); - return; - } - if (backlog) { - backlog = ''; - repl.output.write('\n'); - repl.setPrompt(REPL_PROMPT); - return repl.prompt(); - } else { - return repl.close(); - } - }); - - repl.on('close', function() { - repl.output.write('\n'); - return repl.input.destroy(); - }); - - repl.on('line', run); - - repl.setPrompt(REPL_PROMPT); - - repl.prompt(); - -}).call(this); -}, "coffee-script/rewriter": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(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, left, rite, _i, _len, _ref, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - __slice = [].slice; - - exports.Rewriter = (function() { - - Rewriter.name = 'Rewriter'; - - function Rewriter() {} - - Rewriter.prototype.rewrite = function(tokens) { - this.tokens = tokens; - this.removeLeadingNewlines(); - this.removeMidExpressionNewlines(); - this.closeOpenCalls(); - this.closeOpenIndexes(); - this.addImplicitIndentation(); - this.tagPostfixConditionals(); - this.addImplicitBraces(); - this.addImplicitParentheses(); - return this.tokens; - }; - - 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; - }; - - Rewriter.prototype.detectEnd = function(i, condition, action) { - var levels, token, tokens, _ref, _ref1; - 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 (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) { - levels += 1; - } else if (_ref1 = token[0], __indexOf.call(EXPRESSION_END, _ref1) >= 0) { - levels -= 1; - } - i += 1; - } - return i - 1; - }; - - Rewriter.prototype.removeLeadingNewlines = function() { - var i, tag, _i, _len, _ref; - _ref = this.tokens; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - tag = _ref[i][0]; - if (tag !== 'TERMINATOR') { - break; - } - } - if (i) { - return this.tokens.splice(0, i); - } - }; - - Rewriter.prototype.removeMidExpressionNewlines = function() { - return this.scanTokens(function(token, i, tokens) { - var _ref; - if (!(token[0] === 'TERMINATOR' && (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0))) { - return 1; - } - tokens.splice(i, 1); - return 0; - }); - }; - - 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; - }); - }; - - 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; - }); - }; - - Rewriter.prototype.addImplicitBraces = function() { - var action, condition, sameLine, stack, start, startIndent, startsLine; - stack = []; - start = null; - startsLine = null; - sameLine = true; - startIndent = 0; - condition = function(token, i) { - var one, tag, three, two, _ref, _ref1; - _ref = this.tokens.slice(i + 1, (i + 3) + 1 || 9e9), one = _ref[0], two = _ref[1], three = _ref[2]; - if ('HERECOMMENT' === (one != null ? one[0] : void 0)) { - return false; - } - tag = token[0]; - if (__indexOf.call(LINEBREAKS, tag) >= 0) { - sameLine = false; - } - return (((tag === 'TERMINATOR' || tag === 'OUTDENT') || (__indexOf.call(IMPLICIT_END, tag) >= 0 && sameLine)) && ((!startsLine && this.tag(i - 1) !== ',') || !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':'))) || (tag === ',' && one && ((_ref1 = one[0]) !== 'IDENTIFIER' && _ref1 !== 'NUMBER' && _ref1 !== 'STRING' && _ref1 !== '@' && _ref1 !== 'TERMINATOR' && _ref1 !== 'OUTDENT')); - }; - action = function(token, i) { - var tok; - tok = this.generate('}', '}', token[2]); - return this.tokens.splice(i, 0, tok); - }; - return this.scanTokens(function(token, i, tokens) { - var ago, idx, prevTag, tag, tok, value, _ref, _ref1; - if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) { - stack.push([(tag === 'INDENT' && this.tag(i - 1) === '{' ? '{' : tag), i]); - return 1; - } - if (__indexOf.call(EXPRESSION_END, tag) >= 0) { - start = stack.pop(); - return 1; - } - if (!(tag === ':' && ((ago = this.tag(i - 2)) === ':' || ((_ref1 = stack[stack.length - 1]) != null ? _ref1[0] : void 0) !== '{'))) { - return 1; - } - sameLine = true; - stack.push(['{']); - idx = ago === '@' ? i - 2 : i - 1; - while (this.tag(idx - 2) === 'HERECOMMENT') { - idx -= 2; - } - prevTag = this.tag(idx - 1); - startsLine = !prevTag || (__indexOf.call(LINEBREAKS, prevTag) >= 0); - value = new String('{'); - value.generated = true; - tok = this.generate('{', value, token[2]); - tokens.splice(idx, 0, tok); - this.detectEnd(i + 2, condition, action); - return 2; - }); - }; - - Rewriter.prototype.addImplicitParentheses = function() { - var action, condition, noCall, seenControl, seenSingle; - noCall = seenSingle = seenControl = false; - condition = function(token, i) { - var post, tag, _ref, _ref1; - tag = token[0]; - if (!seenSingle && token.fromThen) { - return true; - } - if (tag === 'IF' || tag === 'ELSE' || tag === 'CATCH' || tag === '->' || tag === '=>' || tag === 'CLASS') { - seenSingle = true; - } - if (tag === 'IF' || tag === 'ELSE' || tag === 'SWITCH' || tag === 'TRY' || tag === '=') { - seenControl = true; - } - if ((tag === '.' || tag === '?.' || tag === '::') && this.tag(i - 1) === 'OUTDENT') { - return true; - } - return !token.generated && this.tag(i - 1) !== ',' && (__indexOf.call(IMPLICIT_END, tag) >= 0 || (tag === 'INDENT' && !seenControl)) && (tag !== 'INDENT' || (((_ref = this.tag(i - 2)) !== 'CLASS' && _ref !== 'EXTENDS') && (_ref1 = this.tag(i - 1), __indexOf.call(IMPLICIT_BLOCK, _ref1) < 0) && !((post = this.tokens[i + 1]) && post.generated && post[0] === '{'))); - }; - action = function(token, i) { - return this.tokens.splice(i, 0, this.generate('CALL_END', ')', token[2])); - }; - return this.scanTokens(function(token, i, tokens) { - var callObject, current, next, prev, tag, _ref, _ref1, _ref2; - tag = token[0]; - if (tag === 'CLASS' || tag === 'IF' || tag === 'FOR' || tag === 'WHILE') { - noCall = true; - } - _ref = tokens.slice(i - 1, (i + 1) + 1 || 9e9), prev = _ref[0], current = _ref[1], next = _ref[2]; - callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref1 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref1) >= 0); - seenSingle = false; - seenControl = false; - if (__indexOf.call(LINEBREAKS, tag) >= 0) { - noCall = false; - } - if (prev && !prev.spaced && tag === '?') { - token.call = true; - } - if (token.fromThen) { - return 1; - } - if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) { - return 1; - } - tokens.splice(i, 0, this.generate('CALL_START', '(', token[2])); - this.detectEnd(i + 1, condition, action); - if (prev[0] === '?') { - prev[0] = 'FUNC_EXIST'; - } - return 2; - }); - }; - - Rewriter.prototype.addImplicitIndentation = function() { - var action, condition, indent, outdent, starter; - starter = indent = outdent = null; - condition = function(token, i) { - var _ref; - return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 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); - }; - return this.scanTokens(function(token, i, tokens) { - var tag, _ref, _ref1; - tag = token[0]; - if (tag === 'TERMINATOR' && this.tag(i + 1) === 'THEN') { - tokens.splice(i, 1); - return 0; - } - if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') { - tokens.splice.apply(tokens, [i, 0].concat(__slice.call(this.indentation(token)))); - return 2; - } - if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) { - tokens.splice.apply(tokens, [i + 2, 0].concat(__slice.call(this.indentation(token)))); - return 4; - } - if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) { - starter = tag; - _ref1 = this.indentation(token, true), indent = _ref1[0], outdent = _ref1[1]; - if (starter === 'THEN') { - indent.fromThen = true; - } - tokens.splice(i + 1, 0, indent); - this.detectEnd(i + 2, condition, action); - if (tag === 'THEN') { - tokens.splice(i, 1); - } - return 1; - } - return 1; - }); - }; - - Rewriter.prototype.tagPostfixConditionals = function() { - var action, condition, original; - original = null; - condition = function(token, i) { - var _ref; - return (_ref = token[0]) === 'TERMINATOR' || _ref === 'INDENT'; - }; - action = function(token, i) { - if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) { - return original[0] = 'POST_' + original[0]; - } - }; - return this.scanTokens(function(token, i) { - if (token[0] !== 'IF') { - return 1; - } - original = token; - this.detectEnd(i + 1, condition, action); - return 1; - }); - }; - - Rewriter.prototype.indentation = function(token, implicit) { - var indent, outdent; - if (implicit == null) { - implicit = false; - } - indent = ['INDENT', 2, token[2]]; - outdent = ['OUTDENT', 2, token[2]]; - if (implicit) { - indent.generated = outdent.generated = true; - } - return [indent, outdent]; - }; - - Rewriter.prototype.generate = function(tag, value, line) { - var tok; - tok = [tag, value, line]; - tok.generated = true; - return tok; - }; - - Rewriter.prototype.tag = function(i) { - var _ref; - return (_ref = this.tokens[i]) != null ? _ref[0] : void 0; - }; - - return Rewriter; - - })(); - - BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']]; - - exports.INVERSES = 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', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'UNARY', 'SUPER', '@', '->', '=>', '[', '(', '{', '--', '++']; - - IMPLICIT_UNSPACED_CALL = ['+', '-']; - - IMPLICIT_BLOCK = ['->', '=>', '{', '[', ',']; - - IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR']; - - SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']; - - SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']; - - LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT']; - -}).call(this); -}, "coffee-script/scope": function(exports, require, module) {// Generated by CoffeeScript 1.3.1 -(function() { - var Scope, extend, last, _ref; - - _ref = require('./helpers'), extend = _ref.extend, last = _ref.last; - - exports.Scope = Scope = (function() { - - Scope.name = 'Scope'; - - Scope.root = null; - - function Scope(parent, expressions, method) { - this.parent = parent; - this.expressions = expressions; - this.method = method; - this.variables = [ - { - name: 'arguments', - type: 'arguments' - } - ]; - this.positions = {}; - if (!this.parent) { - Scope.root = this; - } - } - - Scope.prototype.add = function(name, type, immediate) { - if (this.shared && !immediate) { - return this.parent.add(name, type, immediate); - } - if (Object.prototype.hasOwnProperty.call(this.positions, name)) { - return this.variables[this.positions[name]].type = type; - } else { - return this.positions[name] = this.variables.push({ - name: name, - type: type - }) - 1; - } - }; - - Scope.prototype.find = function(name, options) { - if (this.check(name, options)) { - return true; - } - this.add(name, 'var'); - return false; - }; - - Scope.prototype.parameter = function(name) { - if (this.shared && this.parent.check(name, true)) { - return; - } - return this.add(name, 'param'); - }; - - Scope.prototype.check = function(name, immediate) { - var found, _ref1; - found = !!this.type(name); - if (found || immediate) { - return found; - } - return !!((_ref1 = this.parent) != null ? _ref1.check(name) : void 0); - }; - - Scope.prototype.temporary = function(name, index) { - if (name.length > 1) { - return '_' + name + (index > 1 ? index - 1 : ''); - } else { - return '_' + (index + parseInt(name, 36)).toString(36).replace(/\d/g, 'a'); - } - }; - - Scope.prototype.type = function(name) { - var v, _i, _len, _ref1; - _ref1 = this.variables; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - v = _ref1[_i]; - if (v.name === name) { - return v.type; - } - } - return null; - }; - - Scope.prototype.freeVariable = function(name, reserve) { - var index, temp; - if (reserve == null) { - reserve = true; - } - index = 0; - while (this.check((temp = this.temporary(name, index)))) { - index++; - } - if (reserve) { - this.add(temp, 'var', true); - } - return temp; - }; - - Scope.prototype.assign = function(name, value) { - this.add(name, { - value: value, - assigned: true - }, true); - return this.hasAssignments = true; - }; - - Scope.prototype.hasDeclarations = function() { - return !!this.declaredVariables().length; - }; - - Scope.prototype.declaredVariables = function() { - var realVars, tempVars, v, _i, _len, _ref1; - realVars = []; - tempVars = []; - _ref1 = this.variables; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - v = _ref1[_i]; - if (v.type === 'var') { - (v.name.charAt(0) === '_' ? tempVars : realVars).push(v.name); - } - } - return realVars.sort().concat(tempVars.sort()); - }; - - Scope.prototype.assignedVariables = function() { - var v, _i, _len, _ref1, _results; - _ref1 = this.variables; - _results = []; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - v = _ref1[_i]; - if (v.type.assigned) { - _results.push("" + v.name + " = " + v.type.value); - } - } - return _results; - }; - - return Scope; - - })(); - -}).call(this); -}, "command_line": function(exports, require, module) {// Generated by CoffeeScript 1.3.3 -(function() { - var engine, fs, getVersionNumber, printUsage, view; - - fs = require("fs"); - - engine = require('../lib/engine').engine; - - view = require('../lib/view').view; - - printUsage = function() { - console.log(" Usage: toffee [-c] input.toffee\n\n -c == output to CoffeeScript (instead of JS)\n\n TODO: make a more useful command line tool."); - return process.exit(1); - }; - - getVersionNumber = function() { - return JSON.parse(fs.readFileSync("" + __dirname + "/../package.json", "utf8")).version; - }; - - exports.run = function() { - var args, coffee, e, fname, source, v; - e = new engine(); - args = process.argv.slice(2); - if (args.length === 2) { - coffee = true; - if (args[0] !== "-c") { - printUsage(); - } - } else if (args.length !== 1) { - printUsage(); - } - fname = args.slice(-1)[0]; - source = fs.readFileSync(fname, "utf8"); - v = new view(source, { - fileName: fname - }); - if (coffee) { - return console.log(v._toCoffee()); - } else { - return console.log(v._toJavaScript()); - } - }; - -}).call(this); -}, "consts": function(exports, require, module) {// Generated by CoffeeScript 1.3.3 -(function() { - - exports.states = { - TOFFEE: 1, - COFFEE: 2 - }; - - exports.TAB_SPACES = 2; - -}).call(this); -}, "engine": function(exports, require, module) {// Generated by CoffeeScript 1.3.3 -(function() { - var engine, fs, path, states, util, utils, view, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; - - view = require('./view').view; - - states = require('./consts').states; - - utils = require('./utils'); - - fs = require('fs'); - - path = require('path'); - - util = require('util'); - - engine = (function() { - - function engine(options) { - this._fn_partial = __bind(this._fn_partial, this); - - this._fn_snippet = __bind(this._fn_snippet, this); - - this._inlineInclude = __bind(this._inlineInclude, this); - - this.run = __bind(this.run, this); - options = options || {}; - this.verbose = options.verbose || false; - this.prettyPrintErrors = options.prettyPrintErrors != null ? options.prettyPrintErrors : true; - this.viewCache = {}; - } - - engine.prototype._log = function(o) { - var _ref; - if (this.verbose) { - if ((_ref = typeof o) === "string" || _ref === "number" || _ref === "boolean") { - return console.log("toffee: " + o); - } else { - return console.log("toffee: " + (util.inspect(o))); - } - } - }; - - engine.prototype.run = function(filename, options, cb) { - /* - "options" contains the pub vars and may contain special items: - layout: path to a template expecting a body var (express 2.x style, but for use with express 3.x) - __toffee.dir: path to look relative to - __toffee.parent: parent file - __toffee.noInheritance: if true, don't pass variables through unless explicitly passed - __toffee.autoEscape: if set as false, don't escape output of #{} vars by default - */ - - var err, res, _ref, _ref1, _ref2, _ref3; - _ref = this.runSync(filename, options), err = _ref[0], res = _ref[1]; - if (err && this.prettyPrintErrors) { - _ref1 = [null, err], err = _ref1[0], res = _ref1[1]; - } - if ((!err) && (options != null ? options.layout : void 0)) { - options.body = res; - _ref2 = this.runSync(options.layout, options), err = _ref2[0], res = _ref2[1]; - if (err && this.prettyPrintErrors) { - _ref3 = [null, err], err = _ref3[0], res = _ref3[1]; - } - } - return cb(err, res); - }; - - engine.prototype.runSync = function(filename, options) { - /* - "options" the same as run() above - */ - - var err, pwd, realpath, res, start_time, v, _ref, _ref1, - _this = this; - start_time = Date.now(); - options = options || {}; - options.__toffee = options.__toffee || {}; - options.__toffee.dir = options.__toffee.dir || process.cwd(); - filename = filename[0] !== "/" ? "" + options.__toffee.dir + "/" + filename : filename; - realpath = path.normalize(filename); - pwd = path.dirname(realpath); - v = this.viewCache[realpath] || this._loadCacheAndMonitor(realpath, options); - if (v) { - options.__toffee.parent = realpath; - options.partial = options.partial || function(fname, lvars) { - return _this._fn_partial(fname, lvars, realpath, options); - }; - options.snippet = options.snippet || function(fname, lvars) { - return _this._fn_snippet(fname, lvars, realpath, options); - }; - options.print = options.print || function(txt) { - return _this._fn_print(txt, options); - }; - if (!(options.console != null)) { - options.console = { - log: console.log - }; - } - _ref = v.run(options), err = _ref[0], res = _ref[1]; - } else { - _ref1 = ["Couldn't load " + realpath, null], err = _ref1[0], res = _ref1[1]; - } - this._log("" + realpath + " run in " + (Date.now() - start_time) + "ms"); - return [err, res]; - }; - - engine.prototype._inlineInclude = function(filename, local_vars, parent_realpath, parent_options) { - var err, k, options, res, v, _ref; - options = local_vars || {}; - options.__toffee = options.__toffee || {}; - options.__toffee.dir = path.dirname(parent_realpath); - options.__toffee.parent = parent_realpath; - if (!options.__toffee.noInheritance) { - for (k in parent_options) { - v = parent_options[k]; - if (!((local_vars != null ? local_vars[k] : void 0) != null)) { - if (!(k === "print" || k === "partial" || k === "snippet" || k === "layout" || k === "__toffee")) { - options[k] = v; - } - } - } - } - _ref = this.runSync(filename, options), err = _ref[0], res = _ref[1]; - return err || res; - }; - - engine.prototype._fn_snippet = function(fname, lvars, realpath, options) { - lvars = lvars != null ? lvars : {}; - lvars.__toffee = lvars.__toffee || {}; - lvars.__toffee.noInheritance = true; - return this._inlineInclude(fname, lvars, realpath, options); - }; - - engine.prototype._fn_partial = function(fname, lvars, realpath, options) { - return this._inlineInclude(fname, lvars, realpath, options); - }; - - engine.prototype._fn_print = function(txt, options) { - if (options.__toffee.state === states.COFFEE) { - options.__toffee.out.push(txt); - return ''; - } else { - return txt; - } - }; - - engine.prototype._loadCacheAndMonitor = function(filename, options) { - var txt, v, view_options, _ref; - try { - txt = fs.readFileSync(filename, 'utf8'); - } catch (e) { - txt = "Error: Could not read " + filename; - if (((_ref = options.__toffee) != null ? _ref.parent : void 0) != null) { - txt += " requested in " + options.__toffee.parent; - } - } - view_options = { - fileName: filename, - verbose: this.verbose, - prettyPrintErrors: this.prettyPrintErrors - }; - v = new view(txt, view_options); - this.viewCache[filename] = v; - this._monitorForChanges(filename, options); - return v; - }; - - engine.prototype._monitorForChanges = function(filename, options) { - /* - we must continuously unwatch/rewatch because some editors/systems invoke a "rename" - event and we'll end up following the wrong, old 'file' as a new one - is dropped in its place. - */ - - var fsw, - _this = this; - fsw = null; - return fsw = fs.watch(filename, { - persistent: true - }, function(change) { - fsw.close(); - _this._log("Got an fs.watch hit on " + filename); - return fs.readFile(filename, 'utf8', function(err, txt) { - var v, view_options, _ref; - _this._monitorForChanges(filename, options); - if (txt !== _this.viewCache[filename].txt) { - if (err) { - txt = "Error: Could not read " + filename + " after fs.watch() hit."; - if (((_ref = options.__toffee) != null ? _ref.parent : void 0) != null) { - txt += " requested in " + options.__toffee.parent; - } - } - view_options = { - fileName: filename, - verbose: _this.verbose, - prettyPrintErrors: _this.prettyPrintErrors, - cb: function(v) { - _this._log("" + filename + " updated and ready"); - return _this.viewCache[filename] = v; - } - }; - return v = new view(txt, view_options); - } - }); - }); - }; - - return engine; - - })(); - - exports.engine = engine; - -}).call(this); -}, "errorHandler": function(exports, require, module) {// Generated by CoffeeScript 1.3.3 -(function() { - var eh, errorTypes, path, toffeeError, util, _ppEscape; - - path = require("path"); - - util = require("util"); - - errorTypes = exports.errorTypes = { - PARSER: 0, - STR_INTERPOLATE: 1, - COFFEE_COMPILE: 2, - RUNTIME: 3 - }; - - toffeeError = (function() { - - function toffeeError(view, err_type, e) { - this.errType = err_type; - this.view = view; - this.e = e; - this.toffeeSrc = view.txt; - switch (this.errType) { - case errorTypes.PARSER: - this.offensiveSrc = this.toffeeSrc; - break; - case errorTypes.STR_INTERPOLATE: - this.offensiveSrc = this.toffeeSrc; - break; - case errorTypes.COFFEE_COMPILE: - this.offensiveSrc = this.view.coffeeScript; - break; - case errorTypes.RUNTIME: - this.offensiveSrc = this.view.javaScript; - } - this.toffeeSrcLines = this.toffeeSrc.split("\n"); - this.offensiveSrcLines = this.offensiveSrc.split("\n"); - } - - toffeeError.prototype.getConvertedError = function() { - /* -------------------------------------- - returns a JS style error, but with some extras - { - stack: array of lines - message: error message - line_range: line range in the toffee file - filename: filename, if available; or null - ...etc... - } - ------------------------------------------ - */ - - var line, res, _ref; - res = { - stack: [], - message: "", - type: this.errType, - full_path: this.view.fileName, - dir_name: path.dirname(this.view.fileName), - file: path.basename(this.view.fileName), - line_range: [0, 0] - }; - if (((_ref = this.e) != null ? _ref.message : void 0) != null) { - res.message = this.e.message; - } - switch (this.errType) { - case errorTypes.PARSER: - line = this._extractOffensiveLineNo(this.e.message, /on line ([0-9]+)/); - res.line_range = [line, line + 1]; - break; - case errorTypes.STR_INTERPOLATE: - res.line_range = [this.e.relayed_line_range[0], this.e.relayed_line_range[1]]; - res.message = res.message.replace('starting on line NaN', this._lineRangeToPhrase(res.line_range)); - res.message = res.message.replace('missing }', 'unclosed `\#{}`'); - break; - case errorTypes.COFFEE_COMPILE: - line = this._extractOffensiveLineNo(this.e.message, /on line ([0-9]+)/); - res.line_range = this._convertOffensiveLineToToffeeRange(line); - res.message = res.message.replace(/on line [0-9]+/, this._lineRangeToPhrase(res.line_range)); - break; - case errorTypes.RUNTIME: - if (this.e.stack) { - res.stack = this.e.stack.split("\n"); - this._convertRuntimeStackLines(res); - } - } - return res; - }; - - toffeeError.prototype._convertRuntimeStackLines = function(converted_err) { - /* - a little more complicated, so extracted. Returns an array - of dictionaries where there's extra info on each line in the stack. - */ - - var at_pub_call, hit_pub_yet, i, in_src_file, line, lineno, lrange, m, rxx_inline, rxx_pub, stack, _i, _len, _results; - hit_pub_yet = false; - stack = converted_err.stack; - _results = []; - for (i = _i = 0, _len = stack.length; _i < _len; i = ++_i) { - line = stack[i]; - rxx_pub = RegExp("Object[\\.]" + this.view.identifier + "[\\s]\\(undefined\\:([0-9]+)\\:[0-9]+"); - m = line.match(rxx_pub); - in_src_file = false; - lrange = [null, null]; - at_pub_call = false; - if ((m != null ? m.length : void 0) >= 2) { - line = line.replace("undefined", converted_err.full_path); - lineno = this._extractOffensiveLineNo(line, /([0-9]+)\:[0-9]+/); - lrange = this._convertOffensiveLineToToffeeRange(lineno); - line = line.replace(/\:[0-9]+\:[0-9]+/, ""); - hit_pub_yet = true; - in_src_file = true; - at_pub_call = true; - } - rxx_inline = /at[\s]undefined\:([0-9]+)\:[0-9]+/; - m = line.match(rxx_inline); - if ((m != null ? m.length : void 0) >= 2) { - line = line.replace("undefined", converted_err.full_path); - lineno = this._extractOffensiveLineNo(line, /([0-9]+)\:[0-9]+/); - lrange = this._convertOffensiveLineToToffeeRange(lineno); - line = line.replace(/\:[0-9]+\:[0-9]+/, ""); - in_src_file = true; - } - stack[i] = { - line: line, - above_pub_call: !hit_pub_yet, - at_pub_call: at_pub_call, - in_src_file: in_src_file, - line_range: lrange - }; - if (stack[i].line_range[0] && !converted_err.line_range[0]) { - _results.push(converted_err.line_range = stack[i].line_range); - } else { - _results.push(void 0); - } - } - return _results; - }; - - toffeeError.prototype.getPrettyPrintText = function() { - /* - returns a TEXT only blob explaining the error - */ - - var cerr, count, header, i, item, res, _i, _len, _ref, _ref1; - cerr = this.getConvertedError(); - if (cerr.type === errorTypes.RUNTIME) { - header = cerr.message; - } else { - header = "" + cerr.dir_name + "/" + cerr.file + ": " + cerr.message; - } - res = "ERROR\n=====\n" + header; - if ((_ref = cerr.stack) != null ? _ref.length : void 0) { - res += "\n\nSTACK\n=====\n"; - count = 0; - _ref1 = cerr.stack; - for (i = _i = 0, _len = _ref1.length; _i < _len; i = ++_i) { - item = _ref1[i]; - if (i === 0) { - res += "" + (count++) + " " + item.line; - } else if (item.in_src_file && (item.above_pub_call || item.at_pub_call)) { - res += "" + (count++) + " [" + (this._lineRangeToPhrase(item.line_range)) + "] " + cerr.dir_name + "/" + cerr.file; - } else if (item.in_src_file) { - continue; - } else { - res += "" + (count++) + item.line; - } - if (i < cerr.stack.length - 1) { - res += "\n"; - } - } - } - res += "\n"; - return res; - }; - - toffeeError.prototype.getPrettyPrint = function() { - /* - returns an HTML blob explaining the error - with lines highlighted - */ - - var cerr, count, extra, header, i, item, j, line, padding, padding_len, res, _i, _j, _len, _ref, _ref1, _ref2, _ref3, _ref4; - cerr = this.getConvertedError(); - res = ""; - if (cerr.type === 234432) { - header = cerr.message; - } else { - header = "" + cerr.dir_name + "/" + cerr.file + ": " + cerr.message + ""; - } - res += "
    \n \n
    " + header + "
    \n \n
    \n \n
    "; - if ((_ref = cerr.stack) != null ? _ref.length : void 0) { - res += "
    "; - count = 0; - _ref1 = cerr.stack; - for (i = _i = 0, _len = _ref1.length; _i < _len; i = ++_i) { - item = _ref1[i]; - if (i === 0) { - res += "
    " + (count++) + " " + item.line + "
    "; - } else if (item.in_src_file && (item.above_pub_call || item.at_pub_call)) { - res += "
    " + (count++) + " [" + (this._lineRangeToPhrase(item.line_range)) + "] " + cerr.dir_name + "/" + cerr.file + "
    "; - } else if (item.in_src_file) { - continue; - } else { - res += "
    " + (count++) + item.line + "
    "; - } - } - res += "
    "; - } - for (i = _j = _ref2 = cerr.line_range[0] - 3, _ref3 = cerr.line_range[1] + 1; _ref2 <= _ref3 ? _j < _ref3 : _j > _ref3; i = _ref2 <= _ref3 ? ++_j : --_j) { - if ((i < 0) || i > this.toffeeSrcLines.length - 1) { - continue; - } - line = _ppEscape(this.toffeeSrcLines[i]); - padding_len = 5 - ("" + (i + 1)).length; - padding = ((function() { - var _k, _results; - _results = []; - for (j = _k = 0; 0 <= padding_len ? _k < padding_len : _k > padding_len; j = 0 <= padding_len ? ++_k : --_k) { - _results.push(" "); - } - return _results; - })()).join(""); - if ((cerr.line_range[0] <= (_ref4 = i + 1) && _ref4 < cerr.line_range[1])) { - extra = ""; - } else { - extra = ""; - } - res += "" + extra + "\n" + (i + 1) + ": " + padding + " " + line + "
    "; - } - res += " \n
    \n\n
    "; - return res; - }; - - toffeeError.prototype._lineRangeToPhrase = function(lrange) { - if (lrange[0] >= lrange[1] - 1) { - return "on line " + lrange[0]; - } else { - return "between lines " + lrange[0] + " and " + (lrange[1] - 1); - } - }; - - toffeeError.prototype._extractOffensiveLineNo = function(msg, rxx) { - var m; - m = msg.match(rxx); - if (!((m != null ? m.length : void 0) >= 2)) { - return null; - } - return parseInt(m[1]); - }; - - toffeeError.prototype._convertOffensiveLineToToffeeRange = function(lineno) { - /* - Given the error line in a converted file, hunts for surrounding - __toffee.lineno calls and returns a pair array with the error position - range in the original toffee file. - */ - - var next, next_matches, ol, prev, prev_matches, res, tl; - ol = this.offensiveSrcLines; - tl = this.toffeeSrcLines; - if ((!(lineno != null)) || isNaN(lineno)) { - return [1, tl.length]; - } - prev = ol.slice(0, lineno).join("\n"); - next = ol.slice(lineno).join("\n"); - prev_matches = prev.match(/__toffee.lineno[ ]*=[ ]*([0-9]+)/g); - next_matches = next.match(/__toffee.lineno[ ]*=[ ]*([0-9]+)/g); - res = [1, tl.length]; - if (prev_matches != null ? prev_matches.length : void 0) { - res[0] = parseInt(prev_matches[prev_matches.length - 1].match(/[0-9]+/)[0]); - } - if (next_matches != null ? next_matches.length : void 0) { - res[1] = parseInt(next_matches[0].match(/[0-9]+/)[0]); - } - return res; - }; - - return toffeeError; - - })(); - - exports.toffeeError = toffeeError; - - eh = exports.errorHandler = { - generateRuntimeError: function(view, e) { - /* - e: the error caught when running - */ - - var after, after_matches, before, msg, new_msg, prev_matches, res, search, src, src_lines, stack, txt_lines; - src = view.javaScript; - msg = e.message; - stack = e.stack; - res = { - src_line: 0, - toffee_line_range: [0, 1], - original_msg: msg, - converted_msg: msg - }; - search = stack.match(/pub\ \(undefined\:([0-9]+):[0-9]+/); - if (!((search != null ? search.length : void 0) >= 2)) { - return res; - } - res.src_line = search[1]; - src_lines = src.split('\n'); - txt_lines = view.txt.split('\n'); - before = src_lines.slice(0, res.src_line).join("\n"); - after = src_lines.slice(res.src_line).join("\n"); - prev_matches = before.match(/__toffee.lineno[ ]*=[ ]*([0-9]+)/g); - after_matches = after.match(/__toffee.lineno[ ]*=[ ]*([0-9]+)/g); - if (prev_matches != null ? prev_matches.length : void 0) { - res.toffee_line_range[0] = parseInt(prev_matches[prev_matches.length - 1].match(/[0-9]+/)[0]); - } else { - res.toffee_line_range[0] = 1; - } - if (after_matches != null ? after_matches.length : void 0) { - res.toffee_line_range[1] = parseInt(after_matches[0].match(/[0-9]+/)[0]); - } else { - res.toffee_line_range[1] = txt_lines.length; - } - res.offensive_lines = txt_lines.slice(res.toffee_line_range[0] - 1, res.toffee_line_range[1] - 1); - if (res.toffee_line_range[0] === res.toffee_line_range[1] - 1) { - new_msg = "on line " + res.toffee_line_range[0]; - } else { - new_msg = "between lines " + res.toffee_line_range[0] + " and " + res.toffee_line_range[1]; - } - res.converted_msg = res.original_msg + " " + new_msg; - if (view.fileName) { - res.converted_msg = "" + view.fileName + ": " + res.converted_msg; - } - return res; - }, - generateCompileToJsError: function(view, e) { - /* - e: the error caught when compiling - */ - - var msg, new_msg, res, search, src; - src = view.coffeeScript; - msg = e.message; - res = { - src_line: 0, - toffee_line_range: [0, 1], - original_msg: msg, - converted_msg: msg - }; - search = msg.match(/on line ([0-9]+)/); - if ((search != null ? search.length : void 0) >= 2) { - res.src_line = search[1]; - res.toffee_line_range = this._convertSrcLineToToffeeRange(view.coffeeScript, res.src_line); - res.offensive_lines = txt_lines.slice(res.toffee_line_range[0] - 1, res.toffee_line_range[1] - 1); - if (res.toffee_line_range[0] === res.toffee_line_range[1] - 1) { - new_msg = "on line " + res.toffee_line_range[0]; - } else { - new_msg = "between lines " + res.toffee_line_range[0] + " and " + res.toffee_line_range[1]; - } - res.converted_msg = res.original_msg.replace("on line " + res.src_line, new_msg); - if (view.fileName) { - res.converted_msg = "" + view.fileName + ": " + res.converted_msg; - } - } - return res; - }, - prettyPrintError: function(view) { - var i, line, lineno, padding, padding_len, res, txt_lines, _i, _ref, _ref1; - if (!view.error) { - return ""; - } else { - res = "
    "; - res += "" + (eh._ppEscape(view.error.converted_msg)) + ""; - res += "\n
    --------
    "; - res += "\n
    "; - txt_lines = view.txt.split('\n'); - for (i = _i = _ref = view.error.toffee_line_range[0] - 3, _ref1 = view.error.toffee_line_range[1] + 1; _ref <= _ref1 ? _i < _ref1 : _i > _ref1; i = _ref <= _ref1 ? ++_i : --_i) { - if ((i < 0) || i > txt_lines.length - 1) { - continue; - } - line = eh._ppEscape(txt_lines[i]); - lineno = i + 1; - padding_len = 5 - ("" + lineno).length; - padding = ((function() { - var _j, _results; - _results = []; - for (i = _j = 0; 0 <= padding_len ? _j < padding_len : _j > padding_len; i = 0 <= padding_len ? ++_j : --_j) { - _results.push(" "); - } - return _results; - })()).join(""); - res += "\n" + lineno + ": " + padding + " " + line + "
    "; - } - res += "\n
    "; - res += "\n
    "; - return res; - } - } - }; - - _ppEscape = function(txt) { - var i, m; - txt = txt.replace(/&/g, '&').replace(/ _ref; i = 0 <= _ref ? ++_i : --_i) { - _results.push(" "); - } - return _results; - })()).join("")); - return txt; - }; - -}).call(this); -}, "toffee_lang": function(exports, require, module) {/* Jison generated parser */ -var toffee_lang = (function(){ -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"starter":3,"toffee_zone":4,"EOF":5,"toffee_code":6,"flip_to_coffee":7,"flip_to_toffeecomment":8,"START_TOFFEE_COMMENT":9,"code":10,"END_TOFFEE_COMMENT":11,"START_COFFEE":12,"coffee_zone":13,"END_COFFEE":14,"coffee_code":15,"flip_to_toffee":16,"START_TOFFEE":17,"END_TOFFEE":18,"START_INDENTED_TOFFEE":19,"CODE":20,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOF",9:"START_TOFFEE_COMMENT",11:"END_TOFFEE_COMMENT",12:"START_COFFEE",14:"END_COFFEE",17:"START_TOFFEE",18:"END_TOFFEE",19:"START_INDENTED_TOFFEE",20:"CODE"}, -productions_: [0,[3,2],[4,1],[4,3],[4,2],[4,3],[4,2],[4,0],[8,3],[7,3],[13,1],[13,3],[13,2],[13,0],[16,3],[16,3],[6,1],[15,1],[10,1],[10,2]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1: this.$ = ["TOFFEE_ZONE", $$[$0-1]]; return this.$; -break; -case 2: this.$ = [$$[$0]]; -break; -case 3: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-2],$$[$0-1]); -break; -case 4: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-1]); -break; -case 5: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-2]); -break; -case 6: this.$ = $$[$0]; -break; -case 7: this.$ = []; -break; -case 9: this.$ = ["COFFEE_ZONE", $$[$0-1]]; -break; -case 10: this.$ = [$$[$0]]; -break; -case 11: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-2],$$[$0-1]); -break; -case 12: this.$ = $$[$0]; $$[$0].splice(0,0,$$[$0-1]); -break; -case 13: this.$ = []; -break; -case 14: this.$ = ["TOFFEE_ZONE", $$[$0-1]]; -break; -case 15: this.$ = ["INDENTED_TOFFEE_ZONE", $$[$0-1]]; -break; -case 16: this.$ = ["TOFFEE", $$[$0][0], $$[$0][1] ]; -break; -case 17: this.$ = ["COFFEE", $$[$0][0], $$[$0][1] ]; -break; -case 18: var ln = yylineno + 1 - $$[$0].split("\n").length + 1; - this.$ = [$$[$0], ln]; - -break; -case 19: var c = $$[$0-1][0] + $$[$0]; - var ln = yylineno + 1 - c.split("\n").length + 1; - this.$ = [c, ln]; - -break; -} -}, -table: [{3:1,4:2,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],20:[1,9]},{1:[3]},{5:[1,10]},{5:[2,2],7:11,8:12,9:[1,8],12:[1,7],18:[2,2]},{4:13,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{4:14,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{5:[2,16],9:[2,16],12:[2,16],18:[2,16],20:[1,15]},{10:19,13:16,14:[2,13],15:17,16:18,17:[1,20],19:[1,21],20:[1,9]},{10:22,20:[1,9]},{5:[2,18],9:[2,18],11:[2,18],12:[2,18],14:[2,18],17:[2,18],18:[2,18],19:[2,18],20:[2,18]},{1:[2,1]},{4:23,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{4:24,5:[2,7],6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{5:[2,4],18:[2,4]},{5:[2,6],18:[2,6]},{5:[2,19],9:[2,19],11:[2,19],12:[2,19],14:[2,19],17:[2,19],18:[2,19],19:[2,19],20:[2,19]},{14:[1,25]},{14:[2,10],16:26,17:[1,20],19:[1,21]},{10:19,13:27,14:[2,13],15:17,16:18,17:[1,20],19:[1,21],20:[1,9]},{14:[2,17],17:[2,17],19:[2,17],20:[1,15]},{4:28,6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{4:29,6:3,7:4,8:5,9:[1,8],10:6,12:[1,7],18:[2,7],20:[1,9]},{11:[1,30],20:[1,15]},{5:[2,3],18:[2,3]},{5:[2,5],18:[2,5]},{5:[2,9],9:[2,9],12:[2,9],18:[2,9],20:[2,9]},{10:19,13:31,14:[2,13],15:17,16:18,17:[1,20],19:[1,21],20:[1,9]},{14:[2,12]},{18:[1,32]},{18:[1,33]},{5:[2,8],9:[2,8],12:[2,8],18:[2,8],20:[2,8]},{14:[2,11]},{14:[2,14],17:[2,14],19:[2,14],20:[2,14]},{14:[2,15],17:[2,15],19:[2,15],20:[2,15]}], -defaultActions: {10:[2,1],27:[2,12],31:[2,11]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], // semantic value stack - lstack = [], // location stack - table = this.table, - yytext = '', - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - - //this.reductionCount = this.shiftCount = 0; - - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - if (typeof this.lexer.yylloc == 'undefined') - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - - if (typeof this.yy.parseError === 'function') - this.parseError = this.yy.parseError; - - function popStack (n) { - stack.length = stack.length - 2*n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - - 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; - 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 - _handle_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]+"'"); - } - var errStr = ''; - if (this.lexer.showPosition) { - errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'"; - } else { - errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + - (symbol == 1 /*EOF*/ ? "end of input" : - ("'"+(this.terminals_[symbol] || symbol)+"'")); - } - this.parseError(errStr, - {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - - // just recovered from another error - if (recovering == 3) { - if (symbol == EOF) { - throw new Error(errStr || 'Parsing halted.'); - } - - // discard current lookahead and grab another - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - symbol = lex(); - } - - // try to recover from error - while (1) { - // check for error recovery rule in this state - if ((TERROR.toString()) in table[state]) { - break; - } - if (state == 0) { - throw new Error(errStr || '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); - } - - switch (action[0]) { - - case 1: // shift - //this.shiftCount++; - - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); // push state - symbol = null; - if (!preErrorSymbol) { // normal execution/no error - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { // error just occurred, resume old lookahead f/ before error - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - - case 2: // reduce - //this.reductionCount++; - - len = this.productions_[action[1]][1]; - - // perform semantic action - yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 - // default location, uses first token for firsts, last for lasts - yyval._$ = { - first_line: lstack[lstack.length-(len||1)].first_line, - last_line: lstack[lstack.length-1].last_line, - first_column: lstack[lstack.length-(len||1)].first_column, - last_column: lstack[lstack.length-1].last_column - }; - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - - if (typeof r !== 'undefined') { - return r; - } - - // pop off stack - if (len) { - stack = stack.slice(0,-1*len*2); - vstack = vstack.slice(0, -1*len); - lstack = lstack.slice(0, -1*len); - } - - stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) - vstack.push(yyval.$); - lstack.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 - return true; - } - - } - - return true; -}}; -/* Jison generated lexer */ -var lexer = (function(){ -var lexer = ({EOF:1, -parseError:function parseError(str, hash) { - if (this.yy.parseError) { - this.yy.parseError(str, hash); - } else { - throw new Error(str); - } - }, -setInput:function (input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; - return this; - }, -input:function () { - var ch = this._input[0]; - this.yytext+=ch; - this.yyleng++; - this.match+=ch; - this.matched+=ch; - var lines = ch.match(/\n/); - if (lines) this.yylineno++; - this._input = this._input.slice(1); - return ch; - }, -unput:function (ch) { - this._input = ch + this._input; - return this; - }, -more:function () { - this._more = true; - return this; - }, -less:function (n) { - this._input = this.match.slice(n) + this._input; - }, -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); - }, -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; - }, -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, - match, - tempMatch, - index, - col, - lines; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/\n.*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length} - this.yytext += match[0]; - this.match += match[0]; - this.yyleng = this.yytext.length; - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); - if (this.done && this._input) this.done = false; - if (token) return token; - else return; - } - if (this._input === "") { - return this.EOF; - } else { - this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); - } - }, -lex:function lex() { - var r = this.next(); - if (typeof r !== 'undefined') { - return r; - } else { - return this.lex(); - } - }, -begin:function begin(condition) { - this.conditionStack.push(condition); - }, -popState:function popState() { - return this.conditionStack.pop(); - }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; - }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; - }, -pushState:function begin(condition) { - this.begin(condition); - }}); -lexer.options = {}; -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { - -var YYSTATE=YY_START -switch($avoiding_name_collisions) { -case 0:return 9; -break; -case 1:return 11; -break; -case 2:return 18; -break; -case 3:return 19; -break; -case 4:return 12; -break; -case 5:return 14; -break; -case 6:return 17; -break; -case 7:return 20; -break; -case 8:return 5; -break; -} }; -lexer.rules = [/^\{##/,/^##\}/,/^:\}/,/^\{:/,/^\{#/,/^#\}/,/^[\-][\t\r\n ]*\{:/,/^[^{}#\\:\-]+|[\\{}#:\-]/,/^$/]; -lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8],"inclusive":true}}; -return lexer;})() -parser.lexer = lexer; -return parser; -})(); -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = toffee_lang; -exports.parse = function () { return toffee_lang.parse.apply(toffee_lang, 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); -} -}}, "utils": function(exports, require, module) {// Generated by CoffeeScript 1.3.3 -(function() { - var lex, lexer; - - lexer = require('./coffee-script/lexer'); - - lex = new lexer.Lexer(); - - exports.interpolateString = function(str) { - /* - Similar to the interpolateString function in CoffeeScript, - except that it doesn't actually work on anything inside an outer #{}; - we're just looking to recognize them. - */ - - var expr, i, inner, interpolated, letter, pi, res, tag, tokens, value, _i, _len, _ref; - tokens = []; - res = []; - pi = 0; - i = -1; - while (letter = str.charAt(i += 1)) { - if (letter === '\\') { - i += 1; - continue; - } - if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = lex.balancedString(str.slice(i + 1), '}')))) { - continue; - } - if (pi < i) { - tokens.push(['NEOSTRING', str.slice(pi, i)]); - } - inner = expr.slice(1, -1); - if (inner.length) { - tokens.push(['TOKENS', inner]); - } - i += expr.length; - pi = i + 1; - } - if ((i > pi && pi < str.length)) { - tokens.push(['NEOSTRING', str.slice(pi)]); - } - if (!tokens.length) { - return res.push('STRING', '""'); - } - if (tokens[0][0] !== 'NEOSTRING') { - tokens.unshift(['', '']); - } - if (interpolated = tokens.length > 1) { - res.push('(', '('); - } - for (i = _i = 0, _len = tokens.length; _i < _len; i = ++_i) { - _ref = tokens[i], tag = _ref[0], value = _ref[1]; - if (i) { - res.push('+', '+'); - } - if (tag === 'TOKENS') { - res.push([tag, value]); - } else { - res.push(['STRING', value]); - } - } - if (interpolated) { - res.push(')', ')'); - } - return tokens; - }; - -}).call(this); -}, "view": function(exports, require, module) {// Generated by CoffeeScript 1.3.3 -(function() { - var TAB_SPACES, coffee, errorHandler, errorTypes, parser, states, toffeeError, utils, view, vm, _ref, _ref1; - - parser = require('./toffee_lang').parser; - - _ref = require('./errorHandler'), errorHandler = _ref.errorHandler, toffeeError = _ref.toffeeError, errorTypes = _ref.errorTypes; - - _ref1 = require('./consts'), states = _ref1.states, TAB_SPACES = _ref1.TAB_SPACES; - - utils = require('./utils'); - - vm = require('vm'); - - try { - coffee = require("iced-coffee-script"); - } catch (e) { - coffee = require("coffee-script"); - } - - view = (function() { - - function view(txt, options) { - /* - important options: - cb: if this is set, compilation will happen async and cb will be executed when it's ready - */ - - var _this = this; - options = options || {}; - this.fileName = options.fileName || options.filename || null; - this.identifier = options.indentifier || "pub"; - this.verbose = options.verbose || false; - this.prettyPrintErrors = options.prettyPrintErrors != null ? options.prettyPrintErrors : true; - this.txt = txt; - this.tokenObj = null; - this.coffeeScript = null; - this.javaScript = null; - this.scriptObj = null; - this.error = null; - if (options.cb) { - this._prepAsync(txt, function() { - return options.cb(_this); - }); - } - } - - view.prototype._prepAsync = function(txt, cb) { - /* - Only once it's fully compiled does it callback. - Defers via setTimeouts in each stage in the compile process - for CPU friendliness. This is a lot prettier with iced-coffee-script. - */ - - var v; - this._log("Prepping " + (this.fileName != null ? this.fileName : 'unknown') + " async."); - this._toTokenObj(); - v = this; - return setTimeout(function() { - v._toCoffee(); - return setTimeout(function() { - v._toJavaScript(); - return setTimeout(function() { - v._toScriptObj(); - v._log("Done async prep of " + (v.fileName != null ? v.fileName : 'unknown') + ". Calling back."); - return cb(); - }, 0); - }, 0); - }, 0); - }; - - view.prototype._log = function(o) { - var _ref2; - if (this.verbose) { - if ((_ref2 = typeof o) === "string" || _ref2 === "number" || _ref2 === "boolean") { - return console.log("toffee: " + o); - } else { - return console.log("toffee: " + (util.inspect(o))); - } - } - }; - - view.prototype._cleanTabs = function(obj) { - /* - replaces tabs with spaces in their coffee regions - */ - - var item, _i, _len, _ref2, _ref3, _results; - if ((_ref2 = obj[0]) === "INDENTED_TOFFEE_ZONE" || _ref2 === "TOFFEE_ZONE" || _ref2 === "COFFEE_ZONE") { - _ref3 = obj[1]; - _results = []; - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - item = _ref3[_i]; - _results.push(this._cleanTabs(item)); - } - return _results; - } else if (obj[0] === "COFFEE") { - return obj[1] = obj[1].replace(/\t/g, this._tabAsSpaces()); - } - }; - - view.prototype.run = function(options) { - /* - returns [err, str] - */ - - var res, sandbox, script; - script = this._toScriptObj(); - res = null; - if (!this.error) { - try { - sandbox = { - __toffee_run_input: options - }; - script.runInNewContext(sandbox); - res = sandbox.__toffee_run_input.__toffee.res; - delete sandbox.__toffee_run_input.__toffee; - } catch (e) { - this.error = new toffeeError(this, errorTypes.RUNTIME, e); - } - } - if (this.error) { - if (this.prettyPrintErrors) { - return [null, this.error.getPrettyPrint()]; - } else { - return [null, this.error.getPrettyPrintText()]; - } - } else { - return [null, res]; - } - }; - - view.prototype._toTokenObj = function() { - /* - compiles Toffee to token array - */ - if (!(this.tokenObj != null)) { - try { - this.tokenObj = parser.parse(this.txt); - } catch (e) { - this.error = new toffeeError(this, errorTypes.PARSER, e); - } - if (!(this.error != null)) { - this._cleanTabs(this.tokenObj); - } - } - return this.tokenObj; - }; - - view.prototype._toScriptObj = function() { - var d, txt; - if (!(this.scriptObj != null)) { - txt = this._toJavaScript(); - if (!this.error) { - d = Date.now(); - this.scriptObj = vm.createScript(txt); - this._log("" + this.fileName + " compiled to scriptObj in " + (Date.now() - d) + "ms"); - } - } - return this.scriptObj; - }; - - view.prototype._toJavaScript = function() { - var c, d; - if (!(this.javaScript != null)) { - c = this._toCoffee(); - if (!this.error) { - d = Date.now(); - try { - this.javaScript = coffee.compile(c, { - bare: false - }); - } catch (e) { - this.error = new toffeeError(this, errorTypes.COFFEE_COMPILE, e); - } - this._log("" + this.fileName + " compiled to JavaScript in " + (Date.now() - d) + "ms"); - } - } - return this.javaScript; - }; - - view.prototype._toCoffee = function() { - var d, res, tobj; - if (!(this.coffeeScript != null)) { - tobj = this._toTokenObj(); - if (!this.error) { - d = Date.now(); - res = this._coffeeHeaders(); - try { - res += this._toCoffeeRecurse(tobj, TAB_SPACES, 0)[0]; - res += this._coffeeFooters(); - this.coffeeScript = res; - } catch (e) { - this.error; - } - this._log("" + this.fileName + " compiled to CoffeeScript in " + (Date.now() - d) + "ms"); - } - } - return this.coffeeScript; - }; - - view.prototype._printLineNo = function(n, ind) { - if ((this.lastLineNo != null) && (n === this.lastLineNo)) { - return ""; - } else { - this.lastLineNo = n; - return "\n" + (this._space(ind)) + "__toffee.lineno = " + n; - } - }; - - view.prototype._snippetHasEscapeOverride = function(str) { - var token, _i, _len, _ref2, _ref3; - _ref2 = ['print', ' snippet', 'partial', 'raw', 'html', 'json', '__toffee.raw', '__toffee.html', '__toffee.json', 'JSON.stringify']; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - token = _ref2[_i]; - if (str.slice(0, token.length) === token) { - if ((str.length > token.length) && ((_ref3 = str[token.length]) === ' ' || _ref3 === '\t' || _ref3 === '\n' || _ref3 === '(')) { - return true; - } - } - } - return false; - }; - - view.prototype._toCoffeeRecurse = function(obj, indent_level, indent_baseline) { - var c, chunk, delta, i, i_delta, ind, interp, item, lbreak, line, lineno, lines, part, res, s, t_int, temp_indent_level, zone_baseline, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7; - res = ""; - i_delta = 0; - switch (obj[0]) { - case "INDENTED_TOFFEE_ZONE": - indent_level += TAB_SPACES; - _ref2 = obj[1]; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - item = _ref2[_i]; - _ref3 = this._toCoffeeRecurse(item, indent_level, indent_baseline), s = _ref3[0], delta = _ref3[1]; - res += s; - } - break; - case "TOFFEE_ZONE": - res += "\n" + (this._space(indent_level)) + "__toffee.state = states.TOFFEE"; - _ref4 = obj[1]; - for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { - item = _ref4[_j]; - _ref5 = this._toCoffeeRecurse(item, indent_level, indent_baseline), s = _ref5[0], delta = _ref5[1]; - res += s; - } - break; - case "COFFEE_ZONE": - res += "\n" + (this._space(indent_level)) + "__toffee.state = states.COFFEE"; - zone_baseline = this._getZoneBaseline(obj[1]); - temp_indent_level = indent_level; - _ref6 = obj[1]; - for (_k = 0, _len2 = _ref6.length; _k < _len2; _k++) { - item = _ref6[_k]; - _ref7 = this._toCoffeeRecurse(item, temp_indent_level, zone_baseline), s = _ref7[0], delta = _ref7[1]; - res += s; - temp_indent_level = indent_level + delta; - } - break; - case "TOFFEE": - ind = indent_level; - res += "\n" + (this._space(ind)) + "__toffee.state = states.TOFFEE"; - lineno = obj[2]; - try { - t_int = utils.interpolateString(obj[1]); - } catch (e) { - e.relayed_line_range = [lineno, lineno + obj[1].split("\n").length]; - this.error = new toffeeError(this, errorTypes.STR_INTERPOLATE, e); - throw e; - } - for (_l = 0, _len3 = t_int.length; _l < _len3; _l++) { - part = t_int[_l]; - if (part[0] === "TOKENS") { - res += this._printLineNo(lineno, ind); - interp = part[1].replace(/^[\n \t]+/, ''); - if (this._snippetHasEscapeOverride(interp)) { - chunk = "\#{" + interp + "}"; - } else { - chunk = "\#{escape(" + interp + ")}"; - } - res += "\n" + (this._space(ind)) + "__toffee.out.push " + (this._quoteStr(chunk)); - lineno += part[1].split("\n").length - 1; - } else { - lines = part[1].split("\n"); - for (i = _m = 0, _len4 = lines.length; _m < _len4; i = ++_m) { - line = lines[i]; - res += this._printLineNo(lineno, ind); - lbreak = i !== lines.length - 1 ? "\n" : ""; - chunk = this._escapeForStr("" + line + lbreak); - if (chunk.length) { - res += "\n" + (this._space(ind)) + "__toffee.out.push " + (this._quoteStr(chunk + lbreak)); - } - if (i < lines.length - 1) { - lineno++; - } - } - } - } - res += this._printLineNo(obj[2] + (obj[1].split('\n').length - 1), ind); - res += "\n" + (this._space(ind)) + "__toffee.state = states.COFFEE"; - break; - case "COFFEE": - c = obj[1]; - res += "\n" + (this._reindent(c, indent_level, indent_baseline)); - i_delta = this._getIndentationDelta(c, indent_baseline); - break; - default: - throw "Bad parsing. " + obj + " not handled."; - return ["", 0]; - } - return [res, i_delta]; - }; - - view.prototype._quoteStr = function(s) { - /* - returns a triple-quoted string, dividing into single quoted - start and stops, if the string begins with double quotes, since - coffee doesn't want to let us escape those. - */ - - var follow, lead, res; - lead = ""; - follow = ""; - while (s.length && (s[0] === '"')) { - s = s.slice(1); - lead += '"'; - } - while (s.length && (s.slice(-1) === '"')) { - s = s.slice(0, -1); - follow += '"'; - } - res = ''; - if (lead.length) { - res += "\'" + lead + "\' + "; - } - res += '"""' + s + '"""'; - if (follow.length) { - res += "+ \'" + follow + "\'"; - } - return res; - }; - - view.prototype._escapeForStr = function(s) { - /* - escapes a string so it can make it into coffeescript - triple quotes without losing whitespace, etc. - */ - s = s.replace(/\n/g, '\\n'); - s = s.replace(/\t/g, '\\t'); - return s; - }; - - view.prototype._getZoneBaseline = function(obj_arr) { - var ib, obj, _i, _len; - for (_i = 0, _len = obj_arr.length; _i < _len; _i++) { - obj = obj_arr[_i]; - if (obj[0] === "COFFEE") { - ib = this._getIndentationBaseline(obj[1]); - if (ib != null) { - return ib; - } - } - } - return 0; - }; - - view.prototype._getIndentationBaseline = function(coffee) { - var i, line, lines, res, _i, _len; - res = null; - lines = coffee.split("\n"); - if (lines.length) { - for (i = _i = 0, _len = lines.length; _i < _len; i = ++_i) { - line = lines[i]; - if ((!line.match(/^[ ]*$/)) || i === (lines.length - 1)) { - res = line.match(/[ ]*/)[0].length; - break; - } - } - } - if (!(res != null)) { - res = coffee.length; - } - return res; - }; - - view.prototype._getIndentationDelta = function(coffee, baseline) { - /* - given an arbitrarily indented set of coffeescript, returns the delta - between the first and last lines, in chars. - Ignores leading/trailing whitespace lines - If passed a baseline, uses that instead of own. - */ - - var lines, res, y, y_l; - if (!(baseline != null)) { - baseline = this._getIndentationBaseline(coffee); - } - if (!(baseline != null)) { - res = 0; - } else { - lines = coffee.split("\n"); - if (lines.length < 1) { - res = 0; - } else { - y = lines[lines.length - 1]; - y_l = y.match(/[ ]*/)[0].length; - res = y_l - baseline; - } - } - return res; - }; - - view.prototype._reindent = function(coffee, indent_level, indent_baseline) { - var indent, line, lines, res, rxx, strip; - lines = coffee.split('\n'); - while (lines.length && lines[0].match(/^[ ]*$/)) { - lines = lines.slice(1); - } - if (!lines.length) { - return ''; - } - rxx = /^[ ]*/; - strip = indent_baseline; - indent = this._space(indent_level); - res = ((function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = lines.length; _i < _len; _i++) { - line = lines[_i]; - _results.push("" + indent + line.slice(strip)); - } - return _results; - })()).join("\n"); - return res; - }; - - view.prototype._space = function(indent) { - var i; - return ((function() { - var _i, _results; - _results = []; - for (i = _i = 0; 0 <= indent ? _i < indent : _i > indent; i = 0 <= indent ? ++_i : --_i) { - _results.push(" "); - } - return _results; - })()).join(""); - }; - - view.prototype._tabAsSpaces = function() { - var i; - return ((function() { - var _i, _results; - _results = []; - for (i = _i = 0; 0 <= TAB_SPACES ? _i < TAB_SPACES : _i > TAB_SPACES; i = 0 <= TAB_SPACES ? ++_i : --_i) { - _results.push(" "); - } - return _results; - })()).join(""); - }; - - view.prototype._coffeeHeaders = function() { - var ___; - ___ = this._tabAsSpaces(); - return "domain = this\ndomain.toffeeTemplates = domain.toffeeTemplates or {}\ndomain.toffeeTemplates[\"" + this.identifier + "\"] = (locals) ->\n" + ___ + "domain = this\n" + ___ + "locals.__toffee = {}\n" + ___ + "`with (locals) {`\n" + ___ + "__toffee.out = []\n\n" + ___ + "if not print?\n" + ___ + ___ + "print = (txt) ->\n" + ___ + ___ + ___ + "if __toffee.state is states.COFFEE\n" + ___ + ___ + ___ + ___ + "__toffee.out.push txt\n" + ___ + ___ + ___ + ___ + "return ''\n" + ___ + ___ + ___ + "else\n" + ___ + ___ + ___ + ___ + "return \"\#{txt}x\"\n\n" + ___ + "__toffee.json = (o) ->\n" + ___ + ___ + "try\n" + ___ + ___ + ___ + "json = JSON.stringify o\n" + ___ + ___ + "catch e \n" + ___ + ___ + ___ + "throw {stack:[], message: \"JSONify error (\#{e.message}) on line \#{__toffee.lineno}\", toffee_line_base: __toffee.lineno }\n" + ___ + ___ + "res = \"\" + json\n\n" + ___ + "__toffee.html = (o) ->\n" + ___ + ___ + "res = (\"\"+o).replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"')\n\n" + ___ + "__toffee.raw = (o) -> o\n\n" + ___ + "if not raw? then raw = __toffee.raw\n" + ___ + "if not html? then html = __toffee.html\n" + ___ + "if not json? then json = __toffee.json\n\n" + ___ + "if not escape?\n" + ___ + ___ + "escape = (o) ->\n" + ___ + ___ + ___ + "if (not __toffee.autoEscape?) or __toffee.autoEscape\n" + ___ + ___ + ___ + ___ + "if o? and (typeof o) is \"object\"\n" + ___ + ___ + ___ + ___ + ___ + "return __toffee.json o\n" + ___ + ___ + ___ + ___ + "return __toffee.html o\n\n" + ___ + "states = " + (JSON.stringify(states)); - }; - - view.prototype._coffeeFooters = function() { - var ___; - ___ = this._tabAsSpaces(); - return "\n\n" + ___ + "__toffee.res = __toffee.out.join \"\"\n" + ___ + "return __toffee.res\n" + ___ + "`} /* closing JS 'with' */ `\n# sometimes we want to execute the whole thing in a sandbox\n# and just output results\nif __toffee_run_input?\n" + ___ + "return domain.toffeeTemplates[\"" + this.identifier + "\"] __toffee_run_input"; - }; - - return view; - - })(); - - exports.view = view; - - exports.expressCompile = function(txt, options) { - var v; - v = new view(txt, options); - return function(vars) { - var res; - res = v.run(vars); - if (res[0]) { - return res[0]; - } else { - return res[1]; - } - }; - }; - -}).call(this); -}}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..2829e32 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1423 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +JSONSelect@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/JSONSelect/-/JSONSelect-0.4.0.tgz#a08edcc67eb3fcbe99ed630855344a0cf282bb8d" + integrity sha512-VRLR3Su35MH+XV2lrvh9O7qWoug/TUyj9tLDjn9rtpUCNnILLrHjgd/tB0KrhugCxUpj3UqoLqfYb3fLJdIQQQ== + +"JSV@>= 4.0.x": + version "4.0.2" + resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" + integrity sha512-ZJ6wx9xaKJ3yFUhq5/sk82PJMuUyLk277I8mQeyDgCTjGdjWJIvPfaU5LIXaMuaN2UO1X3kZH4+lgphublZUHw== + +abab@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + integrity sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA== + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assert@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +babel-runtime@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bluebird@^3.5.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + integrity sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ== + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +cjson@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/cjson/-/cjson-0.3.0.tgz#e6439b90703d312ff6e2224097bea92ce3d02a14" + integrity sha512-bBRQcCIHzI1IVH59fR0bwGrFmi3Btb/JNwM/n401i1DnYgWndpsUBiQRAddLflkZage20A2d25OAWZZk0vBRlA== + dependencies: + jsonlint "1.6.0" + +coffee-script@1.12.7: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" + integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== + +colors@0.5.x: + version "0.5.1" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" + integrity sha512-XjsuUwpDeY98+yz959OlUK6m7mLBM+1MEG5oaenfuQnNnrQk1WvtcvFgN3FNDP3f2NmZ211t0mNEfSEN1h0eIg== + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" + integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-properties@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +diff@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +ebnf-parser@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/ebnf-parser/-/ebnf-parser-0.1.10.tgz#cd1f6ba477c5638c40c97ed9b572db5bab5d8331" + integrity sha512-urvSxVQ6XJcoTpc+/x2pWhhuOX4aljCNQpwzw+ifZvV1andZkAmiJc3Rq1oGEAQmcjiLceyMXOy1l8ms8qs2fQ== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escodegen@1.3.x: + version "1.3.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.3.3.tgz#f024016f5a88e046fd12005055e939802e6c5f23" + integrity sha512-z9FWgKc48wjMlpzF5ymKS1AF8OIgnKLp9VyN7KbdtyrP/9lndwUFqCtMm+TAJmJf7KJFFYc4cFJfVTTGkKEwsA== + dependencies: + esprima "~1.1.1" + estraverse "~1.5.0" + esutils "~1.0.0" + optionalDependencies: + source-map "~0.1.33" + +escodegen@^1.9.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@1.1.x, esprima@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549" + integrity sha512-qxxB994/7NtERxgXdFgLHIs9M6bhLXc6qtUmWZ3L8+gTQ9qaoyki2887P2IqAYsoENyr8SUbTutStDniOHSDHg== + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" + integrity sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +esutils@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" + integrity sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventsource@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.2.tgz#bc75ae1c60209e7cb1541231980460343eaea7c2" + integrity sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA== + +express@4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + integrity sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +highlight.js@11.7.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" + integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iced-coffee-script@108.0.14: + version "108.0.14" + resolved "https://registry.yarnpkg.com/iced-coffee-script/-/iced-coffee-script-108.0.14.tgz#9ca5b258decf4a5eafb16f5663ff7683227c4f1a" + integrity sha512-e0CNmz51UGWRa2glPnUMnJM7oKQE81cxeC0WAgCjJDRImv3FDHldZr/Ngkbrgdbf1drGGzYWp+PWeJwXIfHwDw== + dependencies: + iced-runtime ">=0.0.1" + uglify-js "^3.5.9" + +iced-lock@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/iced-lock/-/iced-lock-2.0.1.tgz#92fe46ffe01b872bf88f963c2a319fa8ad80d13b" + integrity sha512-J6dnGMpAoHNyACUYJYhiJkLY7YFRTa7NMZ8ZygpYB3HNDOGWtzv55+kT2u1zItRi4Y1EXruG9d1VDsx8R5faTw== + dependencies: + iced-runtime "^1.0.0" + +iced-runtime@>=0.0.1, iced-runtime@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/iced-runtime/-/iced-runtime-1.0.4.tgz#e9de26dfe98cd8621201f7f3dfb9f7f09c550990" + integrity sha512-rgiJXNF6ZgF2Clh/TKUlBDW3q51YPDJUXmxGQXx1b8tbZpVpTn+1RX9q1sjNkujXIIaVxZByQzPHHORg7KV51g== + +iconv-lite@0.4.24, iconv-lite@^0.4.21: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.4, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-typed-array@^1.1.10, is-typed-array@^1.1.3: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +jison-lex@0.3.x: + version "0.3.4" + resolved "https://registry.yarnpkg.com/jison-lex/-/jison-lex-0.3.4.tgz#81ca28d84f84499dfa8c594dcde3d8a3f26ec7a5" + integrity sha512-EBh5wrXhls1cUwROd5DcDHR1sG7CdsCFSqY1027+YA1RGxz+BX2TDLAhdsQf40YEtFDGoiO0Qm8PpnBl2EzDJw== + dependencies: + lex-parser "0.1.x" + nomnom "1.5.2" + +jison@0.4.18: + version "0.4.18" + resolved "https://registry.yarnpkg.com/jison/-/jison-0.4.18.tgz#c68a6a54bfe7028fa40bcfc6cc8bbd9ed291f502" + integrity sha512-FKkCiJvozgC7VTHhMJ00a0/IApSxhlGsFIshLW6trWJ8ONX2TQJBBz6DlcO1Gffy4w9LT+uL+PA+CVnUSJMF7w== + dependencies: + JSONSelect "0.4.0" + cjson "0.3.0" + ebnf-parser "0.1.10" + escodegen "1.3.x" + esprima "1.1.x" + jison-lex "0.3.x" + lex-parser "~0.1.3" + nomnom "1.5.2" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsdom@11.12.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonlint@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/jsonlint/-/jsonlint-1.6.0.tgz#88aa46bc289a7ac93bb46cae2d58a187a9bb494a" + integrity sha512-x6YLBe6NjdpmIeiklwQOxsZuYj/SOWkT33GlTpaG1UdFGjdWjPcxJ1CWZAX3wA7tarz8E2YHF6KiW5HTapPlXw== + dependencies: + JSV ">= 4.0.x" + nomnom ">= 1.5.x" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lex-parser@0.1.x, lex-parser@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/lex-parser/-/lex-parser-0.1.4.tgz#64c4f025f17fd53bfb45763faeb16f015a747550" + integrity sha512-DuAEISsr1H4LOpmFLkyMc8YStiRWZCO8hMsoXAXSbgyfvs2WQhSt0+/FBv3ZU/JBFZMGcE+FWzEBSzwUU7U27w== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash@^4.17.10, lodash@^4.17.19: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.3.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mkdirp@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.3.tgz#b083ff37be046fd3d6552468c1f0ff44c1545d1f" + integrity sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +nomnom@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.5.2.tgz#f4345448a853cfbd5c0d26320f2477ab0526fe2f" + integrity sha512-fiVbT7BqxiQqjlR9U3FDGOSERFCKoXVCdxV2FwZuNN7/cmJ42iQx35nUFOAFDcyvemu9Adp+IlsCGlKQYLmBKw== + dependencies: + colors "0.5.x" + underscore "1.1.x" + +"nomnom@>= 1.5.x": + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + integrity sha512-5s0JxqhDx9/rksG2BTMVN1enjWSvPidpoSgViZU4ZXULyTe+7jxcCRLB6f42Z0l1xYJpleCBtSyY6Lwg3uu5CQ== + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + +nwsapi@^2.0.7: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.85.0, request@^2.87.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +source-map@~0.1.33: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ== + dependencies: + amdefine ">=0.0.4" + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + integrity sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg== + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tablify@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/tablify/-/tablify-0.1.5.tgz#47160ce2918be291d63cecceddb5254dd72982c7" + integrity sha512-puOS3ef9p20DqujVs5JBCAYp5EeQke7B7+5g0SUdQKUNWkX6oM3jSzW8OD42HXowB7NTLisFGLsbYms3x+q9HA== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +uglify-js@^3.5.9: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +underscore@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.1.7.tgz#40bab84bad19d230096e8d6ef628bff055d83db0" + integrity sha512-w4QtCHoLBXw1mjofIDoMyexaEdWGMedWNDhlWTtT1V1lCRqi65Pnoygkh6+WRdr+Bm8ldkBNkNeCsXGMlQS9HQ== + +underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + integrity sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util@^0.12.0: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-typed-array@^1.1.2: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +ws@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.1.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +zombie@6.1.4: + version "6.1.4" + resolved "https://registry.yarnpkg.com/zombie/-/zombie-6.1.4.tgz#9f0f53f3d9a032beb7f3fe5b382146a3475a4d47" + integrity sha512-yxNvKtyz3PP8lkr31AYh7vdbBD4is9hYXiOQKPp+k/7GiDiFQXX1Ex+peCl4ttodu/bHZcIluJ8lxMla5XefBQ== + dependencies: + babel-runtime "6.26.0" + bluebird "^3.5.1" + debug "^4.1.0" + eventsource "^1.0.5" + iconv-lite "^0.4.21" + jsdom "11.12.0" + lodash "^4.17.10" + mime "^2.3.1" + ms "^2.1.1" + request "^2.85.0" + tough-cookie "^2.3.4" + ws "^6.1.2"