aboutsummaryrefslogtreecommitdiff
path: root/node_modules/stylus
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/stylus
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/stylus')
l---------node_modules/stylus/.bin/stylus1
-rw-r--r--node_modules/stylus/History.md1398
-rw-r--r--node_modules/stylus/LICENSE22
-rw-r--r--node_modules/stylus/Readme.md178
-rwxr-xr-xnode_modules/stylus/bin/stylus817
-rw-r--r--node_modules/stylus/index.js4
-rw-r--r--node_modules/stylus/lib/browserify.js2
-rw-r--r--node_modules/stylus/lib/cache/fs.js80
-rw-r--r--node_modules/stylus/lib/cache/index.js25
-rw-r--r--node_modules/stylus/lib/cache/memory.js116
-rw-r--r--node_modules/stylus/lib/cache/null.js50
-rw-r--r--node_modules/stylus/lib/colors.js158
-rw-r--r--node_modules/stylus/lib/convert/css.js307
-rw-r--r--node_modules/stylus/lib/errors.js58
-rw-r--r--node_modules/stylus/lib/functions/add-property.js29
-rw-r--r--node_modules/stylus/lib/functions/adjust.js28
-rw-r--r--node_modules/stylus/lib/functions/alpha.js36
-rw-r--r--node_modules/stylus/lib/functions/base-convert.js26
-rw-r--r--node_modules/stylus/lib/functions/basename.js15
-rw-r--r--node_modules/stylus/lib/functions/blend.js37
-rw-r--r--node_modules/stylus/lib/functions/blue.js33
-rw-r--r--node_modules/stylus/lib/functions/clone.js14
-rw-r--r--node_modules/stylus/lib/functions/component.js60
-rw-r--r--node_modules/stylus/lib/functions/contrast.js75
-rw-r--r--node_modules/stylus/lib/functions/convert.js15
-rw-r--r--node_modules/stylus/lib/functions/current-media.js22
-rw-r--r--node_modules/stylus/lib/functions/define.js23
-rw-r--r--node_modules/stylus/lib/functions/dirname.js15
-rw-r--r--node_modules/stylus/lib/functions/error.js15
-rw-r--r--node_modules/stylus/lib/functions/extname.js15
-rw-r--r--node_modules/stylus/lib/functions/green.js33
-rw-r--r--node_modules/stylus/lib/functions/hsl.js35
-rw-r--r--node_modules/stylus/lib/functions/hsla.js53
-rw-r--r--node_modules/stylus/lib/functions/hue.js34
-rw-r--r--node_modules/stylus/lib/functions/image-size.js58
-rw-r--r--node_modules/stylus/lib/functions/image.js162
-rw-r--r--node_modules/stylus/lib/functions/index.js69
-rw-r--r--node_modules/stylus/lib/functions/index.styl297
-rw-r--r--node_modules/stylus/lib/functions/json.js116
-rw-r--r--node_modules/stylus/lib/functions/length.js25
-rw-r--r--node_modules/stylus/lib/functions/lightness.js34
-rw-r--r--node_modules/stylus/lib/functions/list-separator.js25
-rw-r--r--node_modules/stylus/lib/functions/lookup.js17
-rw-r--r--node_modules/stylus/lib/functions/luminosity.js38
-rw-r--r--node_modules/stylus/lib/functions/match.js43
-rw-r--r--node_modules/stylus/lib/functions/math-prop.js13
-rw-r--r--node_modules/stylus/lib/functions/math.js17
-rw-r--r--node_modules/stylus/lib/functions/merge.js24
-rw-r--r--node_modules/stylus/lib/functions/operate.js18
-rw-r--r--node_modules/stylus/lib/functions/opposite-position.js32
-rw-r--r--node_modules/stylus/lib/functions/p.js18
-rw-r--r--node_modules/stylus/lib/functions/pathjoin.js16
-rw-r--r--node_modules/stylus/lib/functions/pop.js14
-rw-r--r--node_modules/stylus/lib/functions/prefix-classes.js22
-rw-r--r--node_modules/stylus/lib/functions/push.js18
-rw-r--r--node_modules/stylus/lib/functions/range.js32
-rw-r--r--node_modules/stylus/lib/functions/red.js33
-rw-r--r--node_modules/stylus/lib/functions/remove.js17
-rw-r--r--node_modules/stylus/lib/functions/replace.js23
-rw-r--r--node_modules/stylus/lib/functions/resolver.js85
-rw-r--r--node_modules/stylus/lib/functions/rgb.js40
-rw-r--r--node_modules/stylus/lib/functions/rgba.js59
-rw-r--r--node_modules/stylus/lib/functions/s.js37
-rw-r--r--node_modules/stylus/lib/functions/saturation.js35
-rw-r--r--node_modules/stylus/lib/functions/selector-exists.js23
-rw-r--r--node_modules/stylus/lib/functions/selector.js71
-rw-r--r--node_modules/stylus/lib/functions/selectors.js43
-rw-r--r--node_modules/stylus/lib/functions/shift.js15
-rw-r--r--node_modules/stylus/lib/functions/slice.js28
-rw-r--r--node_modules/stylus/lib/functions/split.js25
-rw-r--r--node_modules/stylus/lib/functions/substr.js22
-rw-r--r--node_modules/stylus/lib/functions/tan.js28
-rw-r--r--node_modules/stylus/lib/functions/trace.js12
-rw-r--r--node_modules/stylus/lib/functions/transparentify.js63
-rw-r--r--node_modules/stylus/lib/functions/type.js30
-rw-r--r--node_modules/stylus/lib/functions/unit.js23
-rw-r--r--node_modules/stylus/lib/functions/unquote.js23
-rw-r--r--node_modules/stylus/lib/functions/unshift.js18
-rw-r--r--node_modules/stylus/lib/functions/url.js142
-rw-r--r--node_modules/stylus/lib/functions/use.js74
-rw-r--r--node_modules/stylus/lib/functions/warn.js15
-rw-r--r--node_modules/stylus/lib/lexer.js882
-rw-r--r--node_modules/stylus/lib/middleware.js256
-rw-r--r--node_modules/stylus/lib/nodes/arguments.js92
-rw-r--r--node_modules/stylus/lib/nodes/atblock.js79
-rw-r--r--node_modules/stylus/lib/nodes/atrule.js136
-rw-r--r--node_modules/stylus/lib/nodes/binop.js83
-rw-r--r--node_modules/stylus/lib/nodes/block.js127
-rw-r--r--node_modules/stylus/lib/nodes/boolean.js117
-rw-r--r--node_modules/stylus/lib/nodes/call.js85
-rw-r--r--node_modules/stylus/lib/nodes/charset.js58
-rw-r--r--node_modules/stylus/lib/nodes/comment.js64
-rw-r--r--node_modules/stylus/lib/nodes/each.js75
-rw-r--r--node_modules/stylus/lib/nodes/expression.js220
-rw-r--r--node_modules/stylus/lib/nodes/extend.js69
-rw-r--r--node_modules/stylus/lib/nodes/feature.js84
-rw-r--r--node_modules/stylus/lib/nodes/function.js128
-rw-r--r--node_modules/stylus/lib/nodes/group.js110
-rw-r--r--node_modules/stylus/lib/nodes/hsla.js277
-rw-r--r--node_modules/stylus/lib/nodes/ident.js156
-rw-r--r--node_modules/stylus/lib/nodes/if.js78
-rw-r--r--node_modules/stylus/lib/nodes/import.js68
-rw-r--r--node_modules/stylus/lib/nodes/index.js59
-rw-r--r--node_modules/stylus/lib/nodes/keyframes.js81
-rw-r--r--node_modules/stylus/lib/nodes/literal.js112
-rw-r--r--node_modules/stylus/lib/nodes/media.js76
-rw-r--r--node_modules/stylus/lib/nodes/member.js82
-rw-r--r--node_modules/stylus/lib/nodes/namespace.js60
-rw-r--r--node_modules/stylus/lib/nodes/node.js250
-rw-r--r--node_modules/stylus/lib/nodes/null.js88
-rw-r--r--node_modules/stylus/lib/nodes/object.js213
-rw-r--r--node_modules/stylus/lib/nodes/params.js90
-rw-r--r--node_modules/stylus/lib/nodes/property.js96
-rw-r--r--node_modules/stylus/lib/nodes/query-list.js108
-rw-r--r--node_modules/stylus/lib/nodes/query.js170
-rw-r--r--node_modules/stylus/lib/nodes/return.js63
-rw-r--r--node_modules/stylus/lib/nodes/rgba.js367
-rw-r--r--node_modules/stylus/lib/nodes/root.js96
-rw-r--r--node_modules/stylus/lib/nodes/selector.js94
-rw-r--r--node_modules/stylus/lib/nodes/string.js147
-rw-r--r--node_modules/stylus/lib/nodes/supports.js75
-rw-r--r--node_modules/stylus/lib/nodes/ternary.js71
-rw-r--r--node_modules/stylus/lib/nodes/unaryop.js66
-rw-r--r--node_modules/stylus/lib/nodes/unit.js214
-rw-r--r--node_modules/stylus/lib/parser.js2181
-rw-r--r--node_modules/stylus/lib/renderer.js246
-rw-r--r--node_modules/stylus/lib/selector-parser.js258
-rw-r--r--node_modules/stylus/lib/stack/frame.js65
-rw-r--r--node_modules/stylus/lib/stack/index.js135
-rw-r--r--node_modules/stylus/lib/stack/scope.js53
-rw-r--r--node_modules/stylus/lib/stylus.js103
-rw-r--r--node_modules/stylus/lib/token.js53
-rw-r--r--node_modules/stylus/lib/units.js20
-rw-r--r--node_modules/stylus/lib/utils.js526
-rw-r--r--node_modules/stylus/lib/visitor/compiler.js567
-rw-r--r--node_modules/stylus/lib/visitor/deps-resolver.js169
-rw-r--r--node_modules/stylus/lib/visitor/evaluator.js1610
-rw-r--r--node_modules/stylus/lib/visitor/index.js31
-rw-r--r--node_modules/stylus/lib/visitor/normalizer.js424
-rw-r--r--node_modules/stylus/lib/visitor/sourcemapper.js203
l---------node_modules/stylus/node_modules/.bin/mkdirp1
-rw-r--r--node_modules/stylus/node_modules/debug/CHANGELOG.md395
-rw-r--r--node_modules/stylus/node_modules/debug/LICENSE19
-rw-r--r--node_modules/stylus/node_modules/debug/README.md455
-rw-r--r--node_modules/stylus/node_modules/debug/dist/debug.js886
-rw-r--r--node_modules/stylus/node_modules/debug/package.json63
-rw-r--r--node_modules/stylus/node_modules/debug/src/browser.js264
-rw-r--r--node_modules/stylus/node_modules/debug/src/common.js264
-rw-r--r--node_modules/stylus/node_modules/debug/src/index.js10
-rw-r--r--node_modules/stylus/node_modules/debug/src/node.js257
-rw-r--r--node_modules/stylus/node_modules/glob/LICENSE15
-rw-r--r--node_modules/stylus/node_modules/glob/README.md365
-rw-r--r--node_modules/stylus/node_modules/glob/changelog.md67
-rw-r--r--node_modules/stylus/node_modules/glob/common.js235
-rw-r--r--node_modules/stylus/node_modules/glob/glob.js787
-rw-r--r--node_modules/stylus/node_modules/glob/package.json43
-rw-r--r--node_modules/stylus/node_modules/glob/sync.js468
-rw-r--r--node_modules/stylus/node_modules/ms/index.js162
-rw-r--r--node_modules/stylus/node_modules/ms/license.md21
-rw-r--r--node_modules/stylus/node_modules/ms/package.json37
-rw-r--r--node_modules/stylus/node_modules/ms/readme.md60
-rw-r--r--node_modules/stylus/node_modules/sax/AUTHORS10
-rw-r--r--node_modules/stylus/node_modules/sax/LICENSE32
-rw-r--r--node_modules/stylus/node_modules/sax/LICENSE-W3C.html188
-rw-r--r--node_modules/stylus/node_modules/sax/README.md216
-rw-r--r--node_modules/stylus/node_modules/sax/component.json12
-rw-r--r--node_modules/stylus/node_modules/sax/examples/big-not-pretty.xml8002
-rw-r--r--node_modules/stylus/node_modules/sax/examples/example.js29
-rw-r--r--node_modules/stylus/node_modules/sax/examples/get-products.js58
-rw-r--r--node_modules/stylus/node_modules/sax/examples/hello-world.js4
-rw-r--r--node_modules/stylus/node_modules/sax/examples/not-pretty.xml8
-rw-r--r--node_modules/stylus/node_modules/sax/examples/pretty-print.js74
-rw-r--r--node_modules/stylus/node_modules/sax/examples/shopping.xml2
-rw-r--r--node_modules/stylus/node_modules/sax/examples/strict.dtd870
-rw-r--r--node_modules/stylus/node_modules/sax/examples/test.html15
-rw-r--r--node_modules/stylus/node_modules/sax/examples/test.xml1254
-rw-r--r--node_modules/stylus/node_modules/sax/lib/sax.js1355
-rw-r--r--node_modules/stylus/node_modules/sax/package.json12
-rw-r--r--node_modules/stylus/node_modules/sax/test/attribute-name.js33
-rw-r--r--node_modules/stylus/node_modules/sax/test/attribute-no-space.js75
-rw-r--r--node_modules/stylus/node_modules/sax/test/buffer-overrun.js26
-rw-r--r--node_modules/stylus/node_modules/sax/test/case.js50
-rw-r--r--node_modules/stylus/node_modules/sax/test/cdata-chunked.js11
-rw-r--r--node_modules/stylus/node_modules/sax/test/cdata-end-split.js15
-rw-r--r--node_modules/stylus/node_modules/sax/test/cdata-fake-end.js28
-rw-r--r--node_modules/stylus/node_modules/sax/test/cdata-multiple.js15
-rw-r--r--node_modules/stylus/node_modules/sax/test/cdata.js10
-rw-r--r--node_modules/stylus/node_modules/sax/test/cyrillic.js8
-rw-r--r--node_modules/stylus/node_modules/sax/test/duplicate-attribute.js13
-rw-r--r--node_modules/stylus/node_modules/sax/test/end_empty_stream.js5
-rw-r--r--node_modules/stylus/node_modules/sax/test/entities.js10
-rw-r--r--node_modules/stylus/node_modules/sax/test/entity-mega.js16
-rw-r--r--node_modules/stylus/node_modules/sax/test/flush.js13
-rw-r--r--node_modules/stylus/node_modules/sax/test/index.js86
-rw-r--r--node_modules/stylus/node_modules/sax/test/issue-23.js43
-rw-r--r--node_modules/stylus/node_modules/sax/test/issue-30.js24
-rw-r--r--node_modules/stylus/node_modules/sax/test/issue-35.js15
-rw-r--r--node_modules/stylus/node_modules/sax/test/issue-47.js12
-rw-r--r--node_modules/stylus/node_modules/sax/test/issue-49.js31
-rw-r--r--node_modules/stylus/node_modules/sax/test/issue-84.js13
-rw-r--r--node_modules/stylus/node_modules/sax/test/parser-position.js28
-rw-r--r--node_modules/stylus/node_modules/sax/test/script-close-better.js12
-rw-r--r--node_modules/stylus/node_modules/sax/test/script.js12
-rw-r--r--node_modules/stylus/node_modules/sax/test/self-closing-child-strict.js44
-rw-r--r--node_modules/stylus/node_modules/sax/test/self-closing-child.js44
-rw-r--r--node_modules/stylus/node_modules/sax/test/self-closing-tag.js25
-rw-r--r--node_modules/stylus/node_modules/sax/test/stray-ending.js17
-rw-r--r--node_modules/stylus/node_modules/sax/test/trailing-attribute-no-value.js10
-rw-r--r--node_modules/stylus/node_modules/sax/test/trailing-non-whitespace.js18
-rw-r--r--node_modules/stylus/node_modules/sax/test/unclosed-root.js11
-rw-r--r--node_modules/stylus/node_modules/sax/test/unquoted.js18
-rw-r--r--node_modules/stylus/node_modules/sax/test/utf8-split.js32
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-as-tag-name.js15
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-issue-41.js68
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-rebinding.js63
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-strict.js74
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-unbound-element.js33
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-unbound.js15
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-xml-default-ns.js31
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js36
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-xml-default-prefix.js21
-rw-r--r--node_modules/stylus/node_modules/sax/test/xmlns-xml-default-redefine.js41
-rw-r--r--node_modules/stylus/node_modules/source-map/.npmignore2
-rw-r--r--node_modules/stylus/node_modules/source-map/.travis.yml4
-rw-r--r--node_modules/stylus/node_modules/source-map/CHANGELOG.md194
-rw-r--r--node_modules/stylus/node_modules/source-map/LICENSE28
-rw-r--r--node_modules/stylus/node_modules/source-map/Makefile.dryice.js166
-rw-r--r--node_modules/stylus/node_modules/source-map/README.md475
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map.js8
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/array-set.js97
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/base64-vlq.js142
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/base64.js42
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/binary-search.js80
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/mapping-list.js86
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/source-map-consumer.js575
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/source-map-generator.js400
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/source-node.js414
-rw-r--r--node_modules/stylus/node_modules/source-map/lib/source-map/util.js319
-rw-r--r--node_modules/stylus/node_modules/source-map/package.json65
-rwxr-xr-xnode_modules/stylus/node_modules/source-map/test/run-tests.js62
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-api.js26
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-array-set.js104
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-base64-vlq.js23
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-base64.js35
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-binary-search.js54
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-dog-fooding.js84
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-source-map-consumer.js702
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-source-map-generator.js679
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-source-node.js612
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/test-util.js216
-rw-r--r--node_modules/stylus/node_modules/source-map/test/source-map/util.js192
-rw-r--r--node_modules/stylus/package.json54
252 files changed, 42662 insertions, 0 deletions
diff --git a/node_modules/stylus/.bin/stylus b/node_modules/stylus/.bin/stylus
new file mode 120000
index 00000000..d0bb439f
--- /dev/null
+++ b/node_modules/stylus/.bin/stylus
@@ -0,0 +1 @@
+../bin/stylus \ No newline at end of file
diff --git a/node_modules/stylus/History.md b/node_modules/stylus/History.md
new file mode 100644
index 00000000..2d3800da
--- /dev/null
+++ b/node_modules/stylus/History.md
@@ -0,0 +1,1398 @@
+0.54.5 / 2016-04-28
+===================
+
+ * Fix: [CLI] Correct console output for Node 6.0
+
+0.54.4 / 2016-04-27
+===================
+
+ * Fix: Correct extname checks for Node 6.0
+
+0.54.3 / 2016-04-26
+===================
+
+ * Fix: Proper embedurl encoding for svg files with a hash.
+ * Fix: Validate this.dest before using path.extname.
+ * Fix: Update node-glob version.
+
+0.54.2 / 2016-03-11
+===================
+
+ * Fix: False-positive import loop with empty imported file.
+
+0.54.0 / 2016-03-05
+===================
+
+ * Feature: Added initial reference selector.
+ * Feature: New `embedurl()` bif with optional utf8 uncoding support for SVG.
+ * Feature: New `index()` bif.
+ * Feature: New `percentage()` bif.
+ * Feature: New `slice()` bif, #2115.
+ * Feature: Support for UTF-8 encoding of urls, #2084.
+ * Feature: Added `global` flag to `define()` function.
+ * Feature: `match()` bif now returns the matched values instead of a boolean, #2109.
+ * Feature: Added an optional `flags` argument to `match()` bif, #2109.
+ * Docs: Added basic “getting started” to Readme, #2073.
+ * Docs: Updated information about error reporting.
+ * Fix: `selectors()` now returns proper subselectors.
+ * Fix: No more unneeded spaces with partial reference selector using ranges.
+ * Fix: Proper evaluating of the default arguments.
+ * Fix: Evaluate variables in current-media function.
+ * Fix: Validate regexp flags for `match` function.
+ * Fix: Proper conditional assignment and "define" method.
+ * Fix: Proper relative paths in sourcemaps if --out flag is set to a filename.
+ * Fix: Proper errors with `--include-css` and `--resolve-url` used concurrently.
+ * Fix: [Evaluator] Support for function as a default argument for functions.
+ * Fix: [Lexer] Proper multiline comments inside multiline expressions.
+ * Fix: [JS API] Proper variables from options object inside expressions.
+ * Fix: [Renderer] No more caching of parsed AST for deps-resolver.
+
+0.53.0 / 2015-12-14
+===================
+
+ * Feature: Numeric partial references.
+ * Feature: Relative references.
+ * Feature: New `selectors()` bif.
+ * Feature: Support for comma-separated lists as `selector()`'s arguments.
+ * Docs: Reworked contribution guidelines.
+ * Docs: Added Contributor Code of Conduct.
+ * Fix: Support for multiple consecutive parent references.
+ * Fix: Proper removal of parent references at the root when combinators are present.
+ * Fix: Don't add space before unknown units.
+ * Fix: Allow comma-separated lists in `@supports` value.
+ * Fix: No more error message for "assertType" without parameter name.
+ * Fix: Proper middleware overlap function on windows. Thanks to #2029 by @bcomnes.
+ * Fix: Better absolute path detection for Windows. Thanks to #2033 by @mlohbihler.
+ * Refactoring: Moved bifs to separate files.
+
+
+0.52.4 / 2015-09-04
+===================
+
+ * Fix: Revert changes in "looksLikeSelector" method.
+
+0.52.3 / 2015-09-04
+===================
+
+ * Fix: Another parsing regression.
+
+0.52.2 / 2015-09-03
+===================
+
+ * Fix: A parsing regression.
+
+0.52.1 / 2015-09-03
+===================
+
+ * Fix: Correct line numbers in error messages for files with CSS comments.
+ * Fix: Better absolute urls detection.
+ * Fix: Added type assertions to "substr", "split" and "replace" bifs.
+ * Fix: Atrules parsing with a block at a new line.
+ * Fix: Bug with commented indented lines at the end of a file.
+ * Fix: Stylus error messages for Node 0.12+.
+ * Fix: A bug with arguments cloning.
+
+0.52.0 / 2015-07-19
+===================
+
+ * Feature: new url resolver without url checks (`--resolve-url-nocheck`).
+ * Feature: New option to json bif ("leave-strings").
+ * Feature: New option to json bif ("optional").
+ * Feature: Adding utf-8 charset to inline sourcemap.
+ * Feature: allow inline CSS comments inside value.
+ * Fix: shouldn't fail to compile in strict mode, #1923.
+ * Fix: Paths should be normalized for windows support, #1954.
+ * Fix: Proper parsing of selector groups with placeholder and color-like ID.
+ * Fix: Proper import loop detection.
+ * Fix: Correct output of namespaces and charsets inside imports.
+ * Fix: Indented comments shouldn't cause errors.
+ * Fix: Proper way of parsing lists in "convert" bif.
+ * Fix: Proper comma escaping in an object interpolation.
+ * Fix: Allow no whitespace between keyframes name and the following curly brace.
+
+0.51.1 / 2015-04-28
+===================
+
+ * Fixed `;` at the end of blockless unknown at-rules.
+ * Fixed float units convertion by `convert` bif.
+
+0.51.0 / 2015-04-23
+===================
+
+ * Added support for cascading extend.
+ * Added "transparent" as a named color.
+ * Added support for blockless unknown at-rules.
+ * Made math more strict.
+ * Fixed bug with extending nested placeholder selectors inside MQ.
+ * Fixed imports inside `@media` blocks.
+ * Fixed url resolver to consider `--out` options.
+ * Fixed parsing of multiple "else if" statements.
+ * Fixed an edge case with recursive extend.
+ * Fixed regression with nested media queries.
+ * Fixed parsing of nested comments.
+ * Fixed checking paths overlap if 'dest' is a function in middleware.
+
+0.50.0 / 2015-02-05
+===================
+
+ * Added `!optional` directive for extending, #1757.
+ * Added `selector-exists` bif, #1758.
+ * Added `remove` bif for removing items from hashes.
+ * Added optional recursive hash merging, #1771.
+ * Added optional (`--hoist-atrules` flag) `@import` and `@charset` hoisting.
+ * Added a way to output to specific file path with CLI, #1800.
+ * Fixed regression with using `@media` inside `+cache`.
+ * Fixed `resolve-url` for hash urls, #1778.
+ * Fixed `mix` bif for differently transparent colors, #1792.
+ * Fixed bug with postfix `&` without comma.
+ * Fixed incorrectly imported functions defined in other files with nested @require.
+ * Fixed duplicated selectors when extending into placeholders with MQ.
+ * Fixed `filter: contrast()` error.
+ * Fixed the cloning of cached nodes.
+ * Fixed incorrect filenames included in source maps, #1812.
+ * Fixed stripping of unsuppressed comments from nested blocks.
+ * Fixed build error for multiple files, #1813.
+ * Fixed error handling slightly.
+ * Fixed (throwing error) edge case of watching and printing at the same time, #1798.
+ * Fixed watch to log to std.err, #1796.
+ * Fixed indent in complex rules at CSS to Stylus conversion, #1808.
+
+0.49.3 / 2014-11-06
+===================
+
+ * Fixed regression with `block` keyword inside block mixin.
+
+0.49.2 / 2014-10-14
+===================
+
+ * Fixed regression #1727 + small fixes for #1717.
+ * Fixed nested selectors when using nested and bubbled media queries.
+ * Fixed issue when mixin's block is used as part of a property value.
+ * Fixed hardcoded `.styl` extension from CLI (added `extname` arg).
+
+0.49.1 / 2014-09-24
+===================
+
+ * Fixed an output order of nested media queries.
+ * Fixed regression with cached nodes.
+ * Fixed support for `Woff2` and `WebP` mime-tipes, #1699.
+
+0.49.0 / 2014-09-22
+===================
+
+ * Added a way to use plugins in stylus.render options, #1697.
+ * Added LRU for memory caching.
+ * Now returning literal CSS on parser error when `--resolve-url` is set.
+ * Now not showing JS stack trace for stylus' `error()` calls.
+ * Fixed inconsistent source maps' field orders.
+ * Fixed bug with calling functions inside an inline loop.
+ * Fixed bug with nested media queries inside a mixin.
+ * Fixed bug with extending nested selector inside placeholder selector.
+ * Fixed bug with alpha variable for hsla/rgba.
+ * Fixed extending of rules inside unknown at-rules.
+ * Fixed incorrect merging of media queries using variables.
+ * Fixed bubbling for `@keyframes`.
+ * Fixed incorrect `@supports` parsing.
+ * Fixed `url()` support for `@namespace`.
+ * Fixed incorrect filename and column information for cached nodes.
+ * Fixed `--sourcemap-base` to be ignored when `--out` is present.
+ * Fixed outputting sourcemap log message when `--print` was present.
+
+0.48.1 / 2014-08-21
+===================
+
+ * Fixed sourcemap paths when `--out` flag is present, #1668.
+ * Fixed the naming convention for maps: `.styl.map` => `.css.map`, #1668.
+
+0.48.0 / 2014-08-20
+===================
+
+ * Added basic sourcemaps support, #1655.
+ * Added info on columns for sourcemaps and better error reporting.
+ * Added `globals` and `functions` keys to options object in JS API, #1653.
+ * Added `rebeccapurple` named color.
+ * Added `unicode-range` support (#1648).
+ * Changed the behaviour of adding percents together to the more sane one, #1664.
+ * Fixed bug with property lookup inside mixin block (#1645).
+ * Fixed a bug with nested media queries inside mixins (#1643).
+ * Fixed an `@extend` inside `@media` queries with multi-level selectors (#1658).
+ * Fixed bug with cloning of an interpolated selector with comma (#1660).
+ * Fixed bug with nested media queries in conditionals.
+ * Fixed a bug with cached imports (#1641).
+ * Fixed `@css` literal that generated `u+0085` characters instead of newlines (#1663).
+ * Fixed escaped comma (`\,`) inside hashes (#1666).
+ * Fixed a string representation of HSLA node to preserve `%` (#1439).
+ * Fixed incorrect position of inline comments (#1597).
+ * Fixed a bug with an apostrophe and a colon in a single-line comment (#1647).
+
+0.47.3 / 2014-07-22
+===================
+
+ * Fixed support for schema-less urls inside `url()`.
+
+0.47.2 / 2014-07-19
+===================
+
+ * Fixed comma-first multiline syntax, #1634.
+ * Fixed hsla arguments for different color functions, #1619.
+ * Fixed Bug with @media and placeholder selectors, #1625.
+ * Fixed bug with nested media queries, 1620.
+ * Fixed broken URL parsing for source and destination paths, #1613.
+
+0.47.1 / 2014-07-02
+===================
+
+ * Fixed treatment of unknown pseudo-elements, #1608.
+ * Fixed unit expression precedence error, #1611.
+
+0.47.0 / 2014-07-01
+===================
+
+ * Added support for anonymous functions, #1580.
+ * A lot of better color functions, #1526:
+ * Added support for two arguments for `hsla`.
+ * Added component setters (`red`, `hue`, `alpha` etc.).
+ * Added `luminosity` bif.
+ * Added `blend` bif.
+ * Added `contrast` bif.
+ * Added `transparentify` bif.
+ * Added `list-separator` bif, #1576.
+ * Added symlinks support to CLI, #1577.
+ * Added idents and units coercion, #1605.
+ * Fixed `@keyframes` parsing issue.
+ * Fixed parse error when `{` is on a new line in at-rules.
+ * Fixed an issue with multiline parsing.
+ * Fixed another issue with cached imports, #1587.
+ * Fixed illegal unary "%", missing left-hand operand, #1586.
+ * Reverted #1527.
+
+0.46.3 / 2014-06-09
+===================
+
+ * Fixed parse error, #1582.
+
+0.46.2 / 2014-06-04
+===================
+
+ * Fixed regression with double writing of transparent mixin value, #1574.
+
+0.46.1 / 2014-06-04
+===================
+
+ * Fixed regression with a root reference in interpolated selectors, #1573.
+
+0.46.0 / 2014-06-03
+===================
+
+ * Added support for nested media queries, #1540.
+ * Added `convert` built-in function, #1545.
+ * Added negative index values support for subscripts, #1564.
+ * Add short-circuit evaluation for logical operators, #1532.
+ * Fixed the dropped commas in splat arguments, #1525.
+ * Fixed double-writing the `@media` and other at-rules in mixins, #1535.
+ * Fixed unit expression precedence error, #1537.
+ * Fixed comments inside the property expressions, #1538.
+ * Fixed handling of the `@css` and `unquote` inside groups, #1527.
+ * Fixed incorrect line numbers on errors, #1543.
+ * Fixed import cloning with cache, #1548.
+ * Fixed cloning to preserve `property.literal`, #1558.
+ * Fixed bifs arguments cloning bug, #1560.
+ * Fixed bug with nested interpolated selectors with a comma, 1568.
+ * Fixed `current-property` ignored in property lookup, #1565.
+ * Fixed `current-property`'s value to be evaluated in the right context, #1562.
+ * Fixed spaces and comments inside a hash declaration, #1554.
+ * Fixed aliases for transparent mixins, #1557.
+ * Fixed compilation fail when 'dest' path doesn't end with '/', #1541.
+ * Fixed bug with CSS to Stylus `@keyframes` converting, #1549.
+
+0.45.1 / 2014-05-16
+===================
+
+ * Fixed regression with `@require` and globbed paths inside functions, #1529.
+
+0.45.0 / 2014-05-11
+===================
+
+ * Added support for more CSS-like syntax variants: indented code blocks, closing curly brace on the same line with props etc (as now ignoring meaningless tokens while parsing), #1506.
+ * Added support for block-level `@import` and `@require`, #1495.
+ * Added hash values support in `@media`, #1504.
+ * Added coercion for pt units, #1483.
+ * Added a way to escape `\` in a tag name, #1487.
+ * Fixed trailing spaces and comments in the selector groups, #1499.
+ * Fixed comments in the selector parts (now ignoring them), #1517.
+ * Fixed bug with url string having a protocol, #1510.
+ * Fixed bug with `@scope` and complex selectors, #1505.
+ * Fixed the recursion with the `display: block` inside block mixins, #1515.
+ * Fixed bug with current-property and block mixins, #1512.
+ * Fixed bug with complex selectors in conditionals, #1500.
+ * Fixed bug with `@media` bubbling and conditionals, #1518.
+ * Fixed bug with newlines and comments in conditionals, #1520.
+ * Fixed bug with the variable in the first line of mixin, #1502.
+ * Fixed but with the variable right after iterating over an empty list, #1503.
+ * Fixed bug with built-in function calls inside a hash assignment, #1488.
+ * Fixed bug with `*` selector first in the group, #1498.
+ * Fixed unnecessary bubbling for `@keyframes`, #1490.
+ * Fixed bug with undefined `filename` on keyframes, #1485.
+
+0.44.0 / 2014-04-23
+===================
+
+ * Major performance tuning and basic caching support, almost ⨉2 build time boost, #1428.
+ * Added basic support for most at-rules, #1464.
+ * Added `+cache` built-in mixin for caching the result of functions and mixins into placeholders, #1466.
+ * Added `current-media()` bif that returns the string for the current media query, #1466.
+ * Added `called-from` property in functions that contains the names of the functions from the call stack till the current one, #1466.
+ * Added a way to escape commas and parent references inside selectors, #1413.
+ * Removed the never needed `-ms-` prefix for keyframes.
+ * Fixed rendering of multiple selectors inside interpolation, #1413.
+
+0.43.1 / 2014-04-07
+===================
+
+ * Fixed regression with `only` keyword, #1460.
+
+0.43.0 / 2014-04-05
+===================
+
+ * Added better support for media queries — interpolations, expressions in values and more, #1453.
+ * Added `define` bif, #1382.
+ * Add `--prefix` option for CLI and `+prefix-classes` mixin, #1420.
+ * Added `--deps` flag to list the dependencies of the compiled file and stylus.deps function, #1429.
+ * Added support for multiple selectors in `@extend`, #1419.
+ * Added the support of the hash objects to `define`, #1444.
+ * Fixed some floating point problems in maths, #1339.
+ * Fixed the lost decimal part of units can when coercing from a string, #1387.
+ * Fixed bug with hash lookup when a property name is the same as a name of local variable, #1433.
+ * Fixed bug with the `+=` operator with strings, #1423.
+ * Fixed a bug in recompiling of the files with `--watch`, #1435.
+ * Fixed `default` value for `cursor` property (Temporally remove `default` from the pseudo-classes list), #1438.
+ * Fixed the rendering of empty `@keyframes`, #1442.
+ * Fixed parseColor for single digit integers in rgb(a) strings, #1447.
+ * Fixed wrong named colors, #1450.
+
+
+0.42.3 / 2014-03-03
+==================
+
+ * Fixed bug with pseudo-elements as part of the nested selector with a class, #1415.
+ * Ignoring comments in REPL, #1390.
+ * Fixed bug with print of the line numbers when node has empty `nodes` array, #1412.
+ * Fixed bug with first argument for defaulted arguments, #1407.
+ * Fixed compression of blocks with nested rules, #1396.
+ * Fixed bug with importing of files with `.css` in the dirname, #1385.
+ * Fixed eaten whitespace after selector with a keyword, #1383.
+
+0.42.2 / 2014-01-30
+==================
+
+ * Added support for reverse ranges.
+ * Fixed bug with an expression as arguments of function call.
+ * Fixed bug with property lookup inside `@block`.
+ * Fixed bug with parsing an attribute selector.
+ * Fixed bug with `add-property` inside function call.
+ * Fixed compiling to a directory with `.styl` in the name.
+ * Fixed bug with missed `mtime` in middleware imports.
+ * Fixed an incorrect line number in multi-line group selectors.
+ * Fixed incorrect file path in win32 debug info, #1353.
+
+0.42.1 / 2014-01-19
+==================
+
+ * Fixed color functions to fallback into literal CSS functions, #1340.
+ * Fixed `@import` globbing with `--watch`.
+ * Fixed Bug with units as part of the selector.
+ * Fixed compiling with UTF-8 BOM.
+ * Added Icons, and reorganization of graphics folder, #1346.
+
+0.42.0 / 2014-01-06
+==================
+
+ * Added `@require`, #1287.
+ * Added more lookup patterns for the `@import` and `@require`. Support Node.js modules, #1316.
+ * Added file globbing, #1306 and #1013.
+ * Added root reference, part of #1240.
+ * Added basic support for `@block` entity, #1290.
+ * Added string support for `selector()` bif, #1279.
+ * Added options as an optional argument for `use()` bif, #1297.
+ * Added some new colors shortcuts: grayscale, complement, tint & shade, #1308.
+ * Fixed broken @media queries in logic blocks, #1289.
+ * Fixed function call inside block mixin is on the `block` variable pass, #1285.
+ * Fixed bug with `if` and color in array check, #1301.
+ * Fixed bug with list of color keywords as default argument, #1294.
+ * Fixed bug with property lookup in @media queries, #1315.
+ * Now using `css-parse` instead of `CSSOM` for converting CSS -> Stylus, #1307.
+
+0.41.3 / 2013-12-12
+==================
+
+ * Fixed regression for `selector`, #1278.
+
+0.41.2 / 2013-12-10
+==================
+
+ * Fixed property lookup in blocks, #1273.
+ * Fixed @extend in blocks, #1274.
+ * Fixed if-else-if-else, #1276.
+
+0.41.1 / 2013-12-08
+==================
+
+ * Fixed inaccessible local variable inside conditional which is inside a selector, #1267.
+ * Fixed some minor issues with `selector()` interpolation, #1259.
+ * Fixed missing hashes in base64 converted urls, #1263.
+ * Fixed conditionals inside `@font-face`, #1268.
+
+0.41.0 / 2013-11-30
+==================
+
+ * Added basic [block mixins](http://stylus-lang.com/docs/mixins.html#block-mixins) (`+foo`) with block interpolation (`block`), #1223.
+ * Added [`selector()` bif](http://stylus-lang.com/docs/selectors.html#selector-bif), #1249.
+ * Added [hash interpolation to blocks](http://stylus-lang.com/docs/hashes.html#interpolation), #1202.
+ * Fixed parent reference in root context from returning `&`.
+ * Fixed bug with double writing media blocks, 1ed44a81
+ * Fixed a lot of regressions after hashes, #1230, #1236, #1237, #1248.
+
+0.40.3 / 2013-11-16
+==================
+
+ * Fixed current-property to be available in function evaluation context, #1211.
+ * Fixed another regression, #1215.
+
+0.40.2 / 2013-11-12
+==================
+
+ * Fixed regression after the #1185, #1207.
+
+0.40.1 / 2013-11-12
+==================
+
+ * Fixed assign to hashes using dot, #1201.
+ * Fixed regression from the #1185.
+ * Fixed precedence of the subscript operator, #1189.
+ * Fixed imports in functions, #1192.
+ * Fixed compressing of time units, #1204.
+
+0.40.0 / 2013-11-05
+==================
+
+ * Allow multiple `end` event handlers + optional result css modification, #1180.
+ * Added Support for proper hashes in json config, #1186.
+ * Allow functions accept object literal as an argument, #1184.
+ * Fixed another infinite loop (`a[` etc.), #1187.
+ * Fixed bug in hashes subassigns with functions, #1181.
+ * Fixed "is" attribute selectors fail, #1185.
+
+0.39.4 / 2013-11-03
+==================
+
+ * Fixed another regression after #1150, #1183.
+
+0.39.3 / 2013-11-01
+==================
+
+ * Fixed parse error in conditional statement without `()`, #1178.
+
+0.39.2 / 2013-10-31
+==================
+
+ * Fixed other regressions after #1150, #1175.
+
+0.39.1 / 2013-10-30
+==================
+
+ * Fixed regression after #1150, #1172.
+
+0.39.0 / 2013-10-30
+==================
+
+ * Added basic hashes support, #1150.
+ * Allow to inject Evaluator via Renderer's options, #1149.
+ * Fixed infinite loop case, #1147.
+ * Fixed Bug with `else if match`, #1154.
+ * Fixed schemaless absolute urls for `url`, #1148.
+ * Fixed urls in windows 7 for `--relative-url`, #1156.
+ * Fixed calculation inside `calc` CSS function, #1133.
+ * Fixed parsing shorthand colors from json config, #1158.
+
+0.38.0 / 2013-09-24
+==================
+
+ * Fixed `push` not to modify the first element of another array, #1118.
+ * Fixed property lookup from mixins, #1127.
+ * Fixed support for `src` and `dest` in middleware, started tests for middleware #1143.
+ * Fixed `--resolve-url` that removed tails from urls, #1126.
+ * Fixed mime type for `.woff`, #1128.
+ * Fixed `.toString` for undefined functions, #1119.
+ * Fixed path overlap for non-string dest, #1115.
+ * Fixed `path.resolve` for nonœ-true resolveURL, #1116.
+ * Fixed sync return in `stylus.render()`, #1138.
+ * Fixed duplicate calls from `this.calling`, #1122.
+
+0.37.0 / 2013-08-19
+==================
+
+ * Added optional params to the json bif, #1102.
+ * Added `--print` option to print CSS to stdout, #1108.
+ * Fixed json bif to return literals for colours, #875.
+ * Fixed include of the css files when `--resolve-url` is on, #1099.
+ * Fixed error in negating variables, #1101.
+ * Fixed bug in `p` function, #1111.
+ * Fixed tests under windows, #1105.
+ * Fixed regression after #1094, #1113.
+ * Fixed regression after #983, #1098.
+
+0.36.1 / 2013-08-06
+==================
+
+ * Fixed regression after #1090, #1094.
+
+0.36.0 / 2013-08-01
+==================
+
+ * Added `substr`, `replace` and `split` bifs, #1088.
+ * Added possibility to provide functions to src and dest, #930.
+ * Added explicit expose for events, #898.
+ * Added blocking and css manipulation possibility within 'end' event, #923.
+ * Fixed unneeded code for imports, #1090.
+ * Fixed mtime for literal imports, #983.
+ * Fixed empty string as possible quote value for string node, #956.
+ * Fixed non-symmetrical src and dest paths in middleware, #1037.
+
+0.35.1 / 2013-07-29
+==================
+
+ * Fixed the support for progressive JPEGs in `image-size`, #1087.
+
+0.35.0 / 2013-07-29
+==================
+
+ * Added jpeg and svg support to image-size, #1083.
+ * Added `tan` trigonometric function, also `sin` and `cos` now understand `deg` units.
+ * Added fonts to data URI `url()` mimes, also the list of mimes is now configurable, #841, #1046.
+ * Added base conversion for numbers, #714.
+ * Fixes extends from nested mixins, #1084.
+ * Fixes coercion error, #1082.
+
+0.34.1 / 2013-07-12
+==================
+
+ * Fixed the regression after #865.
+
+0.34.0 / 2013-07-12
+==================
+
+ * Added built-in `use()` function to extend Stylus from inside of `.styl` files, #788.
+ * Added optional resolver of relative urls, #1070.
+ * Fixes incorrect imports lookup inside function call, #1069.
+ * Fixes a lot of issues with trailing symbols in comments, #865.
+ * Fixes brace on a newline CSS code style.
+ * Some minor fixes to tmbundle: #975, #1033, #1034.
+
+0.33.1 / 2013-06-30
+==================
+
+ * Fixed the `exports.version` to always show an actual one.
+
+0.33.0 / 2013-06-30
+==================
+
+ * Added extendable placeholder selectors, #1014.
+ * Added optional argument to `image-size` function, #812.
+ * Fixed inline comments after selectors, #862.
+ * Fixed a bug with empty block in CSS syntax, #712.
+
+0.32.1 / 2013-02-27
+==================
+
+ * fix issue on Windows where absolute path starts with two backslashes
+ * fix extends within a loop.
+ * fix: don't try to read absolute urls
+
+0.32.0 / 2013-01-04
+==================
+
+ * add sync api for #230 #691 #151
+ * fix unsuppressed comments in nested imports
+ * fix #911 Percentage calculation value not copied
+
+0.31.0 / 2012-11-24
+==================
+
+ * add support for rounding precision
+ * fix extends with parent reference. Closes #879
+ * fix importing of files with ".css" in the dirname
+ * fix #619 Support slash in media
+ * fix #819 Extends generate duplicate selectors
+ * fix #807 directory with `.styl` in the name and local install of stylus
+ * fix #814 Add property function with media query
+ * fix #828 Add 'x' unit for image-set (synonym to dppx).
+ * fix #834 Percentage calculation not used when value is expression
+
+0.30.1 / 2012-10-17
+==================
+
+ * fix mozdocument nodes not getting visited during imports. Fixes #853
+
+0.30.0 / 2012-10-15
+==================
+
+ * add @-moz-document to the lexer and parser. Fixes #436
+ * add --import for issue #485
+ * fix @property lookup when a sibling is null
+ * fix 'limit' file size option that was broken in 61a2cf
+ * fix pseudo-selector properties. Closes #808
+
+0.29.0 / 2012-08-15
+==================
+
+ * add more features to the textmate bundle [paulmillr]
+ * add `json()` BIF for loading variables from JSON files [geddesign]
+ * fix for #790 allow trailing colon, comma etc in // comments [geddesign]
+
+0.28.2 / 2012-07-15
+==================
+
+ * fix extend in mixin. Closes #747, #748 and #751
+
+0.28.1 / 2012-07-07
+==================
+
+ * fix __@media__ cloning
+
+0.28.0 / 2012-07-06
+==================
+
+ * add suffix to `basename()` BIF
+ * add `pathjoin()` BIF
+ * add `basename()` BIF
+ * add `dirname()` BIF
+ * add `extname()` BIF
+ * fix `@extend` in mixin. Closes #638
+
+0.27.2 / 2012-06-19
+==================
+
+ * Adding list of all css3 units
+ * Fixed CSS to stylus conversion `!important` support
+ * Fix last rule being ignored if empty indents at the end of the file
+ * Fixes #425: Compiler hangs when the last property isn't followed by semicolon at the end of the document
+ * Fixes #435: Can't concat array inside url()
+
+0.27.1 / 2012-05-28
+==================
+
+ * Fixes #698: incorrect function call within for with named argument [Tõnis Tiigi]
+ * Fixes #676. Stylus incorrectly imports the .css files that are not in the same folder as the processed .styl file
+
+0.27.0 / 2012-05-10
+==================
+
+ * Added `add-property()` mixin support [jasonkuhrt]
+ * Added % support for `fade-in()` and `fade-out()` [jasonkuhrt]
+ * Added % support to `rgba()` [jasonkuhrt]
+ * Fixed `.import()` - previously failed to mixin
+
+0.26.1 / 2012-05-07
+==================
+
+ * any node. Closes #657
+
+0.26.0 / 2012-04-27
+==================
+
+ * Added BIF shift [gravof]
+ * Added BIF pop [gravof]
+ * Added support for __@media__ bubbling properties [Ian MacLeod]
+ * Changed: strip trailing zeros [gravof]
+
+0.25.0 / 2012-04-03
+==================
+
+ * Added `make test-cov`
+ * Added temporary multiline support.
+ * Added: allow for '%' unit type in the 'alpha' of rgba and hsla [jasonkuhrt]
+ * Updated cssom dep
+ * Removed growl dep. Closes #583
+ * Fixed BIF retval coercion
+ * Fixed issue #390, nested @media
+
+0.24.0 / 2012-02-16
+==================
+
+ * Added `mix()` BIF (docs needed)
+ * Added: cast return values from js functions
+ * Fixed binops in mixin selectors. Closes #566
+ * Fixed `opposite-position()` pass through "center"`
+
+0.23.0 / 2012-02-02
+==================
+
+ * Added `Renderer` "end" event
+ * Added: cast return value from js-functions
+ * Cleaned up documentation grammar etc [Zearin]
+
+0.22.6 / 2012-01-20
+==================
+
+ * Fixed postfix conditional cloning. Closes #535
+ * Fixed idents prefixed with several hyphens. Closes #536
+ * Fixed up the TextMate bundle syntax [ianstormtaylor]
+
+0.22.5 / 2012-01-16
+==================
+
+ * Fixed underscore in function identifier. Closes #524
+
+0.22.4 / 2012-01-11
+==================
+
+ * Fixed __@extends__ inheritance bug. Closes #499
+ * Fixed 'lineno' global leak due to missing `new` [teppeis]
+
+0.22.3 / 2012-01-11
+==================
+
+ * Fixed `--watch` working on windows with a temporary hack [dciccale]
+ * Fixed __@extend__ with no properties. Closes #498
+
+0.22.2 / 2012-01-08
+==================
+
+ * Added: allow newlines in place of commas for keyframes
+ * Fixed: skip comment newlines between keyframe positions. Closes #504
+
+0.22.1 / 2012-01-08
+==================
+
+ * Fixed __@keyframes__ support for multiple values. Closes #503
+
+0.22.0 / 2012-01-04
+==================
+
+ * Added `@extend`. Closes #149
+ * Added more syntax highlighting to TextMate bundle [paulmillr]
+ * Added `keys(pairs)` and `values(pairs)` BIFs
+ * Added JavaScript object coercion support
+ * Added JavaScript -> Stylus node coercion utilities
+ * Fixed `.define()`ing of functions
+ * Fixed `stylus(1)` repl for 0.6.x
+
+0.21.2 / 2011-12-22
+==================
+
+ * Fixed literal / within function call. Closes #432
+
+0.21.1 / 2011-12-20
+==================
+
+ * Fixed space after `)` in selectors. Closes #449
+
+0.21.0 / 2011-12-17
+==================
+
+ * Added unit casting, ex: `(n * 5)%`. Closes #285
+
+0.20.1 / 2011-12-16
+==================
+
+ * Added global leak detection to the test suite
+ * Fixed two globals
+ * Fixed operator ident regression. Closes #292
+
+0.20.0 / 2011-12-11
+==================
+
+ * Added `--include-css` to literally include imported CSS. Closes #448
+ * Fixed coercion bug with expression. Closes #480
+
+0.19.8 / 2011-12-01
+==================
+
+ * Fixed middleware `mkdir -p` support
+
+0.19.7 / 2011-11-30
+==================
+
+ * Fixed `or` binop regression. Closes #475
+
+0.19.6 / 2011-11-30
+==================
+
+ * Fixed current-property with commas. Closes #472
+
+0.19.5 / 2011-11-28
+==================
+
+ * revert noop visitor methods, this breaks extensions
+
+0.19.4 / 2011-11-28
+==================
+
+ * Fixed css-style __@page__ support
+ * Fixed __@page__ block evaluation
+ * Fixed __@font-face__ block evaluation [Suor]
+
+0.19.3 / 2011-11-17
+==================
+
+ * Added "include css" setting (need docs) to literally include imported css. Closes #448
+ * Added EOL escape. Related to #195
+ * Fixed tab support in lexical analysis (trailing colors etc). Closes #460
+
+0.19.2 / 2011-11-09
+==================
+
+ * Fixed "in" within selectors. Closes #458
+
+0.19.1 / 2011-11-08
+==================
+
+ * Added `spin()` BIF (same as `color + 50deg` etc)
+ * Removed "sys" require()s for 0.6.x
+ * Fixed sibling property lookup bug. Closes #452
+ * Fixed: retain original quote for strings
+
+0.19.0 / 2011-10-26
+==================
+
+ * Added property lookup bubbling support. Closes #446
+
+0.18.1 / 2011-10-26
+==================
+
+ * Added "indent spaces" compiler setting. Closes #445
+ * Allow node > 0.4.x < 0.7.0
+ * Fixed: allow function execution within @imports
+
+0.18.0 / 2011-10-21
+==================
+
+ * Added #n support (#e -> #eeeeee). Closes #430
+ * Added #nn support (#ef -> #efefef)
+ * Added support for rgb percentages.
+ * Fixed property rendering in blocks. Closes #440
+
+0.17.0 / 2011-09-30
+==================
+
+ * Added `@scope <selector>` feature to scope all subsequent selectors
+ * Added list equality to the `!=` operator
+ * Added list equality to the `==` operator
+ * Added mkdir -p support to the middleware
+ * Changed: `!` coerces expression not the first value
+ * Fixed Ternary boolean coercion. Closes #420
+ * Fixed __@font-face__ __@import__ regression. Closes #418
+
+0.16.0 / 2011-09-26
+==================
+
+ * Added `mkdir -p` support to the middleware
+ * Added `@import url(string)` support. Closes #352
+ * Added `fade-in()` and `fade-out()` BIFs
+ * Adding prefixes for Opera and IE
+ * Fixed comments trailing __@media__. Closes #415 [guillermo]
+ * Fixed: Output from --help in stylus executable cut-off half way through
+ * Changed: treat -/+ operations with percentages as lighten()/darken().
+Closes #401
+
+0.15.4 / 2011-09-14
+==================
+
+ * Fixed `String#coerce()` for Expressions
+
+0.15.3 / 2011-09-14
+==================
+
+ * Added `-U, --inline` to stylus(1)
+ * Added `rem` support. Closes #395
+ * Fixed __@charset__ semi-colon. Closes #400
+ * Fixed infinite loop in `Parser#function()`. Closes #393
+
+0.15.2 / 2011-09-06
+==================
+
+ * Added alias `:=` of `?=`. Closes #389
+ * Removed auto-prefixing of pseudo element selectors. Closes #385
+ * Changed: when left-hand operand has no unit assign the right
+ * Fixed __@keyframes__ with __@import__ regression. Closes #372
+ * Fixed css __@import__ within blocks regression. Closes #388
+ * Fixed unwrapping of property args expression. Closes #379
+ * Fixed __@prop__ access scope issue, use closet block, not current
+ * Fixed __@font-face__. Closes #375
+
+0.15.1 / 2011-08-18
+==================
+
+ * Added pseudo-element vendor expansion support
+ * Added `@keyframe` expansion support. Closes #293
+ * Added support for arbitrary `@-VENDOR-keyframes` support
+ * Added support for `@property` mixin property access Closes #363
+ * Added `/*!` support to comments to disable suppression
+ * Changed: allow uses to append `.styl` when importing. Closes #366
+ * Fixed paren matching issue. Closes #368
+ * Fixed windows absolute path checking Added `utils.absolute(path)`
+ * Fixed `Ident#clone()` with `.property` flag
+ * Fixed evaluation of expression when using @name. Closes #361
+ * Fixed `path.join()` usage in `utils.lookup()`. Closes #356
+ * Fixed space after comment regression. Closes #360
+
+0.15.0 / 2011-08-15
+==================
+
+ * Adding `Renderer#get(option)`
+ * Added the ability to reference property values with `@<name>`. Closes #344
+ * Changed comment output. css-style multi-line comments are preserved
+ * Fixed issue with bools in selectors. Closes #280
+
+0.14.0 / 2011-08-10
+==================
+
+ * Added firebug original file / line number mapping [parallel]
+ * Added support for `#rgba` and `#rrggbbaa` color formats
+ * Changed: fix alpha to a scale of 2
+ * Fixing function param check to allow for empty function arguments
+
+0.13.9 / 2011-08-04
+==================
+
+ * Fixed `lighten()` BIF 'lighten by %' function push color closer to white [cwolves]
+ * Fixed cli plugin usage absolute paths, don't prepend the CWD [cpojer]
+ * Renaming 'import' to '_import' because import is a reserved word in node v0.5
+
+0.13.8 / 2011-08-01
+==================
+
+ * Added `PI` and `-math-prop(name)`
+ * Added `cos()` and `sin()`
+ * Added support for __SVG__ data URIs [mhemesath]
+ * Rename variable "import" to "imported" [eegg]
+
+0.13.7 / 2011-07-15
+==================
+
+ * Added `js(str)` BIF
+ * Fixed reserved keyword `import` with `imported`
+
+0.13.6 / 2011-07-12
+==================
+
+ * Added `@-webkit-keyframes` support. Closes #307
+ * Added gedit language-spec
+ * Changed: optional `growl` dep for stylus(1)
+ * Changed: `require("stylus")` instead of `../` for the mac app integration
+
+0.13.5 / 2011-06-27
+==================
+
+ * Fixed middleware handling of new and removed `@import` s [brandonbloom]
+
+0.13.4 / 2011-06-22
+==================
+
+ * Added __Compile and Display CSS__ TextMate command (⌘B) [Daniel Gasienica]
+ * Fixed caching behavior for recompilation of files with changed imports [Brandon Bloom]
+
+0.13.3 / 2011-06-01
+==================
+
+ * Added padding for error linenos so they line up
+ * Improved unary op error messages
+ * Improved invalid `@keyframes` ident error msg
+ * Fixed HSLA regression for operations resulting in a bool. Closes #274
+ * Fixed `arguments` issue with excluding defaults. Closes #272
+
+0.13.2 / 2011-05-31
+==================
+
+ * Fixed colors after `url()` call regression. Closes #270
+
+0.13.1 / 2011-05-30
+==================
+
+ * Fixed colors in `url()`. Closes #267
+ * Fixed selector without trailing comma containing selector token. Closes #260
+
+0.13.0 / 2011-05-17
+==================
+
+ * Added `-u, --use PATH` flag for utilizing plugins
+ * Fixed `hsla.clampDegrees()` with negative values [Bruno Héridet]
+
+0.12.4 / 2011-05-12
+==================
+
+ * Added support for underscore in identifiers. Closes #247
+ * Fixed `@keyframe` block evaluation. Closes #252
+
+0.12.3 / 2011-05-08
+==================
+
+ * Fixed `0%` in `@keyframes` from becoming `0` when compressed. Closes #248
+
+0.12.2 / 2011-05-03
+==================
+
+ * Fixed issue with `^=` attr selector causing infinite loop. Closes #244
+ * Fixed multiple occurrences of `&` in selectors. Closes #243
+
+0.12.1 / 2011-04-29
+==================
+
+ * Fixed spaces around line-height shorthand. Closes #228
+ * Fixed `-{foo}` interpolation support. Closes #235
+
+0.12.0 / 2011-04-29
+==================
+
+ * Added `*prop: val` hack support (blueprint / html boilerplate etc parse fine now)
+ * Added selector interpolation support
+ * Fixed "-" within interpolation. Closes #220
+
+0.11.12 / 2011-04-27
+==================
+
+ * Added `SyntaxError` and `ParseError`
+ * Removed `stylus.parse()`
+ * Fixed error reporting. Closes #44
+
+0.11.11 / 2011-04-24
+==================
+
+ * Fixed mutation of units when using unary ops. Closes #233
+
+0.11.10 / 2011-04-17
+==================
+
+ * Fixed regression. Closes #229
+
+0.11.9 / 2011-04-15
+==================
+
+ * Fixed issue with large selectors spanning several lines
+
+0.11.8 / 2011-04-15
+==================
+
+ * Added support for `Renderer#define(name, node)` to define a global
+
+0.11.7 / 2011-04-12
+==================
+
+ * Added `Renderer#use(fn)`. Closes #224
+ * Improved `utils.assertType()` error message; include param name
+
+0.11.6 / 2011-04-12
+==================
+
+ * Fixed: node.source and node.filename are writable
+
+0.11.5 / 2011-04-12
+==================
+
+ * Added / employed `Null#isNull`
+ * Added / employed `Boolean#is{True,False}`
+ * Removed all uses of `instanceof`
+ * Removed all equality checks between singleton nodes
+
+0.11.4 / 2011-04-10
+==================
+
+ * Added `Arguments#clone()`
+ * Added `push()` / `append()`
+ * Added `unshift()` / `prepend()` BIFs
+
+0.11.3 / 2011-04-08
+==================
+
+ * Fixed: keyword args previously not evaluated
+ * Fixed: subpixel support
+ * Fixed bug preventing combinators (and other ops) in `@media` blocks. Closes #216 [reported by jsteenkamp]
+
+0.11.2 / 2011-04-06
+==================
+
+ * Added `Renderer#include(path)`. Closes #214
+ * Fixed `@import` path resolution bug. Closes #215
+ * Fixed optional keyword arg bug. Closes #212
+
+0.11.1 / 2011-04-01
+==================
+
+ * Fixed regression preventing commas from outputting
+
+0.11.0 / 2011-04-01
+==================
+
+ * Added `HSLA#add(h,s,l,a)`
+ * Added `HSLA#sub(h,s,l,a)`
+ * Added `RGBA#add(r,g,b,a)`
+ * Added `RGBA#sub(r,g,b,a)`
+ * Added `RGBA#multiply(n)`
+ * Added `RGBA#divide(n)`
+ * Added `HSLA#adjustHue(deg)`
+ * Added `HSLA#adjustLightness(percent)`
+ * Added `HSLA#adjustSaturation(percent)`
+ * Added `linear-gradient()` example
+ * Added `s(fmt, ...)` built-in; sprintf-like
+ * Added `%` sprintf-like string operator, ex: `'%s %s' % (1 2)`
+ * Added `current-property` local variable
+ * Added `add-property(name, val)`
+ * Added the ability for functions to duplicate the property they are invoked within
+ * Added `[]=` operator support. Ex: `fonts[1] = arial`, `nums[1..3] = 2`
+ * Added `-I, --include <path>` to stylus(1). Closes #206
+ * Added support for `50 + 25% == 75`
+ * Added support for `rgba + 25%` to lighten
+ * Added support for `rgba - 25%` to darken
+ * Added support for `rgba - 25` to adjust rgb values
+ * Changed: null now outputs "null" instead of "[Null]"
+ * Fixed hsl operation support, all operations are equivalent on rgba/hsla nodes
+ * Fixed degree rotation
+
+0.10.0 / 2011-03-29
+==================
+
+ * Added keyword argument support
+ * Added `Arguments` node, acts like `Expression`
+ * Added `utils.params()`
+ * Added `debug` option to stylus middleware
+ * Added support for `hsl + 15deg` etc to adjust hue
+ * Added special-case for percentage based `RGBA` operations (`#eee - 20%`)
+ * Changed: right-hand colors in operations are not clamped (`#eee * 0.2`)
+ * Added support for `unit * color` (swaps operands)
+ * Fixed color component requests on the opposite node type (ex red on hsla node)
+ * Fixed `Expression#clone()` to support `Arguments`
+ * Fixed issue with middleware where imports are improperly mapped
+ * Fixed mutation of color when adjusting values
+ * Fixed: coerce string to literal
+ * Removed {`darken`,`lighten`}`-by()` BIFs
+
+0.9.2 / 2011-03-21
+==================
+
+ * Removed a `console.log()` call
+
+0.9.1 / 2011-03-18
+==================
+
+ * Fixed connect middleware `@import` support. Closes #168
+ The middleware is now smart enough to know when imports
+ change, and will re-compile the target file.
+
+ * Changed middleware `compile` function to return the `Renderer` (API change)
+
+0.9.0 / 2011-03-18
+==================
+
+ * Added `-i, --interactive` for the Stylus REPL (eval stylus expressions, tab-completion etc)
+ * Added link to vim syntax
+ * Changed `p()` built-in to display parens
+ * Changed `--compress -C` to `-c`, and `-css -c` is now `-C`
+ * Fixed: preserve rest-arg expressions. Closes #194
+ * Fixed `*=` in selector, ex `[class*="foo"]`
+ * Fixed `--watch` issue with growl, updated to 1.1.0. Closes #188
+ * Fixed negative floats when compressed. Closes #193 [reported by ludicco]
+
+0.8.0 / 2011-03-14
+==================
+
+ * Added postfix `for`-loop support.
+ Ex: `return n if n % 2 == 0 for n in nums`
+ * Added support for several postfix operators
+ Ex: `border-radius: 5px if true unless false;`
+ * Added `last(expr)` built-in function
+ * Added `sum(nums)` built-in function
+ * Added `avg(nums)` built-in function
+ * Added `join(delim, vals)` built-in function
+ * Added `Evaluator#{currentScope,currentBlock}`
+ * Added multi-line function parameter definition support
+ * Changed: `0` is falsey, `0%`, `0em`, `0px` etc truthy. Closes #160
+ * Fixed `for` implicit __return__ value
+ * Fixed `for` explicit __return__ value
+ * Fixed mixin property ordering
+
+0.7.4 / 2011-03-10
+==================
+
+ * Added `RGBA` node
+ * Added `is a "color"` special-case, true for `HSLA` and `RGBA` nodes.
+Closes #180
+ * Performance; 2.5× faster compiles due to removing use of getters in `Parser` and `Lexer` (yes, they are really slow).
+ * Removed `Color` node
+ * Fixed stylus(1) `--watch` support due to dynamic `@import` support. Closes #176
+
+0.7.3 / 2011-03-09
+==================
+
+ * Fixed: allow semi-colons for non-css syntax for one-liners
+
+0.7.2 / 2011-03-08
+==================
+
+ * Added `isnt` operator (same as `is not` and `!=`)
+ * Added support for dynamic `@import` expressions
+ * Added `@import` index resolution support
+ * Added `light()` / `dark()` BIFs
+ * Added `compress` option for Connect middleware [disfated]
+ * Changed: most built-in functions defined in stylus (`./lib/functions/index.styl`)
+ * Fixed dynamic expressions in `url()`. Closes #105
+
+0.7.1 / 2011-03-07
+==================
+
+ * Fixed connect middleware for 0.4.x
+
+0.7.0 / 2011-03-02
+==================
+
+ * Added `is` and `is not` aliases for `==` and `!=`
+ * Added `@keyframes` dynamic name support
+ * Fixed units in interpolation
+ * Fixed clamping of HSLA degrees / percentages
+
+0.6.7 / 2011-03-01
+==================
+
+ * Fixed __RGBA__ -> __HSLA__ conversion due to typo
+
+0.6.6 / 2011-03-01
+==================
+
+ * Added string -> unit type coercion support aka `5px + "10"` will give `15px`
+ * Added `warn` option Closes #152
+ Currently this only reports on re-definition of functions
+ * Added `$` as a valid identifier character
+ * Added `mixin` local variable for function introspection capabilities. Closes #162
+ * Fixed typo: `Unit#toBoolean()` is now correct
+ * Fixed interpolation function calls. Closes #156
+ * Fixed mixins within Media node. Closes #153
+ * Fixed function call in ret val. Closes #154
+
+0.6.5 / 2011-02-24
+==================
+
+ * Fixed parent ref `&` mid-selector bug. Closes #148 [reported by visnu]
+
+0.6.4 / 2011-02-24
+==================
+
+ * Fixed `for` within brackets. Closes #146
+
+0.6.3 / 2011-02-22
+==================
+
+ * Fixed single-ident selectors. Closes #142
+ * Fixed cyclic `@import` with file of the same name. Closes #143
+
+0.6.2 / 2011-02-21
+==================
+
+ * Added stylus(1) growl support when using `--watch`
+ * Added `@import` watching support to stylus(1). Closes #134
+ * Changed: stylus(1) only throws when `--watch` is not used
+ * Fixed `darken-by()` BIF
+ * Fixed `@import` literal semi-colon. Closes #140
+
+0.6.1 / 2011-02-18
+==================
+
+ * Fixed evaluation of nodes after a return. Closes #139
+
+0.6.0 / 2011-02-18
+==================
+
+ * Added `stylus(1)` direct css to stylus file conversion [Mario]
+ For example instead of `$ stylus --css < foo.css > foo.styl`
+ you may now either `$ stylus --css foo.css` or provide
+ a destination path `$ stylus --css foo.css /tmp/out.styl`.
+
+ * Added postfix conditionals. Closes #74
+ Expressive ruby-ish syntax, ex: `padding 5px if allow-padding`.
+
+0.5.3 / 2011-02-17
+==================
+
+ * Added `in` operator. `3 in nums`, `padding in props` etc
+ * Added `Expression#hash`, hashing all of the nodes in order
+ * Added tests for conditionals with braces. Closes #136
+ * Fixed ids that are also valid colors. Closes #137
+
+0.5.2 / 2011-02-15
+==================
+
+ * Fixed spaces after `}` with css-style. Closes #131
+ * Fixed single-line css-style support. Closes #130
+
+0.5.1 / 2011-02-11
+==================
+
+ * Fixed mixin property ordering. Closes #125
+
+0.5.0 / 2011-02-09
+==================
+
+ * Added `lighten-by()` BIF
+ * Added `darken-by()` BIF
+
+0.4.1 / 2011-02-09
+==================
+
+ * Added support for function definition braces
+ * Fixed issue with invalid color output. Closes #127
+
+0.4.0 / 2011-02-07
+==================
+
+ * Added css-style syntax support
+ * Fixed support for `*` selector within `@media` blocks
+
+0.3.1 / 2011-02-04
+==================
+
+ * Fixed property disambiguation logic. Closes #117
+ You no longer need to add a trailing comma when
+ chaining selectors such as `td:nth-child(2)\ntd:nth-child(3)`
+
+0.3.0 / 2011-02-04
+==================
+
+ * Added more assignment operators. Closes #77
+ `+=`, `-=`, `*=`, `/=`, and `%=`
+
+0.2.1 / 2011-02-02
+==================
+
+ * Fixed `--compress` when passing files for stylus(1). Closes #115
+ * Fixed bug preventing absolute paths from being passed to `@import`
+ * Fixed `opposite-position()` with nested expressions, unwrapping
+ * Fixed a couple global var leaks [aheckmann]
+
+0.2.0 / 2011-02-01
+==================
+
+ * Added: `url()` utilizing general lookup paths.
+ This means that `{ paths: [] }` is optional now, as lookups
+ will be relative to the file being rendered by default.
+
+ * Added `-w, --watch` support to stylus(1). Closes #113
+
+0.1.0 / 2011-02-01
+==================
+
+ * Added `opposite-position(positions)` built-in function
+ * Added `image-lookup(path)` built-in function
+ * Added `-o, --out <dir>` support to stylus(1)
+ * Added `stylus [file|dir ...]` support
+ * Added: defaulting paths to `[CWD]` for stylus(1)
+ * Changed: `unquote()` using `Literal` node
+ * Changed: utilizing `Literal` in place of some `Ident`s
+
+0.0.2 / 2011-01-31
+==================
+
+ * Added optional property colon support. Closes #110
+ * Added `--version` to stylus(1)
+
+0.0.1 / 2011-01-31
+==================
+
+ * Initial release
diff --git a/node_modules/stylus/LICENSE b/node_modules/stylus/LICENSE
new file mode 100644
index 00000000..74c027f4
--- /dev/null
+++ b/node_modules/stylus/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) Automattic <developer.wordpress.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/stylus/Readme.md b/node_modules/stylus/Readme.md
new file mode 100644
index 00000000..cb90d479
--- /dev/null
+++ b/node_modules/stylus/Readme.md
@@ -0,0 +1,178 @@
+# Stylus [![Build Status](https://travis-ci.org/stylus/stylus.svg?branch=master)](https://travis-ci.org/stylus/stylus)
+
+ Stylus is a revolutionary new language, providing an efficient, dynamic, and expressive way to generate CSS. Supporting both an indented syntax and regular CSS style.
+
+## Installation
+
+```bash
+$ npm install stylus -g
+```
+
+## Basic Usage
+Watch and compile a stylus file from command line with
+```bash
+stylus -w style.styl -o style.css
+```
+You can also [try all stylus features on stylus-lang.com](http://stylus-lang.com/try.html), build something with stylus on [codepen](http://codepen.io) or integrate stylus with [gulp](http://gulpjs.com/) using [gulp-stylus](https://www.npmjs.com/package/gulp-stylus) or [gulp-accord](https://www.npmjs.com/package/gulp-accord).
+
+### Example
+
+```stylus
+border-radius()
+ -webkit-border-radius: arguments
+ -moz-border-radius: arguments
+ border-radius: arguments
+
+body a
+ font: 12px/1.4 "Lucida Grande", Arial, sans-serif
+ background: black
+ color: #ccc
+
+form input
+ padding: 5px
+ border: 1px solid
+ border-radius: 5px
+```
+
+compiles to:
+
+```css
+body a {
+ font: 12px/1.4 "Lucida Grande", Arial, sans-serif;
+ background: #000;
+ color: #ccc;
+}
+form input {
+ padding: 5px;
+ border: 1px solid;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+```
+
+the following is equivalent to the indented version of Stylus source, using the CSS syntax instead:
+
+```stylus
+border-radius() {
+ -webkit-border-radius: arguments
+ -moz-border-radius: arguments
+ border-radius: arguments
+}
+
+body a {
+ font: 12px/1.4 "Lucida Grande", Arial, sans-serif;
+ background: black;
+ color: #ccc;
+}
+
+form input {
+ padding: 5px;
+ border: 1px solid;
+ border-radius: 5px;
+}
+```
+
+### Features
+
+ Stylus has _many_ features. Detailed documentation links follow:
+
+ - [css syntax](docs/css-style.md) support
+ - [mixins](docs/mixins.md)
+ - [keyword arguments](docs/kwargs.md)
+ - [variables](docs/variables.md)
+ - [interpolation](docs/interpolation.md)
+ - arithmetic, logical, and equality [operators](docs/operators.md)
+ - [importing](docs/import.md) of other stylus sheets
+ - [introspection api](docs/introspection.md)
+ - type coercion
+ - [@extend](docs/extend.md)
+ - [conditionals](docs/conditionals.md)
+ - [iteration](docs/iteration.md)
+ - nested [selectors](docs/selectors.md)
+ - parent reference
+ - in-language [functions](docs/functions.md)
+ - [variable arguments](docs/vargs.md)
+ - built-in [functions](docs/bifs.md) (over 60)
+ - optional [image inlining](docs/functions.url.md)
+ - optional compression
+ - JavaScript [API](docs/js.md)
+ - extremely terse syntax
+ - stylus [executable](docs/executable.md)
+ - [error reporting](docs/error-reporting.md)
+ - single-line and multi-line [comments](docs/comments.md)
+ - css [literal](docs/literal.md)
+ - character [escaping](docs/escape.md)
+ - [@keyframes](docs/keyframes.md) support & expansion
+ - [@font-face](docs/font-face.md) support
+ - [@media](docs/media.md) support
+ - Connect [Middleware](docs/middleware.md)
+ - TextMate [bundle](docs/textmate.md)
+ - Coda/SubEtha Edit [Syntax mode](https://github.com/atljeremy/Stylus.mode)
+ - gedit [language-spec](docs/gedit.md)
+ - VIM [Syntax](https://github.com/wavded/vim-stylus)
+ - Espresso [Sugar](https://github.com/aljs/Stylus.sugar)
+ - [Firebug extension](docs/firebug.md)
+ - heroku [web service](http://styl.herokuapp.com/) for compiling stylus
+ - [style guide](https://github.com/lepture/ganam) parser and generator
+ - transparent vendor-specific function expansion
+
+### Community modules
+
+ - https://github.com/stylus/stylus/wiki
+
+### Framework Support
+
+ - [Connect](docs/middleware.md)
+ - [Play! 2.0](https://github.com/patiencelabs/play-stylus)
+ - [Ruby On Rails](https://github.com/forgecrafted/ruby-stylus-source)
+ - [Meteor](http://docs.meteor.com/#stylus)
+ - [Grails](http://grails.org/plugin/stylus-asset-pipeline)
+ - [Derby](https://github.com/derbyjs/derby-stylus)
+
+### CMS Support
+
+ - [DocPad](https://github.com/docpad/docpad)
+ - [Punch](https://github.com/laktek/punch-stylus-compiler)
+
+### Screencasts
+
+ - [Stylus Intro](http://www.screenr.com/bNY)
+ - [CSS Syntax & Postfix Conditionals](http://www.screenr.com/A8v)
+
+### Authors
+
+ - [TJ Holowaychuk (tj)](https://github.com/tj)
+
+### More Information
+
+ - Language [comparisons](docs/compare.md)
+
+## Code of Conduct
+
+Please note that this project is released with a [Contributor Code of Conduct](Code_of_Conduct.md). By participating in this project you agree to abide by its terms.
+
+## License
+
+(The MIT License)
+
+Copyright (c) Automattic &lt;developer.wordpress.com&gt;
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/stylus/bin/stylus b/node_modules/stylus/bin/stylus
new file mode 100755
index 00000000..6ad9bb1c
--- /dev/null
+++ b/node_modules/stylus/bin/stylus
@@ -0,0 +1,817 @@
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs')
+ , stylus = require('../lib/stylus')
+ , basename = require('path').basename
+ , dirname = require('path').dirname
+ , extname = require('path').extname
+ , resolve = require('path').resolve
+ , join = require('path').join
+ , isWindows = process.platform === 'win32';
+
+/**
+ * Arguments.
+ */
+
+var args = process.argv.slice(2);
+
+/**
+ * Compare flag.
+ */
+
+var compare = false;
+
+/**
+ * Compress flag.
+ */
+
+var compress = false;
+
+/**
+ * CSS conversion flag.
+ */
+
+var convertCSS = false;
+
+/**
+ * Line numbers flag.
+ */
+
+var linenos = false;
+
+/**
+ * CSS class prefix.
+ */
+var prefix = '';
+
+/**
+ * Print to stdout flag.
+ */
+var print = false;
+
+/**
+ * Firebug flag
+ */
+
+var firebug = false;
+
+/**
+ * Sourcemap flag
+ */
+
+var sourcemap = false;
+
+/**
+ * Files to processes.
+ */
+
+var files = [];
+
+/**
+ * Import paths.
+ */
+
+var paths = [];
+
+/**
+ * Destination directory.
+ */
+
+var dest;
+
+/**
+ * Watcher hash.
+ */
+
+var watchers;
+
+/**
+ * Enable REPL.
+ */
+
+var interactive;
+
+/**
+ * Plugins.
+ */
+
+var plugins = [];
+
+/**
+ * Optional url() function.
+ */
+
+var urlFunction = false;
+
+/**
+ * Include CSS on import.
+ */
+
+var includeCSS = false;
+
+/**
+ * Set file imports.
+ */
+
+var imports = [];
+
+/**
+ * Resolve relative urls
+ */
+
+var resolveURL = false;
+
+/**
+ * Disable cache.
+ */
+
+var disableCache = false;
+
+/**
+ * Display dependencies flag.
+ */
+
+var deps = false;
+
+/**
+ * Hoist at-rules.
+ */
+
+var hoist = false;
+
+/**
+ * Usage docs.
+ */
+
+var usage = [
+ ''
+ , ' Usage: stylus [options] [command] [< in [> out]]'
+ , ' [file|dir ...]'
+ , ''
+ , ' Commands:'
+ , ''
+ , ' help [<type>:]<prop> Opens help info at MDN for <prop> in'
+ , ' your default browser. Optionally'
+ , ' searches other resources of <type>:'
+ , ' safari opera w3c ms caniuse quirksmode'
+ , ''
+ , ' Options:'
+ , ''
+ , ' -i, --interactive Start interactive REPL'
+ , ' -u, --use <path> Utilize the Stylus plugin at <path>'
+ , ' -U, --inline Utilize image inlining via data URI support'
+ , ' -w, --watch Watch file(s) for changes and re-compile'
+ , ' -o, --out <dir> Output to <dir> when passing files'
+ , ' -C, --css <src> [dest] Convert CSS input to Stylus'
+ , ' -I, --include <path> Add <path> to lookup paths'
+ , ' -c, --compress Compress CSS output'
+ , ' -d, --compare Display input along with output'
+ , ' -f, --firebug Emits debug infos in the generated CSS that'
+ , ' can be used by the FireStylus Firebug plugin'
+ , ' -l, --line-numbers Emits comments in the generated CSS'
+ , ' indicating the corresponding Stylus line'
+ , ' -m, --sourcemap Generates a sourcemap in sourcemaps v3 format'
+ , ' --sourcemap-inline Inlines sourcemap with full source text in base64 format'
+ , ' --sourcemap-root <url> "sourceRoot" property of the generated sourcemap'
+ , ' --sourcemap-base <path> Base <path> from which sourcemap and all sources are relative'
+ , ' -P, --prefix [prefix] prefix all css classes'
+ , ' -p, --print Print out the compiled CSS'
+ , ' --import <file> Import stylus <file>'
+ , ' --include-css Include regular CSS on @import'
+ , ' -D, --deps Display dependencies of the compiled file'
+ , ' --disable-cache Disable caching'
+ , ' --hoist-atrules Move @import and @charset to the top'
+ , ' -r, --resolve-url Resolve relative urls inside imports'
+ , ' --resolve-url-nocheck Like --resolve-url but without file existence check'
+ , ' -V, --version Display the version of Stylus'
+ , ' -h, --help Display help information'
+ , ''
+].join('\n');
+
+/**
+ * Handle arguments.
+ */
+
+var arg;
+while (args.length) {
+ arg = args.shift();
+ switch (arg) {
+ case '-h':
+ case '--help':
+ console.error(usage);
+ return;
+ case '-d':
+ case '--compare':
+ compare = true;
+ break;
+ case '-c':
+ case '--compress':
+ compress = true;
+ break;
+ case '-C':
+ case '--css':
+ convertCSS = true;
+ break;
+ case '-f':
+ case '--firebug':
+ firebug = true;
+ break;
+ case '-l':
+ case '--line-numbers':
+ linenos = true;
+ break;
+ case '-m':
+ case '--sourcemap':
+ sourcemap = {};
+ break;
+ case '--sourcemap-inline':
+ sourcemap = sourcemap || {};
+ sourcemap.inline = true;
+ break;
+ case '--sourcemap-root':
+ var url = args.shift();
+ if (!url) throw new Error('--sourcemap-root <url> required');
+ sourcemap = sourcemap || {};
+ sourcemap.sourceRoot = url;
+ break;
+ case '--sourcemap-base':
+ var path = args.shift();
+ if (!path) throw new Error('--sourcemap-base <path> required');
+ sourcemap = sourcemap || {};
+ sourcemap.basePath = path;
+ break;
+ case '-P':
+ case '--prefix':
+ prefix = args.shift();
+ if (!prefix) throw new Error('--prefix <prefix> required');
+ break;
+ case '-p':
+ case '--print':
+ print = true;
+ break;
+ case '-V':
+ case '--version':
+ console.log(stylus.version);
+ return;
+ case '-o':
+ case '--out':
+ dest = args.shift();
+ if (!dest) throw new Error('--out <dir> required');
+ break;
+ case 'help':
+ var name = args.shift()
+ , browser = name.split(':');
+ if (browser.length > 1) {
+ name = [].slice.call(browser, 1).join(':');
+ browser = browser[0];
+ } else {
+ name = browser[0];
+ browser = '';
+ }
+ if (!name) throw new Error('help <property> required');
+ help(name);
+ break;
+ case '--include-css':
+ includeCSS = true;
+ break;
+ case '--disable-cache':
+ disableCache = true;
+ break;
+ case '--hoist-atrules':
+ hoist = true;
+ break;
+ case '-i':
+ case '--repl':
+ case '--interactive':
+ interactive = true;
+ break;
+ case '-I':
+ case '--include':
+ var path = args.shift();
+ if (!path) throw new Error('--include <path> required');
+ paths.push(path);
+ break;
+ case '-w':
+ case '--watch':
+ watchers = {};
+ break;
+ case '-U':
+ case '--inline':
+ args.unshift('--use', 'url');
+ break;
+ case '-u':
+ case '--use':
+ var options;
+ var path = args.shift();
+ if (!path) throw new Error('--use <path> required');
+
+ // options
+ if ('--with' == args[0]) {
+ args.shift();
+ options = args.shift();
+ if (!options) throw new Error('--with <options> required');
+ options = eval('(' + options + ')');
+ }
+
+ // url support
+ if ('url' == path) {
+ urlFunction = options || {};
+ } else {
+ paths.push(dirname(path));
+ plugins.push({ path: path, options: options });
+ }
+ break;
+ case '--import':
+ var file = args.shift();
+ if (!file) throw new Error('--import <file> required');
+ imports.push(file);
+ break;
+ case '-r':
+ case '--resolve-url':
+ resolveURL = {};
+ break;
+ case '--resolve-url-nocheck':
+ resolveURL = { nocheck: true };
+ break;
+ case '-D':
+ case '--deps':
+ deps = true;
+ break;
+ default:
+ files.push(arg);
+ }
+}
+
+// if --watch is used, assume we are
+// not working with stdio
+
+if (watchers && !files.length) {
+ files = fs.readdirSync(process.cwd())
+ .filter(function(file){
+ return file.match(/\.styl$/);
+ });
+}
+
+// --sourcemap flag is not working with stdio
+if (sourcemap && !files.length) sourcemap = false;
+
+/**
+ * Open the default browser to the CSS property `name`.
+ *
+ * @param {String} name
+ */
+
+function help(name) {
+ var url
+ , exec = require('child_process').exec
+ , command;
+
+ name = encodeURIComponent(name);
+
+ switch (browser) {
+ case 'safari':
+ case 'webkit':
+ url = 'https://developer.apple.com/library/safari/search/?q=' + name;
+ break;
+ case 'opera':
+ url = 'http://dev.opera.com/search/?term=' + name;
+ break;
+ case 'w3c':
+ url = 'http://www.google.com/search?q=site%3Awww.w3.org%2FTR+' + name;
+ break;
+ case 'ms':
+ url = 'http://social.msdn.microsoft.com/search/en-US/ie?query=' + name + '&refinement=59%2c61';
+ break;
+ case 'caniuse':
+ url = 'http://caniuse.com/#search=' + name;
+ break;
+ case 'quirksmode':
+ url = 'http://www.google.com/search?q=site%3Awww.quirksmode.org+' + name;
+ break;
+ default:
+ url = 'https://developer.mozilla.org/en/CSS/' + name;
+ }
+
+ switch (process.platform) {
+ case 'linux': command = 'x-www-browser'; break;
+ default: command = 'open';
+ }
+
+ exec(command + ' "' + url + '"', function(){
+ process.exit(0);
+ });
+}
+
+// Compilation options
+
+if (files.length > 1 && isCSS(dest)) {
+ dest = dirname(dest);
+}
+
+var options = {
+ filename: 'stdin'
+ , compress: compress
+ , firebug: firebug
+ , linenos: linenos
+ , sourcemap: sourcemap
+ , paths: [process.cwd()].concat(paths)
+ , prefix: prefix
+ , dest: dest
+ , 'hoist atrules': hoist
+};
+
+// Buffer stdin
+
+var str = '';
+
+// Convert CSS to Stylus
+
+if (convertCSS) {
+ switch (files.length) {
+ case 2:
+ compileCSSFile(files[0], files[1]);
+ break;
+ case 1:
+ var file = files[0];
+ compileCSSFile(file, join(dirname(file), basename(file, extname(file))) + '.styl');
+ break;
+ default:
+ var stdin = process.openStdin();
+ stdin.setEncoding('utf8');
+ stdin.on('data', function(chunk){ str += chunk; });
+ stdin.on('end', function(){
+ var out = stylus.convertCSS(str);
+ console.log(out);
+ });
+ }
+} else if (interactive) {
+ repl();
+} else if (deps) {
+ // if --deps is used, just display list of the dependencies
+ // not working with stdio and dirs
+ displayDeps();
+} else {
+ if (files.length) {
+ compileFiles(files);
+ } else {
+ compileStdio();
+ }
+}
+
+/**
+ * Start Stylus REPL.
+ */
+
+function repl() {
+ var options = { cache: false, filename: 'stdin', imports: [join(__dirname, '..', 'lib', 'functions')] }
+ , parser = new stylus.Parser('', options)
+ , evaluator = new stylus.Evaluator(parser.parse(), options)
+ , rl = require('readline')
+ , repl = rl.createInterface(process.stdin, process.stdout, autocomplete)
+ , global = evaluator.global.scope;
+
+ // expose BIFs
+ evaluator.evaluate();
+
+ // readline
+ repl.setPrompt('> ');
+ repl.prompt();
+
+ // HACK: flat-list auto-complete
+ function autocomplete(line){
+ var out = process.stdout
+ , keys = Object.keys(global.locals)
+ , len = keys.length
+ , words = line.split(/\s+/)
+ , word = words.pop()
+ , names = []
+ , name
+ , node
+ , key;
+
+ // find words that match
+ for (var i = 0; i < len; ++i) {
+ key = keys[i];
+ if (0 == key.indexOf(word)) {
+ node = global.lookup(key);
+ switch (node.nodeName) {
+ case 'function':
+ names.push(node.toString());
+ break;
+ default:
+ names.push(key);
+ }
+ }
+ }
+
+ return [names, line];
+ };
+
+ repl.on('line', function(line){
+ if (!line.trim().length) return repl.prompt();
+ parser = new stylus.Parser(line, options);
+ parser.state.push('expression');
+ evaluator.return = true;
+ try {
+ var expr = parser.parse();
+ evaluator.root = expr;
+ var ret = evaluator.evaluate();
+ var node;
+ while (node = ret.nodes.pop()) {
+ if (!node.suppress) {
+ var str = node.toString();
+ if ('(' == str[0]) str = str.replace(/^\(|\)$/g, '');
+ console.log('\033[90m=> \033[0m' + highlight(str));
+ break;
+ }
+ }
+ repl.prompt();
+ } catch (err) {
+ console.error('\033[31merror: %s\033[0m', err.message || err.stack);
+ repl.prompt();
+ }
+ });
+
+ repl.on('SIGINT', function(){
+ console.log();
+ process.exit(0);
+ });
+}
+
+/**
+ * Highlight the given string of Stylus.
+ */
+
+function highlight(str) {
+ return str
+ .replace(/(#)?(\d+(\.\d+)?)/g, function($0, $1, $2){
+ return $1 ? $0 : '\033[36m' + $2 + '\033[0m';
+ })
+ .replace(/(#[\da-fA-F]+)/g, '\033[33m$1\033[0m')
+ .replace(/('.*?'|".*?")/g, '\033[32m$1\033[0m');
+}
+
+/**
+ * Convert a CSS file to a Styl file
+ */
+
+function compileCSSFile(file, fileOut) {
+ fs.stat(file, function(err, stat){
+ if (err) throw err;
+ if (stat.isFile()) {
+ fs.readFile(file, 'utf8', function(err, str){
+ if (err) throw err;
+ var styl = stylus.convertCSS(str);
+ fs.writeFile(fileOut, styl, function(err){
+ if (err) throw err;
+ });
+ });
+ }
+ });
+}
+
+/**
+ * Compile with stdio.
+ */
+
+function compileStdio() {
+ process.stdin.setEncoding('utf8');
+ process.stdin.on('data', function(chunk){ str += chunk; });
+ process.stdin.on('end', function(){
+ // Compile to css
+ var style = stylus(str, options);
+ if (includeCSS) style.set('include css', true);
+ if (disableCache) style.set('cache', false);
+ usePlugins(style);
+ importFiles(style);
+ style.render(function(err, css){
+ if (err) throw err;
+ if (compare) {
+ console.log('\n\x1b[1mInput:\x1b[0m');
+ console.log(str);
+ console.log('\n\x1b[1mOutput:\x1b[0m');
+ }
+ console.log(css);
+ if (compare) console.log();
+ });
+ }).resume();
+}
+
+/**
+ * Compile the given files.
+ */
+
+function compileFiles(files) {
+ files.forEach(compileFile);
+}
+
+/**
+ * Display dependencies of the compiled files.
+ */
+
+function displayDeps() {
+ files.forEach(function(file){
+ // ensure file exists
+ fs.stat(file, function(err, stat){
+ if (err) throw err;
+ fs.readFile(file, 'utf8', function(err, str){
+ if (err) throw err;
+ options.filename = file;
+ var style = stylus(str, options);
+
+ usePlugins(style);
+ importFiles(style);
+ console.log(style.deps().join('\n'));
+ });
+ });
+ });
+}
+
+/**
+ * Compile the given file.
+ */
+
+function compileFile(file) {
+ // ensure file exists
+ fs.stat(file, function(err, stat){
+ if (err) throw err;
+ // file
+ if (stat.isFile()) {
+ fs.readFile(file, 'utf8', function(err, str){
+ if (err) throw err;
+ options.filename = file;
+ options._imports = [];
+ var style = stylus(str, options);
+ if (includeCSS) style.set('include css', true);
+ if (disableCache) style.set('cache', false);
+ if (sourcemap) style.set('sourcemap', sourcemap);
+
+ usePlugins(style);
+ importFiles(style);
+ style.render(function(err, css){
+ watchImports(file, options._imports);
+ if (err) {
+ if (watchers) {
+ console.error(err.stack || err.message);
+ } else {
+ throw err;
+ }
+ } else {
+ writeFile(file, css);
+ // write sourcemap
+ if (sourcemap && !sourcemap.inline) {
+ writeSourcemap(file, style.sourcemap);
+ }
+ }
+ });
+ });
+ // directory
+ } else if (stat.isDirectory()) {
+ fs.readdir(file, function(err, files){
+ if (err) throw err;
+ files.filter(function(path){
+ return path.match(/\.styl$/);
+ }).map(function(path){
+ return join(file, path);
+ }).forEach(compileFile);
+ });
+ }
+ });
+}
+
+/**
+ * Write the given CSS output.
+ */
+
+function createPath(file, sourceMap) {
+ var out;
+ if (files.length === 1 && isCSS(dest)) {
+ return [dest, sourceMap ? '.map' : ''].join('');
+ }
+ // --out support
+ out = [basename(file, extname(file)), sourceMap ? '.css.map' : '.css'].join('');
+ return dest
+ ? join(dest, out)
+ : join(dirname(file), out);
+}
+
+/**
+ * Check if the given path is a CSS file.
+ */
+
+function isCSS(file) {
+ return file && '.css' === extname(file);
+}
+
+function writeFile(file, css) {
+ // --print support
+ if (print) return process.stdout.write(css);
+ var path = createPath(file);
+ fs.writeFile(path, css, function(err){
+ if (err) throw err;
+ console.log(' \033[90mcompiled\033[0m %s', path);
+ // --watch support
+ watch(file, file);
+ });
+}
+
+/**
+* Write the given sourcemap.
+*/
+
+function writeSourcemap(file, sourcemap) {
+ var path = createPath(file, true);
+ fs.writeFile(path, JSON.stringify(sourcemap), function(err){
+ if (err) throw err;
+ // don't output log message if --print is present
+ if (!print) console.log(' \033[90mgenerated\033[0m %s', path);
+ });
+}
+
+/**
+ * Watch the given `file` and recompiling `rootFile` when modified.
+ */
+
+function watch(file, rootFile) {
+ // not watching
+ if (!watchers) return;
+
+ // already watched
+ if (watchers[file]) {
+ watchers[file][rootFile] = true;
+ return;
+ }
+
+ // watch the file itself
+ watchers[file] = {};
+ watchers[file][rootFile] = true;
+ if (print) {
+ console.error('Stylus CLI Error: Watch and print cannot be used together');
+ process.exit(1);
+ }
+ console.log(' \033[90mwatching\033[0m %s', file);
+ // if is windows use fs.watch api instead
+ // TODO: remove watchFile when fs.watch() works on osx etc
+ if (isWindows) {
+ fs.watch(file, function(event) {
+ if (event === 'change') compile();
+ });
+ } else {
+ fs.watchFile(file, { interval: 300 }, function(curr, prev) {
+ if (curr.mtime > prev.mtime) compile();
+ });
+ }
+
+ function compile() {
+ for (var rootFile in watchers[file]) {
+ compileFile(rootFile);
+ }
+ }
+}
+
+/**
+ * Watch `imports`, re-compiling `file` when they change.
+ */
+
+function watchImports(file, imports) {
+ imports.forEach(function(imported){
+ if (!imported.path) return;
+ watch(imported.path, file);
+ });
+}
+
+/**
+ * Utilize plugins.
+ */
+
+function usePlugins(style) {
+ plugins.forEach(function(plugin){
+ var path = plugin.path;
+ var options = plugin.options;
+ fn = require(/^\.+\//.test(path) ? resolve(path) : path);
+ if ('function' != typeof fn) {
+ throw new Error('plugin ' + path + ' does not export a function');
+ }
+ style.use(fn(options));
+ });
+
+ if (urlFunction) {
+ style.define('url', stylus.url(urlFunction));
+ } else if (resolveURL) {
+ style.define('url', stylus.resolver(resolveURL));
+ }
+}
+
+/**
+ * Imports the indicated files.
+ */
+
+function importFiles(style) {
+ imports.forEach(function(file) {
+ style.import(file);
+ });
+}
diff --git a/node_modules/stylus/index.js b/node_modules/stylus/index.js
new file mode 100644
index 00000000..ab58d3e7
--- /dev/null
+++ b/node_modules/stylus/index.js
@@ -0,0 +1,4 @@
+
+module.exports = process.env.STYLUS_COV
+ ? require('./lib-cov/stylus')
+ : require('./lib/stylus'); \ No newline at end of file
diff --git a/node_modules/stylus/lib/browserify.js b/node_modules/stylus/lib/browserify.js
new file mode 100644
index 00000000..83879b26
--- /dev/null
+++ b/node_modules/stylus/lib/browserify.js
@@ -0,0 +1,2 @@
+
+module.exports = require('./stylus');
diff --git a/node_modules/stylus/lib/cache/fs.js b/node_modules/stylus/lib/cache/fs.js
new file mode 100644
index 00000000..910bf9fb
--- /dev/null
+++ b/node_modules/stylus/lib/cache/fs.js
@@ -0,0 +1,80 @@
+/**
+ * Module dependencies.
+ */
+
+var crypto = require('crypto')
+ , fs = require('fs')
+ , join = require('path').join
+ , version = require('../../package').version
+ , nodes = require('../nodes');
+
+var FSCache = module.exports = function(options) {
+ options = options || {};
+ this._location = options['cache location'] || '.styl-cache';
+ if (!fs.existsSync(this._location)) fs.mkdirSync(this._location);
+};
+
+/**
+ * Set cache item with given `key` to `value`.
+ *
+ * @param {String} key
+ * @param {Object} value
+ * @api private
+ */
+
+FSCache.prototype.set = function(key, value) {
+ fs.writeFileSync(join(this._location, key), JSON.stringify(value));
+};
+
+/**
+ * Get cache item with given `key`.
+ *
+ * @param {String} key
+ * @return {Object}
+ * @api private
+ */
+
+FSCache.prototype.get = function(key) {
+ var data = fs.readFileSync(join(this._location, key), 'utf-8');
+ return JSON.parse(data, FSCache.fromJSON);
+};
+
+/**
+ * Check if cache has given `key`.
+ *
+ * @param {String} key
+ * @return {Boolean}
+ * @api private
+ */
+
+FSCache.prototype.has = function(key) {
+ return fs.existsSync(join(this._location, key));
+};
+
+/**
+ * Generate key for the source `str` with `options`.
+ *
+ * @param {String} str
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */
+
+FSCache.prototype.key = function(str, options) {
+ var hash = crypto.createHash('sha1');
+ hash.update(str + version + options.prefix);
+ return hash.digest('hex');
+};
+
+/**
+ * JSON to Stylus nodes converter.
+ *
+ * @api private
+ */
+
+FSCache.fromJSON = function(key, val) {
+ if (val && val.__type) {
+ val.__proto__ = nodes[val.__type].prototype;
+ }
+ return val;
+};
diff --git a/node_modules/stylus/lib/cache/index.js b/node_modules/stylus/lib/cache/index.js
new file mode 100644
index 00000000..58a0f6c8
--- /dev/null
+++ b/node_modules/stylus/lib/cache/index.js
@@ -0,0 +1,25 @@
+/**
+ * Get cache object by `name`.
+ *
+ * @param {String|Function} name
+ * @param {Object} options
+ * @return {Object}
+ * @api private
+ */
+
+var getCache = module.exports = function(name, options){
+ if ('function' == typeof name) return new name(options);
+
+ var cache;
+ switch (name){
+ // case 'fs':
+ // cache = require('./fs')
+ // break;
+ case 'memory':
+ cache = require('./memory');
+ break;
+ default:
+ cache = require('./null');
+ }
+ return new cache(options);
+};
diff --git a/node_modules/stylus/lib/cache/memory.js b/node_modules/stylus/lib/cache/memory.js
new file mode 100644
index 00000000..bc80c429
--- /dev/null
+++ b/node_modules/stylus/lib/cache/memory.js
@@ -0,0 +1,116 @@
+/**
+ * Module dependencies.
+ */
+
+var crypto = require('crypto')
+ , nodes = require('../nodes');
+
+var MemoryCache = module.exports = function(options) {
+ options = options || {};
+ this.limit = options['cache limit'] || 256;
+ this._cache = {};
+ this.length = 0;
+ this.head = this.tail = null;
+};
+
+/**
+ * Set cache item with given `key` to `value`.
+ *
+ * @param {String} key
+ * @param {Object} value
+ * @api private
+ */
+
+MemoryCache.prototype.set = function(key, value) {
+ var clone = value.clone()
+ , item;
+
+ clone.filename = nodes.filename;
+ clone.lineno = nodes.lineno;
+ clone.column = nodes.column;
+ item = { key: key, value: clone };
+ this._cache[key] = item;
+
+ if (this.tail) {
+ this.tail.next = item;
+ item.prev = this.tail;
+ } else {
+ this.head = item;
+ }
+
+ this.tail = item;
+ if (this.length++ == this.limit) this.purge();
+};
+
+/**
+ * Get cache item with given `key`.
+ *
+ * @param {String} key
+ * @return {Object}
+ * @api private
+ */
+
+MemoryCache.prototype.get = function(key) {
+ var item = this._cache[key]
+ , val = item.value.clone();
+
+ if (item == this.tail) return val;
+ if (item.next) {
+ if (item == this.head) this.head = item.next;
+ item.next.prev = item.prev;
+ }
+ if (item.prev) item.prev.next = item.next;
+
+ item.next = null;
+ item.prev = this.tail;
+
+ if (this.tail) this.tail.next = item;
+ this.tail = item;
+
+ return val;
+};
+
+/**
+ * Check if cache has given `key`.
+ *
+ * @param {String} key
+ * @return {Boolean}
+ * @api private
+ */
+
+MemoryCache.prototype.has = function(key) {
+ return !!this._cache[key];
+};
+
+/**
+ * Generate key for the source `str` with `options`.
+ *
+ * @param {String} str
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */
+
+MemoryCache.prototype.key = function(str, options) {
+ var hash = crypto.createHash('sha1');
+ hash.update(str + options.prefix);
+ return hash.digest('hex');
+};
+
+/**
+ * Remove the oldest item from the cache.
+ *
+ * @api private
+ */
+
+MemoryCache.prototype.purge = function() {
+ var item = this.head;
+
+ if (this.head.next) {
+ this.head = this.head.next;
+ this.head.prev = null;
+ }
+
+ this._cache[item.key] = item.prev = item.next = null;
+ this.length--;
+};
diff --git a/node_modules/stylus/lib/cache/null.js b/node_modules/stylus/lib/cache/null.js
new file mode 100644
index 00000000..07f1b011
--- /dev/null
+++ b/node_modules/stylus/lib/cache/null.js
@@ -0,0 +1,50 @@
+/**
+ * Module dependencies.
+ */
+
+var NullCache = module.exports = function() {};
+
+/**
+ * Set cache item with given `key` to `value`.
+ *
+ * @param {String} key
+ * @param {Object} value
+ * @api private
+ */
+
+NullCache.prototype.set = function(key, value) {};
+
+/**
+ * Get cache item with given `key`.
+ *
+ * @param {String} key
+ * @return {Object}
+ * @api private
+ */
+
+NullCache.prototype.get = function(key) {};
+
+/**
+ * Check if cache has given `key`.
+ *
+ * @param {String} key
+ * @return {Boolean}
+ * @api private
+ */
+
+NullCache.prototype.has = function(key) {
+ return false;
+};
+
+/**
+ * Generate key for the source `str` with `options`.
+ *
+ * @param {String} str
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */
+
+NullCache.prototype.key = function(str, options) {
+ return '';
+};
diff --git a/node_modules/stylus/lib/colors.js b/node_modules/stylus/lib/colors.js
new file mode 100644
index 00000000..3cb965f3
--- /dev/null
+++ b/node_modules/stylus/lib/colors.js
@@ -0,0 +1,158 @@
+
+/*!
+ * Stylus - colors
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+module.exports = {
+ aliceblue: [240, 248, 255, 1]
+ , antiquewhite: [250, 235, 215, 1]
+ , aqua: [0, 255, 255, 1]
+ , aquamarine: [127, 255, 212, 1]
+ , azure: [240, 255, 255, 1]
+ , beige: [245, 245, 220, 1]
+ , bisque: [255, 228, 196, 1]
+ , black: [0, 0, 0, 1]
+ , blanchedalmond: [255, 235, 205, 1]
+ , blue: [0, 0, 255, 1]
+ , blueviolet: [138, 43, 226, 1]
+ , brown: [165, 42, 42, 1]
+ , burlywood: [222, 184, 135, 1]
+ , cadetblue: [95, 158, 160, 1]
+ , chartreuse: [127, 255, 0, 1]
+ , chocolate: [210, 105, 30, 1]
+ , coral: [255, 127, 80, 1]
+ , cornflowerblue: [100, 149, 237, 1]
+ , cornsilk: [255, 248, 220, 1]
+ , crimson: [220, 20, 60, 1]
+ , cyan: [0, 255, 255, 1]
+ , darkblue: [0, 0, 139, 1]
+ , darkcyan: [0, 139, 139, 1]
+ , darkgoldenrod: [184, 134, 11, 1]
+ , darkgray: [169, 169, 169, 1]
+ , darkgreen: [0, 100, 0, 1]
+ , darkgrey: [169, 169, 169, 1]
+ , darkkhaki: [189, 183, 107, 1]
+ , darkmagenta: [139, 0, 139, 1]
+ , darkolivegreen: [85, 107, 47, 1]
+ , darkorange: [255, 140, 0, 1]
+ , darkorchid: [153, 50, 204, 1]
+ , darkred: [139, 0, 0, 1]
+ , darksalmon: [233, 150, 122, 1]
+ , darkseagreen: [143, 188, 143, 1]
+ , darkslateblue: [72, 61, 139, 1]
+ , darkslategray: [47, 79, 79, 1]
+ , darkslategrey: [47, 79, 79, 1]
+ , darkturquoise: [0, 206, 209, 1]
+ , darkviolet: [148, 0, 211, 1]
+ , deeppink: [255, 20, 147, 1]
+ , deepskyblue: [0, 191, 255, 1]
+ , dimgray: [105, 105, 105, 1]
+ , dimgrey: [105, 105, 105, 1]
+ , dodgerblue: [30, 144, 255, 1]
+ , firebrick: [178, 34, 34, 1]
+ , floralwhite: [255, 250, 240, 1]
+ , forestgreen: [34, 139, 34, 1]
+ , fuchsia: [255, 0, 255, 1]
+ , gainsboro: [220, 220, 220, 1]
+ , ghostwhite: [248, 248, 255, 1]
+ , gold: [255, 215, 0, 1]
+ , goldenrod: [218, 165, 32, 1]
+ , gray: [128, 128, 128, 1]
+ , green: [0, 128, 0, 1]
+ , greenyellow: [173, 255, 47, 1]
+ , grey: [128, 128, 128, 1]
+ , honeydew: [240, 255, 240, 1]
+ , hotpink: [255, 105, 180, 1]
+ , indianred: [205, 92, 92, 1]
+ , indigo: [75, 0, 130, 1]
+ , ivory: [255, 255, 240, 1]
+ , khaki: [240, 230, 140, 1]
+ , lavender: [230, 230, 250, 1]
+ , lavenderblush: [255, 240, 245, 1]
+ , lawngreen: [124, 252, 0, 1]
+ , lemonchiffon: [255, 250, 205, 1]
+ , lightblue: [173, 216, 230, 1]
+ , lightcoral: [240, 128, 128, 1]
+ , lightcyan: [224, 255, 255, 1]
+ , lightgoldenrodyellow: [250, 250, 210, 1]
+ , lightgray: [211, 211, 211, 1]
+ , lightgreen: [144, 238, 144, 1]
+ , lightgrey: [211, 211, 211, 1]
+ , lightpink: [255, 182, 193, 1]
+ , lightsalmon: [255, 160, 122, 1]
+ , lightseagreen: [32, 178, 170, 1]
+ , lightskyblue: [135, 206, 250, 1]
+ , lightslategray: [119, 136, 153, 1]
+ , lightslategrey: [119, 136, 153, 1]
+ , lightsteelblue: [176, 196, 222, 1]
+ , lightyellow: [255, 255, 224, 1]
+ , lime: [0, 255, 0, 1]
+ , limegreen: [50, 205, 50, 1]
+ , linen: [250, 240, 230, 1]
+ , magenta: [255, 0, 255, 1]
+ , maroon: [128, 0, 0, 1]
+ , mediumaquamarine: [102, 205, 170, 1]
+ , mediumblue: [0, 0, 205, 1]
+ , mediumorchid: [186, 85, 211, 1]
+ , mediumpurple: [147, 112, 219, 1]
+ , mediumseagreen: [60, 179, 113, 1]
+ , mediumslateblue: [123, 104, 238, 1]
+ , mediumspringgreen: [0, 250, 154, 1]
+ , mediumturquoise: [72, 209, 204, 1]
+ , mediumvioletred: [199, 21, 133, 1]
+ , midnightblue: [25, 25, 112, 1]
+ , mintcream: [245, 255, 250, 1]
+ , mistyrose: [255, 228, 225, 1]
+ , moccasin: [255, 228, 181, 1]
+ , navajowhite: [255, 222, 173, 1]
+ , navy: [0, 0, 128, 1]
+ , oldlace: [253, 245, 230, 1]
+ , olive: [128, 128, 0, 1]
+ , olivedrab: [107, 142, 35, 1]
+ , orange: [255, 165, 0, 1]
+ , orangered: [255, 69, 0, 1]
+ , orchid: [218, 112, 214, 1]
+ , palegoldenrod: [238, 232, 170, 1]
+ , palegreen: [152, 251, 152, 1]
+ , paleturquoise: [175, 238, 238, 1]
+ , palevioletred: [219, 112, 147, 1]
+ , papayawhip: [255, 239, 213, 1]
+ , peachpuff: [255, 218, 185, 1]
+ , peru: [205, 133, 63, 1]
+ , pink: [255, 192, 203, 1]
+ , plum: [221, 160, 221, 1]
+ , powderblue: [176, 224, 230, 1]
+ , purple: [128, 0, 128, 1]
+ , red: [255, 0, 0, 1]
+ , rosybrown: [188, 143, 143, 1]
+ , royalblue: [65, 105, 225, 1]
+ , saddlebrown: [139, 69, 19, 1]
+ , salmon: [250, 128, 114, 1]
+ , sandybrown: [244, 164, 96, 1]
+ , seagreen: [46, 139, 87, 1]
+ , seashell: [255, 245, 238, 1]
+ , sienna: [160, 82, 45, 1]
+ , silver: [192, 192, 192, 1]
+ , skyblue: [135, 206, 235, 1]
+ , slateblue: [106, 90, 205, 1]
+ , slategray: [112, 128, 144, 1]
+ , slategrey: [112, 128, 144, 1]
+ , snow: [255, 250, 250, 1]
+ , springgreen: [0, 255, 127, 1]
+ , steelblue: [70, 130, 180, 1]
+ , tan: [210, 180, 140, 1]
+ , teal: [0, 128, 128, 1]
+ , thistle: [216, 191, 216, 1]
+ , tomato: [255, 99, 71, 1]
+ , transparent: [0, 0, 0, 0]
+ , turquoise: [64, 224, 208, 1]
+ , violet: [238, 130, 238, 1]
+ , wheat: [245, 222, 179, 1]
+ , white: [255, 255, 255, 1]
+ , whitesmoke: [245, 245, 245, 1]
+ , yellow: [255, 255, 0, 1]
+ , yellowgreen: [154, 205, 50, 1]
+ , rebeccapurple: [102, 51, 153, 1]
+};
diff --git a/node_modules/stylus/lib/convert/css.js b/node_modules/stylus/lib/convert/css.js
new file mode 100644
index 00000000..3fb8b536
--- /dev/null
+++ b/node_modules/stylus/lib/convert/css.js
@@ -0,0 +1,307 @@
+/*!
+ * Stylus - CSS to Stylus conversion
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Convert the given `css` to Stylus source.
+ *
+ * @param {String} css
+ * @return {String}
+ * @api public
+ */
+
+module.exports = function(css){
+ return new Converter(css).stylus();
+};
+
+/**
+ * Initialize a new `Converter` with the given `css`.
+ *
+ * @param {String} css
+ * @api private
+ */
+
+function Converter(css) {
+ var parse = require('css-parse');
+ this.css = css;
+ this.root = parse(css, { position: false });
+ this.indents = 0;
+}
+
+/**
+ * Convert to Stylus.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.stylus = function(){
+ return this.visitRules(this.root.stylesheet.rules);
+};
+
+/**
+ * Return indent string.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.__defineGetter__('indent', function(){
+ return Array(this.indents + 1).join(' ');
+});
+
+/**
+ * Visit `node`.
+ *
+ * @param {*} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visit = function(node){
+ switch (node.type) {
+ case 'rule':
+ case 'comment':
+ case 'charset':
+ case 'namespace':
+ case 'media':
+ case 'import':
+ case 'document':
+ case 'keyframes':
+ case 'page':
+ case 'host':
+ case 'supports':
+ var name = node.type[0].toUpperCase() + node.type.slice(1);
+ return this['visit' + name](node);
+ }
+};
+
+/**
+ * Visit the rules on `node`.
+ *
+ * @param {Array} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitRules = function(node){
+ var buf = '';
+ for (var i = 0, len = node.length; i < len; ++i) {
+ buf += this.visit(node[i]);
+ }
+ return buf;
+};
+
+/**
+ * Visit Media `node`.
+ *
+ * @param {Media} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitMedia = function(node){
+ var buf = this.indent + '@media ' + node.media;
+ buf += '\n';
+ ++this.indents;
+ buf += this.visitRules(node.rules);
+ --this.indents;
+ return buf;
+};
+
+/**
+ * Visit Declaration `node`.
+ *
+ * @param {Declaration} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitDeclaration = function(node){
+ if ('comment' == node.type) {
+ return this.visitComment(node);
+ } else {
+ var buf = this.indent + node.property + ': ' + node.value + '\n';
+ return buf;
+ }
+};
+
+/**
+ * Visit Rule `node`.`
+ *
+ * @param {Rule} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitRule = function(node){
+ var buf = this.indent + node.selectors.join(',\n' + this.indent) + '\n';
+ ++this.indents;
+ for (var i = 0, len = node.declarations.length; i < len; ++i) {
+ buf += this.visitDeclaration(node.declarations[i]);
+ }
+ --this.indents;
+ return buf + '\n';
+};
+
+/**
+ * Visit Comment `node`.`
+ *
+ * @param {Comment} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitComment = function(node){
+ var buf = this.indent + '/*' + node.comment + '*/';
+ return buf + '\n';
+};
+
+/**
+ * Visit Charset `node`.`
+ *
+ * @param {Charset} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitCharset = function(node){
+ var buf = this.indent + '@charset ' + node.charset;
+ return buf + '\n';
+};
+
+/**
+ * Visit Namespace `node`.`
+ *
+ * @param {Namespace} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitNamespace = function(node){
+ var buf = this.indent + '@namespace ' + node.namespace;
+ return buf + '\n';
+};
+
+/**
+ * Visit Import `node`.`
+ *
+ * @param {Import} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitImport = function(node){
+ var buf = this.indent + '@import ' + node.import;
+ return buf + '\n';
+};
+
+/**
+ * Visit Document `node`.`
+ *
+ * @param {Document} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitDocument = function(node){
+ var buf = this.indent + '@' + node.vendor + 'document ' + node.document;
+ buf += '\n';
+ ++this.indents;
+ buf += this.visitRules(node.rules);
+ --this.indents;
+ return buf;
+};
+
+/**
+ * Visit Keyframes `node`.`
+ *
+ * @param {Keyframes} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitKeyframes = function(node){
+ var buf = this.indent + '@keyframes ' + node.name;
+ buf += '\n';
+ ++this.indents;
+ for (var i = 0, len = node.keyframes.length; i < len; ++i) {
+ buf += this.visitKeyframe(node.keyframes[i]);
+ }
+ --this.indents;
+ return buf;
+};
+
+/**
+ * Visit Keyframe `node`.`
+ *
+ * @param {Keyframe} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitKeyframe = function(node){
+ var buf = this.indent + node.values.join(', ');
+ buf += '\n';
+ ++this.indents;
+ for (var i = 0, len = node.declarations.length; i < len; ++i) {
+ buf += this.visitDeclaration(node.declarations[i]);
+ }
+ --this.indents;
+ return buf;
+};
+
+/**
+ * Visit Page `node`.`
+ *
+ * @param {Page} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitPage = function(node){
+ var buf = this.indent + '@page' + (node.selectors.length ? ' ' + node.selectors.join(', ') : '');
+ buf += '\n';
+ ++this.indents;
+ for (var i = 0, len = node.declarations.length; i < len; ++i) {
+ buf += this.visitDeclaration(node.declarations[i]);
+ }
+ --this.indents;
+ return buf;
+};
+
+/**
+ * Visit Supports `node`.`
+ *
+ * @param {Supports} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitSupports = function(node){
+ var buf = this.indent + '@supports ' + node.supports;
+ buf += '\n';
+ ++this.indents;
+ buf += this.visitRules(node.rules);
+ --this.indents;
+ return buf;
+};
+
+/**
+ * Visit Host `node`.`
+ *
+ * @param {Host} node
+ * @return {String}
+ * @api private
+ */
+
+Converter.prototype.visitHost = function(node){
+ var buf = this.indent + '@host';
+ buf += '\n';
+ ++this.indents;
+ buf += this.visitRules(node.rules);
+ --this.indents;
+ return buf;
+};
diff --git a/node_modules/stylus/lib/errors.js b/node_modules/stylus/lib/errors.js
new file mode 100644
index 00000000..8a3a6622
--- /dev/null
+++ b/node_modules/stylus/lib/errors.js
@@ -0,0 +1,58 @@
+
+/*!
+ * Stylus - errors
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Expose constructors.
+ */
+
+exports.ParseError = ParseError;
+exports.SyntaxError = SyntaxError;
+
+/**
+ * Inherit from `Error.prototype`.
+ */
+
+SyntaxError.prototype.__proto__ = Error.prototype;
+
+/**
+ * Initialize a new `ParseError` with the given `msg`.
+ *
+ * @param {String} msg
+ * @api private
+ */
+
+function ParseError(msg) {
+ this.name = 'ParseError';
+ this.message = msg;
+ Error.captureStackTrace(this, ParseError);
+}
+
+/**
+ * Inherit from `Error.prototype`.
+ */
+
+ParseError.prototype.__proto__ = Error.prototype;
+
+/**
+ * Initialize a new `SyntaxError` with the given `msg`.
+ *
+ * @param {String} msg
+ * @api private
+ */
+
+function SyntaxError(msg) {
+ this.name = 'SyntaxError';
+ this.message = msg;
+ Error.captureStackTrace(this, ParseError);
+}
+
+/**
+ * Inherit from `Error.prototype`.
+ */
+
+SyntaxError.prototype.__proto__ = Error.prototype;
+
diff --git a/node_modules/stylus/lib/functions/add-property.js b/node_modules/stylus/lib/functions/add-property.js
new file mode 100644
index 00000000..dfe55caf
--- /dev/null
+++ b/node_modules/stylus/lib/functions/add-property.js
@@ -0,0 +1,29 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Add property `name` with the given `expr`
+ * to the mixin-able block.
+ *
+ * @param {String|Ident|Literal} name
+ * @param {Expression} expr
+ * @return {Property}
+ * @api public
+ */
+
+(module.exports = function addProperty(name, expr){
+ utils.assertType(name, 'expression', 'name');
+ name = utils.unwrap(name).first;
+ utils.assertString(name, 'name');
+ utils.assertType(expr, 'expression', 'expr');
+ var prop = new nodes.Property([name], expr);
+ var block = this.closestBlock;
+
+ var len = block.nodes.length
+ , head = block.nodes.slice(0, block.index)
+ , tail = block.nodes.slice(block.index++, len);
+ head.push(prop);
+ block.nodes = head.concat(tail);
+
+ return prop;
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/adjust.js b/node_modules/stylus/lib/functions/adjust.js
new file mode 100644
index 00000000..58abb7ae
--- /dev/null
+++ b/node_modules/stylus/lib/functions/adjust.js
@@ -0,0 +1,28 @@
+var utils = require('../utils');
+
+/**
+ * Adjust HSL `color` `prop` by `amount`.
+ *
+ * @param {RGBA|HSLA} color
+ * @param {String} prop
+ * @param {Unit} amount
+ * @return {RGBA}
+ * @api private
+ */
+
+module.exports = function adjust(color, prop, amount){
+ utils.assertColor(color, 'color');
+ utils.assertString(prop, 'prop');
+ utils.assertType(amount, 'unit', 'amount');
+ var hsl = color.hsla.clone();
+ prop = { hue: 'h', saturation: 's', lightness: 'l' }[prop.string];
+ if (!prop) throw new Error('invalid adjustment property');
+ var val = amount.val;
+ if ('%' == amount.type){
+ val = 'l' == prop && val > 0
+ ? (100 - hsl[prop]) * val / 100
+ : hsl[prop] * (val / 100);
+ }
+ hsl[prop] += val;
+ return hsl.rgba;
+};
diff --git a/node_modules/stylus/lib/functions/alpha.js b/node_modules/stylus/lib/functions/alpha.js
new file mode 100644
index 00000000..769a276b
--- /dev/null
+++ b/node_modules/stylus/lib/functions/alpha.js
@@ -0,0 +1,36 @@
+var nodes = require('../nodes')
+ , rgba = require('./rgba');
+
+/**
+ * Return the alpha component of the given `color`,
+ * or set the alpha component to the optional second `value` argument.
+ *
+ * Examples:
+ *
+ * alpha(#fff)
+ * // => 1
+ *
+ * alpha(rgba(0,0,0,0.3))
+ * // => 0.3
+ *
+ * alpha(#fff, 0.5)
+ * // => rgba(255,255,255,0.5)
+ *
+ * @param {RGBA|HSLA} color
+ * @param {Unit} [value]
+ * @return {Unit|RGBA}
+ * @api public
+ */
+
+module.exports = function alpha(color, value){
+ color = color.rgba;
+ if (value) {
+ return rgba(
+ new nodes.Unit(color.r),
+ new nodes.Unit(color.g),
+ new nodes.Unit(color.b),
+ value
+ );
+ }
+ return new nodes.Unit(color.a, '');
+};
diff --git a/node_modules/stylus/lib/functions/base-convert.js b/node_modules/stylus/lib/functions/base-convert.js
new file mode 100644
index 00000000..55150948
--- /dev/null
+++ b/node_modules/stylus/lib/functions/base-convert.js
@@ -0,0 +1,26 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Return a `Literal` `num` converted to the provided `base`, padded to `width`
+ * with zeroes (default width is 2)
+ *
+ * @param {Number} num
+ * @param {Number} base
+ * @param {Number} width
+ * @return {Literal}
+ * @api public
+ */
+
+(module.exports = function(num, base, width) {
+ utils.assertPresent(num, 'number');
+ utils.assertPresent(base, 'base');
+ num = utils.unwrap(num).nodes[0].val;
+ base = utils.unwrap(base).nodes[0].val;
+ width = (width && utils.unwrap(width).nodes[0].val) || 2;
+ var result = Number(num).toString(base);
+ while (result.length < width) {
+ result = '0' + result;
+ }
+ return new nodes.Literal(result);
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/basename.js b/node_modules/stylus/lib/functions/basename.js
new file mode 100644
index 00000000..e1a32831
--- /dev/null
+++ b/node_modules/stylus/lib/functions/basename.js
@@ -0,0 +1,15 @@
+var utils = require('../utils')
+ , path = require('path');
+
+/**
+ * Return the basename of `path`.
+ *
+ * @param {String} path
+ * @return {String}
+ * @api public
+ */
+
+module.exports = function basename(p, ext){
+ utils.assertString(p, 'path');
+ return path.basename(p.val, ext && ext.val);
+};
diff --git a/node_modules/stylus/lib/functions/blend.js b/node_modules/stylus/lib/functions/blend.js
new file mode 100644
index 00000000..537e8978
--- /dev/null
+++ b/node_modules/stylus/lib/functions/blend.js
@@ -0,0 +1,37 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Blend the `top` color over the `bottom`
+ *
+ * Examples:
+ *
+ * blend(rgba(#FFF, 0.5), #000)
+ * // => #808080
+ *
+ * blend(rgba(#FFDE00,.42), #19C261)
+ * // => #7ace38
+ *
+ * blend(rgba(lime, 0.5), rgba(red, 0.25))
+ * // => rgba(128,128,0,0.625)
+ *
+ * @param {RGBA|HSLA} top
+ * @param {RGBA|HSLA} [bottom=#fff]
+ * @return {RGBA}
+ * @api public
+ */
+
+module.exports = function blend(top, bottom){
+ // TODO: different blend modes like overlay etc.
+ utils.assertColor(top);
+ top = top.rgba;
+ bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
+ utils.assertColor(bottom);
+ bottom = bottom.rgba;
+
+ return new nodes.RGBA(
+ top.r * top.a + bottom.r * (1 - top.a),
+ top.g * top.a + bottom.g * (1 - top.a),
+ top.b * top.a + bottom.b * (1 - top.a),
+ top.a + bottom.a - top.a * bottom.a);
+};
diff --git a/node_modules/stylus/lib/functions/blue.js b/node_modules/stylus/lib/functions/blue.js
new file mode 100644
index 00000000..c07895cb
--- /dev/null
+++ b/node_modules/stylus/lib/functions/blue.js
@@ -0,0 +1,33 @@
+var nodes = require('../nodes')
+ , rgba = require('./rgba');
+
+/**
+ * Return the blue component of the given `color`,
+ * or set the blue component to the optional second `value` argument.
+ *
+ * Examples:
+ *
+ * blue(#00c)
+ * // => 204
+ *
+ * blue(#000, 255)
+ * // => #00f
+ *
+ * @param {RGBA|HSLA} color
+ * @param {Unit} [value]
+ * @return {Unit|RGBA}
+ * @api public
+ */
+
+module.exports = function blue(color, value){
+ color = color.rgba;
+ if (value) {
+ return rgba(
+ new nodes.Unit(color.r),
+ new nodes.Unit(color.g),
+ value,
+ new nodes.Unit(color.a)
+ );
+ }
+ return new nodes.Unit(color.b, '');
+};
diff --git a/node_modules/stylus/lib/functions/clone.js b/node_modules/stylus/lib/functions/clone.js
new file mode 100644
index 00000000..38c02c54
--- /dev/null
+++ b/node_modules/stylus/lib/functions/clone.js
@@ -0,0 +1,14 @@
+var utils = require('../utils');
+
+/**
+ * Return a clone of the given `expr`.
+ *
+ * @param {Expression} expr
+ * @return {Node}
+ * @api public
+ */
+
+(module.exports = function clone(expr){
+ utils.assertPresent(expr, 'expr');
+ return expr.clone();
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/component.js b/node_modules/stylus/lib/functions/component.js
new file mode 100644
index 00000000..37a9b237
--- /dev/null
+++ b/node_modules/stylus/lib/functions/component.js
@@ -0,0 +1,60 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Color component name map.
+ */
+
+var componentMap = {
+ red: 'r'
+ , green: 'g'
+ , blue: 'b'
+ , alpha: 'a'
+ , hue: 'h'
+ , saturation: 's'
+ , lightness: 'l'
+};
+
+/**
+ * Color component unit type map.
+ */
+
+var unitMap = {
+ hue: 'deg'
+ , saturation: '%'
+ , lightness: '%'
+};
+
+/**
+ * Color type map.
+ */
+
+var typeMap = {
+ red: 'rgba'
+ , blue: 'rgba'
+ , green: 'rgba'
+ , alpha: 'rgba'
+ , hue: 'hsla'
+ , saturation: 'hsla'
+ , lightness: 'hsla'
+};
+
+/**
+ * Return component `name` for the given `color`.
+ *
+ * @param {RGBA|HSLA} color
+ * @param {String} name
+ * @return {Unit}
+ * @api public
+ */
+
+module.exports = function component(color, name) {
+ utils.assertColor(color, 'color');
+ utils.assertString(name, 'name');
+ var name = name.string
+ , unit = unitMap[name]
+ , type = typeMap[name]
+ , name = componentMap[name];
+ if (!name) throw new Error('invalid color component "' + name + '"');
+ return new nodes.Unit(color[type][name], unit);
+};
diff --git a/node_modules/stylus/lib/functions/contrast.js b/node_modules/stylus/lib/functions/contrast.js
new file mode 100644
index 00000000..7e59c891
--- /dev/null
+++ b/node_modules/stylus/lib/functions/contrast.js
@@ -0,0 +1,75 @@
+var utils = require('../utils')
+ , nodes = require('../nodes')
+ , blend = require('./blend')
+ , luminosity = require('./luminosity');
+
+/**
+ * Returns the contrast ratio object between `top` and `bottom` colors,
+ * based on http://leaverou.github.io/contrast-ratio/
+ * and https://github.com/LeaVerou/contrast-ratio/blob/gh-pages/color.js#L108
+ *
+ * Examples:
+ *
+ * contrast(#000, #fff).ratio
+ * => 21
+ *
+ * contrast(#000, rgba(#FFF, 0.5))
+ * => { "ratio": "13.15;", "error": "7.85", "min": "5.3", "max": "21" }
+ *
+ * @param {RGBA|HSLA} top
+ * @param {RGBA|HSLA} [bottom=#fff]
+ * @return {Object}
+ * @api public
+ */
+
+module.exports = function contrast(top, bottom){
+ if ('rgba' != top.nodeName && 'hsla' != top.nodeName) {
+ return new nodes.Literal('contrast(' + (top.isNull ? '' : top.toString()) + ')');
+ }
+ var result = new nodes.Object();
+ top = top.rgba;
+ bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
+ utils.assertColor(bottom);
+ bottom = bottom.rgba;
+ function contrast(top, bottom) {
+ if (1 > top.a) {
+ top = blend(top, bottom);
+ }
+ var l1 = luminosity(bottom).val + 0.05
+ , l2 = luminosity(top).val + 0.05
+ , ratio = l1 / l2;
+
+ if (l2 > l1) {
+ ratio = 1 / ratio;
+ }
+ return Math.round(ratio * 10) / 10;
+ }
+
+ if (1 <= bottom.a) {
+ var resultRatio = new nodes.Unit(contrast(top, bottom));
+ result.set('ratio', resultRatio);
+ result.set('error', new nodes.Unit(0));
+ result.set('min', resultRatio);
+ result.set('max', resultRatio);
+ } else {
+ var onBlack = contrast(top, blend(bottom, new nodes.RGBA(0, 0, 0, 1)))
+ , onWhite = contrast(top, blend(bottom, new nodes.RGBA(255, 255, 255, 1)))
+ , max = Math.max(onBlack, onWhite);
+ function processChannel(topChannel, bottomChannel) {
+ return Math.min(Math.max(0, (topChannel - bottomChannel * bottom.a) / (1 - bottom.a)), 255);
+ }
+ var closest = new nodes.RGBA(
+ processChannel(top.r, bottom.r),
+ processChannel(top.g, bottom.g),
+ processChannel(top.b, bottom.b),
+ 1
+ );
+ var min = contrast(top, blend(bottom, closest));
+
+ result.set('ratio', new nodes.Unit(Math.round((min + max) * 50) / 100));
+ result.set('error', new nodes.Unit(Math.round((max - min) * 50) / 100));
+ result.set('min', new nodes.Unit(min));
+ result.set('max', new nodes.Unit(max));
+ }
+ return result;
+}
diff --git a/node_modules/stylus/lib/functions/convert.js b/node_modules/stylus/lib/functions/convert.js
new file mode 100644
index 00000000..d64f1631
--- /dev/null
+++ b/node_modules/stylus/lib/functions/convert.js
@@ -0,0 +1,15 @@
+var utils = require('../utils');
+
+/**
+ * Like `unquote` but tries to convert
+ * the given `str` to a Stylus node.
+ *
+ * @param {String} str
+ * @return {Node}
+ * @api public
+ */
+
+module.exports = function convert(str){
+ utils.assertString(str, 'str');
+ return utils.parseString(str.string);
+};
diff --git a/node_modules/stylus/lib/functions/current-media.js b/node_modules/stylus/lib/functions/current-media.js
new file mode 100644
index 00000000..e88e3e81
--- /dev/null
+++ b/node_modules/stylus/lib/functions/current-media.js
@@ -0,0 +1,22 @@
+var nodes = require('../nodes');
+
+/**
+ * Returns the @media string for the current block
+ *
+ * @return {String}
+ * @api public
+ */
+
+module.exports = function currentMedia(){
+ var self = this;
+ return new nodes.String(lookForMedia(this.closestBlock.node) || '');
+
+ function lookForMedia(node){
+ if ('media' == node.nodeName) {
+ node.val = self.visit(node.val);
+ return node.toString();
+ } else if (node.block.parent.node) {
+ return lookForMedia(node.block.parent.node);
+ }
+ }
+};
diff --git a/node_modules/stylus/lib/functions/define.js b/node_modules/stylus/lib/functions/define.js
new file mode 100644
index 00000000..35b704f6
--- /dev/null
+++ b/node_modules/stylus/lib/functions/define.js
@@ -0,0 +1,23 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Set a variable `name` on current scope.
+ *
+ * @param {String} name
+ * @param {Expression} expr
+ * @param {Boolean} [global]
+ * @api public
+ */
+
+module.exports = function define(name, expr, global){
+ utils.assertType(name, 'string', 'name');
+ expr = utils.unwrap(expr);
+ var scope = this.currentScope;
+ if (global && global.toBoolean().isTrue) {
+ scope = this.global.scope;
+ }
+ var node = new nodes.Ident(name.val, expr);
+ scope.add(node);
+ return nodes.null;
+};
diff --git a/node_modules/stylus/lib/functions/dirname.js b/node_modules/stylus/lib/functions/dirname.js
new file mode 100644
index 00000000..469c82a8
--- /dev/null
+++ b/node_modules/stylus/lib/functions/dirname.js
@@ -0,0 +1,15 @@
+var utils = require('../utils')
+ , path = require('path');
+
+/**
+ * Return the dirname of `path`.
+ *
+ * @param {String} path
+ * @return {String}
+ * @api public
+ */
+
+module.exports = function dirname(p){
+ utils.assertString(p, 'path');
+ return path.dirname(p.val).replace(/\\/g, '/');
+};
diff --git a/node_modules/stylus/lib/functions/error.js b/node_modules/stylus/lib/functions/error.js
new file mode 100644
index 00000000..0330552f
--- /dev/null
+++ b/node_modules/stylus/lib/functions/error.js
@@ -0,0 +1,15 @@
+var utils = require('../utils');
+
+/**
+ * Throw an error with the given `msg`.
+ *
+ * @param {String} msg
+ * @api public
+ */
+
+module.exports = function error(msg){
+ utils.assertType(msg, 'string', 'msg');
+ var err = new Error(msg.val);
+ err.fromStylus = true;
+ throw err;
+};
diff --git a/node_modules/stylus/lib/functions/extname.js b/node_modules/stylus/lib/functions/extname.js
new file mode 100644
index 00000000..d425045d
--- /dev/null
+++ b/node_modules/stylus/lib/functions/extname.js
@@ -0,0 +1,15 @@
+var utils = require('../utils')
+ , path = require('path');
+
+/**
+ * Return the extname of `path`.
+ *
+ * @param {String} path
+ * @return {String}
+ * @api public
+ */
+
+module.exports = function extname(p){
+ utils.assertString(p, 'path');
+ return path.extname(p.val);
+};
diff --git a/node_modules/stylus/lib/functions/green.js b/node_modules/stylus/lib/functions/green.js
new file mode 100644
index 00000000..355b56a5
--- /dev/null
+++ b/node_modules/stylus/lib/functions/green.js
@@ -0,0 +1,33 @@
+var nodes = require('../nodes')
+ , rgba = require('./rgba');
+
+/**
+ * Return the green component of the given `color`,
+ * or set the green component to the optional second `value` argument.
+ *
+ * Examples:
+ *
+ * green(#0c0)
+ * // => 204
+ *
+ * green(#000, 255)
+ * // => #0f0
+ *
+ * @param {RGBA|HSLA} color
+ * @param {Unit} [value]
+ * @return {Unit|RGBA}
+ * @api public
+ */
+
+module.exports = function green(color, value){
+ color = color.rgba;
+ if (value) {
+ return rgba(
+ new nodes.Unit(color.r),
+ value,
+ new nodes.Unit(color.b),
+ new nodes.Unit(color.a)
+ );
+ }
+ return new nodes.Unit(color.g, '');
+};
diff --git a/node_modules/stylus/lib/functions/hsl.js b/node_modules/stylus/lib/functions/hsl.js
new file mode 100644
index 00000000..960eb237
--- /dev/null
+++ b/node_modules/stylus/lib/functions/hsl.js
@@ -0,0 +1,35 @@
+var utils = require('../utils')
+ , nodes = require('../nodes')
+ , hsla = require('./hsla');
+
+/**
+ * Convert the given `color` to an `HSLA` node,
+ * or h,s,l component values.
+ *
+ * Examples:
+ *
+ * hsl(10, 50, 30)
+ * // => HSLA
+ *
+ * hsl(#ffcc00)
+ * // => HSLA
+ *
+ * @param {Unit|HSLA|RGBA} hue
+ * @param {Unit} saturation
+ * @param {Unit} lightness
+ * @return {HSLA}
+ * @api public
+ */
+
+module.exports = function hsl(hue, saturation, lightness){
+ if (1 == arguments.length) {
+ utils.assertColor(hue, 'color');
+ return hue.hsla;
+ } else {
+ return hsla(
+ hue
+ , saturation
+ , lightness
+ , new nodes.Unit(1));
+ }
+};
diff --git a/node_modules/stylus/lib/functions/hsla.js b/node_modules/stylus/lib/functions/hsla.js
new file mode 100644
index 00000000..484f9ae6
--- /dev/null
+++ b/node_modules/stylus/lib/functions/hsla.js
@@ -0,0 +1,53 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Convert the given `color` to an `HSLA` node,
+ * or h,s,l,a component values.
+ *
+ * Examples:
+ *
+ * hsla(10deg, 50%, 30%, 0.5)
+ * // => HSLA
+ *
+ * hsla(#ffcc00)
+ * // => HSLA
+ *
+ * @param {RGBA|HSLA|Unit} hue
+ * @param {Unit} saturation
+ * @param {Unit} lightness
+ * @param {Unit} alpha
+ * @return {HSLA}
+ * @api public
+ */
+
+module.exports = function hsla(hue, saturation, lightness, alpha){
+ switch (arguments.length) {
+ case 1:
+ utils.assertColor(hue);
+ return hue.hsla;
+ case 2:
+ utils.assertColor(hue);
+ var color = hue.hsla;
+ utils.assertType(saturation, 'unit', 'alpha');
+ var alpha = saturation.clone();
+ if ('%' == alpha.type) alpha.val /= 100;
+ return new nodes.HSLA(
+ color.h
+ , color.s
+ , color.l
+ , alpha.val);
+ default:
+ utils.assertType(hue, 'unit', 'hue');
+ utils.assertType(saturation, 'unit', 'saturation');
+ utils.assertType(lightness, 'unit', 'lightness');
+ utils.assertType(alpha, 'unit', 'alpha');
+ var alpha = alpha.clone();
+ if (alpha && '%' == alpha.type) alpha.val /= 100;
+ return new nodes.HSLA(
+ hue.val
+ , saturation.val
+ , lightness.val
+ , alpha.val);
+ }
+};
diff --git a/node_modules/stylus/lib/functions/hue.js b/node_modules/stylus/lib/functions/hue.js
new file mode 100644
index 00000000..3652f9d3
--- /dev/null
+++ b/node_modules/stylus/lib/functions/hue.js
@@ -0,0 +1,34 @@
+var nodes = require('../nodes')
+ , hsla = require('./hsla')
+ , component = require('./component');
+
+/**
+ * Return the hue component of the given `color`,
+ * or set the hue component to the optional second `value` argument.
+ *
+ * Examples:
+ *
+ * hue(#00c)
+ * // => 240deg
+ *
+ * hue(#00c, 90deg)
+ * // => #6c0
+ *
+ * @param {RGBA|HSLA} color
+ * @param {Unit} [value]
+ * @return {Unit|RGBA}
+ * @api public
+ */
+
+module.exports = function hue(color, value){
+ if (value) {
+ var hslaColor = color.hsla;
+ return hsla(
+ value,
+ new nodes.Unit(hslaColor.s),
+ new nodes.Unit(hslaColor.l),
+ new nodes.Unit(hslaColor.a)
+ )
+ }
+ return component(color, new nodes.String('hue'));
+};
diff --git a/node_modules/stylus/lib/functions/image-size.js b/node_modules/stylus/lib/functions/image-size.js
new file mode 100644
index 00000000..56fab0cd
--- /dev/null
+++ b/node_modules/stylus/lib/functions/image-size.js
@@ -0,0 +1,58 @@
+var utils = require('../utils')
+ , nodes = require('../nodes')
+ , Image = require('./image');
+
+/**
+ * Return the width and height of the given `img` path.
+ *
+ * Examples:
+ *
+ * image-size('foo.png')
+ * // => 200px 100px
+ *
+ * image-size('foo.png')[0]
+ * // => 200px
+ *
+ * image-size('foo.png')[1]
+ * // => 100px
+ *
+ * Can be used to test if the image exists,
+ * using an optional argument set to `true`
+ * (without this argument this function throws error
+ * if there is no such image).
+ *
+ * Example:
+ *
+ * image-size('nosuchimage.png', true)[0]
+ * // => 0
+ *
+ * @param {String} img
+ * @param {Boolean} ignoreErr
+ * @return {Expression}
+ * @api public
+ */
+
+module.exports = function imageSize(img, ignoreErr) {
+ utils.assertType(img, 'string', 'img');
+ try {
+ var img = new Image(this, img.string);
+ } catch (err) {
+ if (ignoreErr) {
+ return [new nodes.Unit(0), new nodes.Unit(0)];
+ } else {
+ throw err;
+ }
+ }
+
+ // Read size
+ img.open();
+ var size = img.size();
+ img.close();
+
+ // Return (w h)
+ var expr = [];
+ expr.push(new nodes.Unit(size[0], 'px'));
+ expr.push(new nodes.Unit(size[1], 'px'));
+
+ return expr;
+};
diff --git a/node_modules/stylus/lib/functions/image.js b/node_modules/stylus/lib/functions/image.js
new file mode 100644
index 00000000..5a2c186c
--- /dev/null
+++ b/node_modules/stylus/lib/functions/image.js
@@ -0,0 +1,162 @@
+
+
+/*!
+ * Stylus - plugin - url
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var utils = require('../utils')
+ , nodes = require('../nodes')
+ , fs = require('fs')
+ , path = require('path')
+ , sax = require('sax');
+
+/**
+ * Initialize a new `Image` with the given `ctx` and `path.
+ *
+ * @param {Evaluator} ctx
+ * @param {String} path
+ * @api private
+ */
+
+var Image = module.exports = function Image(ctx, path) {
+ this.ctx = ctx;
+ this.path = utils.lookup(path, ctx.paths);
+ if (!this.path) throw new Error('failed to locate file ' + path);
+};
+
+/**
+ * Open the image for reading.
+ *
+ * @api private
+ */
+
+Image.prototype.open = function(){
+ this.fd = fs.openSync(this.path, 'r');
+ this.length = fs.fstatSync(this.fd).size;
+ this.extname = path.extname(this.path).slice(1);
+};
+
+/**
+ * Close the file.
+ *
+ * @api private
+ */
+
+Image.prototype.close = function(){
+ if (this.fd) fs.closeSync(this.fd);
+};
+
+/**
+ * Return the type of image, supports:
+ *
+ * - gif
+ * - png
+ * - jpeg
+ * - svg
+ *
+ * @return {String}
+ * @api private
+ */
+
+Image.prototype.type = function(){
+ var type
+ , buf = new Buffer(4);
+
+ fs.readSync(this.fd, buf, 0, 4, 0);
+
+ // GIF
+ if (0x47 == buf[0] && 0x49 == buf[1] && 0x46 == buf[2]) type = 'gif';
+
+ // PNG
+ else if (0x50 == buf[1] && 0x4E == buf[2] && 0x47 == buf[3]) type = 'png';
+
+ // JPEG
+ else if (0xff == buf[0] && 0xd8 == buf[1]) type = 'jpeg';
+
+ // SVG
+ else if ('svg' == this.extname) type = this.extname;
+
+ return type;
+};
+
+/**
+ * Return image dimensions `[width, height]`.
+ *
+ * @return {Array}
+ * @api private
+ */
+
+Image.prototype.size = function(){
+ var type = this.type()
+ , width
+ , height
+ , buf
+ , offset
+ , blockSize
+ , parser;
+
+ function uint16(b) { return b[1] << 8 | b[0]; }
+ function uint32(b) { return b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]; }
+
+ // Determine dimensions
+ switch (type) {
+ case 'jpeg':
+ buf = new Buffer(this.length);
+ fs.readSync(this.fd, buf, 0, this.length, 0);
+ offset = 4;
+ blockSize = buf[offset] << 8 | buf[offset + 1];
+
+ while (offset < this.length) {
+ offset += blockSize;
+ if (offset >= this.length || 0xff != buf[offset]) break;
+ // SOF0 or SOF2 (progressive)
+ if (0xc0 == buf[offset + 1] || 0xc2 == buf[offset + 1]) {
+ height = buf[offset + 5] << 8 | buf[offset + 6];
+ width = buf[offset + 7] << 8 | buf[offset + 8];
+ } else {
+ offset += 2;
+ blockSize = buf[offset] << 8 | buf[offset + 1];
+ }
+ }
+ break;
+ case 'png':
+ buf = new Buffer(8);
+ // IHDR chunk width / height uint32_t big-endian
+ fs.readSync(this.fd, buf, 0, 8, 16);
+ width = uint32(buf);
+ height = uint32(buf.slice(4, 8));
+ break;
+ case 'gif':
+ buf = new Buffer(4);
+ // width / height uint16_t little-endian
+ fs.readSync(this.fd, buf, 0, 4, 6);
+ width = uint16(buf);
+ height = uint16(buf.slice(2, 4));
+ break;
+ case 'svg':
+ offset = Math.min(this.length, 1024);
+ buf = new Buffer(offset);
+ fs.readSync(this.fd, buf, 0, offset, 0);
+ buf = buf.toString('utf8');
+ parser = sax.parser(true);
+ parser.onopentag = function(node) {
+ if ('svg' == node.name && node.attributes.width && node.attributes.height) {
+ width = parseInt(node.attributes.width, 10);
+ height = parseInt(node.attributes.height, 10);
+ }
+ };
+ parser.write(buf).close();
+ break;
+ }
+
+ if ('number' != typeof width) throw new Error('failed to find width of "' + this.path + '"');
+ if ('number' != typeof height) throw new Error('failed to find height of "' + this.path + '"');
+
+ return [width, height];
+};
diff --git a/node_modules/stylus/lib/functions/index.js b/node_modules/stylus/lib/functions/index.js
new file mode 100644
index 00000000..e292ed47
--- /dev/null
+++ b/node_modules/stylus/lib/functions/index.js
@@ -0,0 +1,69 @@
+
+/*!
+ * Stylus - Evaluator - built-in functions
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+exports['add-property'] = require('./add-property');
+exports.adjust = require('./adjust');
+exports.alpha = require('./alpha');
+exports['base-convert'] = require('./base-convert');
+exports.basename = require('./basename');
+exports.blend = require('./blend');
+exports.blue = require('./blue');
+exports.clone = require('./clone');
+exports.component = require('./component');
+exports.contrast = require('./contrast');
+exports.convert = require('./convert');
+exports['current-media'] = require('./current-media');
+exports.define = require('./define');
+exports.dirname = require('./dirname');
+exports.error = require('./error');
+exports.extname = require('./extname');
+exports.green = require('./green');
+exports.hsl = require('./hsl');
+exports.hsla = require('./hsla');
+exports.hue = require('./hue');
+exports['image-size'] = require('./image-size');
+exports.json = require('./json');
+exports.length = require('./length');
+exports.lightness = require('./lightness');
+exports['list-separator'] = require('./list-separator');
+exports.lookup = require('./lookup');
+exports.luminosity = require('./luminosity');
+exports.match = require('./match');
+exports.math = require('./math');
+exports.merge = exports.extend = require('./merge');
+exports.operate = require('./operate');
+exports['opposite-position'] = require('./opposite-position');
+exports.p = require('./p');
+exports.pathjoin = require('./pathjoin');
+exports.pop = require('./pop');
+exports.push = exports.append = require('./push');
+exports.range = require('./range');
+exports.red = require('./red');
+exports.remove = require('./remove');
+exports.replace = require('./replace');
+exports.rgb = require('./rgb');
+exports.rgba = require('./rgba');
+exports.s = require('./s');
+exports.saturation = require('./saturation');
+exports['selector-exists'] = require('./selector-exists');
+exports.selector = require('./selector');
+exports.selectors = require('./selectors');
+exports.shift = require('./shift');
+exports.split = require('./split');
+exports.substr = require('./substr');
+exports.slice = require('./slice');
+exports.tan = require('./tan');
+exports.trace = require('./trace');
+exports.transparentify = require('./transparentify');
+exports.type = exports.typeof = exports['type-of'] = require('./type');
+exports.unit = require('./unit');
+exports.unquote = require('./unquote');
+exports.unshift = exports.prepend = require('./unshift');
+exports.use = require('./use');
+exports.warn = require('./warn');
+exports['-math-prop'] = require('./math-prop');
+exports['-prefix-classes'] = require('./prefix-classes');
diff --git a/node_modules/stylus/lib/functions/index.styl b/node_modules/stylus/lib/functions/index.styl
new file mode 100644
index 00000000..2ac9eba5
--- /dev/null
+++ b/node_modules/stylus/lib/functions/index.styl
@@ -0,0 +1,297 @@
+called-from = ()
+
+vendors = moz webkit o ms official
+
+// stringify the given arg
+
+-string(arg)
+ type(arg) + ' ' + arg
+
+// require a color
+
+require-color(color)
+ unless color is a 'color'
+ error('RGB or HSL value expected, got a ' + -string(color))
+
+// require a unit
+
+require-unit(n)
+ unless n is a 'unit'
+ error('unit expected, got a ' + -string(n))
+
+// require a string
+
+require-string(str)
+ unless str is a 'string' or str is a 'ident'
+ error('string expected, got a ' + -string(str))
+
+// Math functions
+
+abs(n) { math(n, 'abs') }
+min(a, b) { a < b ? a : b }
+max(a, b) { a > b ? a : b }
+
+// Trigonometrics
+PI = -math-prop('PI')
+
+radians-to-degrees(angle)
+ angle * (180 / PI)
+
+degrees-to-radians(angle)
+ unit(angle * (PI / 180),'')
+
+sin(n)
+ n = degrees-to-radians(n) if unit(n) == 'deg'
+ round(math(n, 'sin'), 9)
+
+cos(n)
+ n = degrees-to-radians(n) if unit(n) == 'deg'
+ round(math(n, 'cos'), 9)
+
+// Rounding Math functions
+
+ceil(n, precision = 0)
+ multiplier = 10 ** precision
+ math(n * multiplier, 'ceil') / multiplier
+
+floor(n, precision = 0)
+ multiplier = 10 ** precision
+ math(n * multiplier, 'floor') / multiplier
+
+round(n, precision = 0)
+ multiplier = 10 ** precision
+ math(n * multiplier, 'round') / multiplier
+
+// return the sum of the given numbers
+
+sum(nums)
+ sum = 0
+ sum += n for n in nums
+
+// return the average of the given numbers
+
+avg(nums)
+ sum(nums) / length(nums)
+
+// return a unitless number, or pass through
+
+remove-unit(n)
+ if typeof(n) is "unit"
+ unit(n, "")
+ else
+ n
+
+// convert a percent to a decimal, or pass through
+
+percent-to-decimal(n)
+ if unit(n) is "%"
+ remove-unit(n) / 100
+ else
+ n
+
+// check if n is an odd number
+
+odd(n)
+ 1 == n % 2
+
+// check if n is an even number
+
+even(n)
+ 0 == n % 2
+
+// check if color is light
+
+light(color)
+ lightness(color) >= 50%
+
+// check if color is dark
+
+dark(color)
+ lightness(color) < 50%
+
+// desaturate color by amount
+
+desaturate(color, amount)
+ adjust(color, 'saturation', - amount)
+
+// saturate color by amount
+
+saturate(color = '', amount = 100%)
+ if color is a 'color'
+ adjust(color, 'saturation', amount)
+ else
+ unquote( "saturate(" + color + ")" )
+
+// darken by the given amount
+
+darken(color, amount)
+ adjust(color, 'lightness', - amount)
+
+// lighten by the given amount
+
+lighten(color, amount)
+ adjust(color, 'lightness', amount)
+
+// decrease opacity by amount
+
+fade-out(color, amount)
+ color - rgba(black, percent-to-decimal(amount))
+
+// increase opacity by amount
+
+fade-in(color, amount)
+ color + rgba(black, percent-to-decimal(amount))
+
+// spin hue by a given amount
+
+spin(color, amount)
+ color + unit(amount, deg)
+
+// mix two colors by a given amount
+
+mix(color1, color2, weight = 50%)
+ unless weight in 0..100
+ error("Weight must be between 0% and 100%")
+
+ if length(color1) == 2
+ weight = color1[0]
+ color1 = color1[1]
+
+ else if length(color2) == 2
+ weight = 100 - color2[0]
+ color2 = color2[1]
+
+ require-color(color1)
+ require-color(color2)
+
+ p = unit(weight / 100, '')
+ w = p * 2 - 1
+
+ a = alpha(color1) - alpha(color2)
+
+ w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2
+ w2 = 1 - w1
+
+ channels = (red(color1) red(color2)) (green(color1) green(color2)) (blue(color1) blue(color2))
+ rgb = ()
+
+ for pair in channels
+ push(rgb, floor(pair[0] * w1 + pair[1] * w2))
+
+ a1 = alpha(color1) * p
+ a2 = alpha(color2) * (1 - p)
+ alpha = a1 + a2
+
+ rgba(rgb[0], rgb[1], rgb[2], alpha)
+
+// invert colors, leave alpha intact
+
+invert(color = '')
+ if color is a 'color'
+ rgba(#fff - color, alpha(color))
+ else
+ unquote( "invert(" + color + ")" )
+
+// give complement of the given color
+
+complement( color )
+ spin( color, 180 )
+
+// give grayscale of the given color
+
+grayscale( color = '' )
+ if color is a 'color'
+ desaturate( color, 100% )
+ else
+ unquote( "grayscale(" + color + ")" )
+
+// mix the given color with white
+
+tint( color, percent )
+ mix( white, color, percent )
+
+// mix the given color with black
+
+shade( color, percent )
+ mix( black, color, percent )
+
+// return the last value in the given expr
+
+last(expr)
+ expr[length(expr) - 1]
+
+// return keys in the given pairs or object
+
+keys(pairs)
+ ret = ()
+ if type(pairs) == 'object'
+ for key in pairs
+ push(ret, key)
+ else
+ for pair in pairs
+ push(ret, pair[0]);
+ ret
+
+// return values in the given pairs or object
+
+values(pairs)
+ ret = ()
+ if type(pairs) == 'object'
+ for key, val in pairs
+ push(ret, val)
+ else
+ for pair in pairs
+ push(ret, pair[1]);
+ ret
+
+// join values with the given delimiter
+
+join(delim, vals...)
+ buf = ''
+ vals = vals[0] if length(vals) == 1
+ for val, i in vals
+ buf += i ? delim + val : val
+
+// add a CSS rule to the containing block
+
+// - This definition allows add-property to be used as a mixin
+// - It has the same effect as interpolation but allows users
+// to opt for a functional style
+
+add-property-function = add-property
+add-property(name, expr)
+ if mixin
+ {name} expr
+ else
+ add-property-function(name, expr)
+
+prefix-classes(prefix)
+ -prefix-classes(prefix, block)
+
+// Caching mixin, use inside your functions to enable caching by extending.
+
+$stylus_mixin_cache = {}
+cache()
+ $key = (current-media() or 'no-media') + '__' + called-from[0] + '__' + arguments
+ if $key in $stylus_mixin_cache
+ @extend {"$cache_placeholder_for_" + $stylus_mixin_cache[$key]}
+ else if 'cache' in called-from
+ {block}
+ else
+ $id = length($stylus_mixin_cache)
+
+ &,
+ /$cache_placeholder_for_{$id}
+ $stylus_mixin_cache[$key] = $id
+ {block}
+
+// Percentage function to convert a number, e.g. ".45", into a percentage, e.g. "45%"
+
+percentage(num)
+ return unit(num * 100, '%')
+
+// Returns the position of a `value` within a `list`
+
+index(list, value)
+ for val, i in list
+ return i if val == value
diff --git a/node_modules/stylus/lib/functions/json.js b/node_modules/stylus/lib/functions/json.js
new file mode 100644
index 00000000..6b9c5d56
--- /dev/null
+++ b/node_modules/stylus/lib/functions/json.js
@@ -0,0 +1,116 @@
+var utils = require('../utils')
+ , nodes = require('../nodes')
+ , readFile = require('fs').readFileSync;
+
+/**
+ * Convert a .json file into stylus variables or object.
+ * Nested variable object keys are joined with a dash (-)
+ *
+ * Given this sample media-queries.json file:
+ * {
+ * "small": "screen and (max-width:400px)",
+ * "tablet": {
+ * "landscape": "screen and (min-width:600px) and (orientation:landscape)",
+ * "portrait": "screen and (min-width:600px) and (orientation:portrait)"
+ * }
+ * }
+ *
+ * Examples:
+ *
+ * json('media-queries.json')
+ *
+ * @media small
+ * // => @media screen and (max-width:400px)
+ *
+ * @media tablet-landscape
+ * // => @media screen and (min-width:600px) and (orientation:landscape)
+ *
+ * vars = json('vars.json', { hash: true })
+ * body
+ * width: vars.width
+ *
+ * @param {String} path
+ * @param {Boolean} [local]
+ * @param {String} [namePrefix]
+ * @api public
+*/
+
+module.exports = function(path, local, namePrefix){
+ utils.assertString(path, 'path');
+
+ // lookup
+ path = path.string;
+ var found = utils.lookup(path, this.options.paths, this.options.filename)
+ , options = (local && 'object' == local.nodeName) && local;
+
+ if (!found) {
+ // optional JSON file
+ if (options && options.get('optional').toBoolean().isTrue) {
+ return nodes.null;
+ }
+ throw new Error('failed to locate .json file ' + path);
+ }
+
+ // read
+ var json = JSON.parse(readFile(found, 'utf8'));
+
+ if (options) {
+ return convert(json, options);
+ } else {
+ oldJson.call(this, json, local, namePrefix);
+ }
+
+ function convert(obj, options){
+ var ret = new nodes.Object()
+ , leaveStrings = options.get('leave-strings').toBoolean();
+
+ for (var key in obj) {
+ var val = obj[key];
+ if ('object' == typeof val) {
+ ret.set(key, convert(val, options));
+ } else {
+ val = utils.coerce(val);
+ if ('string' == val.nodeName && leaveStrings.isFalse) {
+ val = utils.parseString(val.string);
+ }
+ ret.set(key, val);
+ }
+ }
+ return ret;
+ }
+};
+
+/**
+ * Old `json` BIF.
+ *
+ * @api private
+ */
+
+function oldJson(json, local, namePrefix){
+ if (namePrefix) {
+ utils.assertString(namePrefix, 'namePrefix');
+ namePrefix = namePrefix.val;
+ } else {
+ namePrefix = '';
+ }
+ local = local ? local.toBoolean() : new nodes.Boolean(local);
+ var scope = local.isTrue ? this.currentScope : this.global.scope;
+
+ convert(json);
+ return;
+
+ function convert(obj, prefix){
+ prefix = prefix ? prefix + '-' : '';
+ for (var key in obj){
+ var val = obj[key];
+ var name = prefix + key;
+ if ('object' == typeof val) {
+ convert(val, name);
+ } else {
+ val = utils.coerce(val);
+ if ('string' == val.nodeName) val = utils.parseString(val.string);
+ scope.add({ name: namePrefix + name, val: val });
+ }
+ }
+ }
+};
diff --git a/node_modules/stylus/lib/functions/length.js b/node_modules/stylus/lib/functions/length.js
new file mode 100644
index 00000000..8c0a1c98
--- /dev/null
+++ b/node_modules/stylus/lib/functions/length.js
@@ -0,0 +1,25 @@
+var utils = require('../utils');
+
+/**
+ * Return length of the given `expr`.
+ *
+ * @param {Expression} expr
+ * @return {Unit}
+ * @api public
+ */
+
+(module.exports = function length(expr){
+ if (expr) {
+ if (expr.nodes) {
+ var nodes = utils.unwrap(expr).nodes;
+ if (1 == nodes.length && 'object' == nodes[0].nodeName) {
+ return nodes[0].length;
+ } else {
+ return nodes.length;
+ }
+ } else {
+ return 1;
+ }
+ }
+ return 0;
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/lightness.js b/node_modules/stylus/lib/functions/lightness.js
new file mode 100644
index 00000000..b324a5bb
--- /dev/null
+++ b/node_modules/stylus/lib/functions/lightness.js
@@ -0,0 +1,34 @@
+var nodes = require('../nodes')
+ , hsla = require('./hsla')
+ , component = require('./component');
+
+/**
+ * Return the lightness component of the given `color`,
+ * or set the lightness component to the optional second `value` argument.
+ *
+ * Examples:
+ *
+ * lightness(#00c)
+ * // => 100%
+ *
+ * lightness(#00c, 80%)
+ * // => #99f
+ *
+ * @param {RGBA|HSLA} color
+ * @param {Unit} [value]
+ * @return {Unit|RGBA}
+ * @api public
+ */
+
+module.exports = function lightness(color, value){
+ if (value) {
+ var hslaColor = color.hsla;
+ return hsla(
+ new nodes.Unit(hslaColor.h),
+ new nodes.Unit(hslaColor.s),
+ value,
+ new nodes.Unit(hslaColor.a)
+ )
+ }
+ return component(color, new nodes.String('lightness'));
+};
diff --git a/node_modules/stylus/lib/functions/list-separator.js b/node_modules/stylus/lib/functions/list-separator.js
new file mode 100644
index 00000000..55205409
--- /dev/null
+++ b/node_modules/stylus/lib/functions/list-separator.js
@@ -0,0 +1,25 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Return the separator of the given `list`.
+ *
+ * Examples:
+ *
+ * list1 = a b c
+ * list-separator(list1)
+ * // => ' '
+ *
+ * list2 = a, b, c
+ * list-separator(list2)
+ * // => ','
+ *
+ * @param {Experssion} list
+ * @return {String}
+ * @api public
+ */
+
+(module.exports = function listSeparator(list){
+ list = utils.unwrap(list);
+ return new nodes.String(list.isList ? ',' : ' ');
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/lookup.js b/node_modules/stylus/lib/functions/lookup.js
new file mode 100644
index 00000000..cce33a30
--- /dev/null
+++ b/node_modules/stylus/lib/functions/lookup.js
@@ -0,0 +1,17 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Lookup variable `name` or return Null.
+ *
+ * @param {String} name
+ * @return {Mixed}
+ * @api public
+ */
+
+module.exports = function lookup(name){
+ utils.assertType(name, 'string', 'name');
+ var node = this.lookup(name.val);
+ if (!node) return nodes.null;
+ return this.visit(node);
+};
diff --git a/node_modules/stylus/lib/functions/luminosity.js b/node_modules/stylus/lib/functions/luminosity.js
new file mode 100644
index 00000000..6b6cf7d0
--- /dev/null
+++ b/node_modules/stylus/lib/functions/luminosity.js
@@ -0,0 +1,38 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Returns the relative luminance of the given `color`,
+ * see http://www.w3.org/TR/WCAG20/#relativeluminancedef
+ *
+ * Examples:
+ *
+ * luminosity(white)
+ * // => 1
+ *
+ * luminosity(#000)
+ * // => 0
+ *
+ * luminosity(red)
+ * // => 0.2126
+ *
+ * @param {RGBA|HSLA} color
+ * @return {Unit}
+ * @api public
+ */
+
+module.exports = function luminosity(color){
+ utils.assertColor(color);
+ color = color.rgba;
+ function processChannel(channel) {
+ channel = channel / 255;
+ return (0.03928 > channel)
+ ? channel / 12.92
+ : Math.pow(((channel + 0.055) / 1.055), 2.4);
+ }
+ return new nodes.Unit(
+ 0.2126 * processChannel(color.r)
+ + 0.7152 * processChannel(color.g)
+ + 0.0722 * processChannel(color.b)
+ );
+};
diff --git a/node_modules/stylus/lib/functions/match.js b/node_modules/stylus/lib/functions/match.js
new file mode 100644
index 00000000..3d07cc71
--- /dev/null
+++ b/node_modules/stylus/lib/functions/match.js
@@ -0,0 +1,43 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+var VALID_FLAGS = 'igm';
+
+/**
+ * retrieves the matches when matching a `val`(string)
+ * against a `pattern`(regular expression).
+ *
+ * Examples:
+ * $regex = '^(height|width)?([<>=]{1,})(.*)'
+ *
+ * match($regex,'height>=sm')
+ * // => ('height>=sm' 'height' '>=' 'sm')
+ * // => also truthy
+ *
+ * match($regex, 'lorem ipsum')
+ * // => null
+ *
+ * @param {String} pattern
+ * @param {String|Ident} val
+ * @param {String|Ident} [flags='']
+ * @return {String|Null}
+ * @api public
+ */
+
+module.exports = function match(pattern, val, flags){
+ utils.assertType(pattern, 'string', 'pattern');
+ utils.assertString(val, 'val');
+ var re = new RegExp(pattern.val, validateFlags(flags) ? flags.string : '');
+ return val.string.match(re);
+};
+
+function validateFlags(flags) {
+ flags = flags && flags.string;
+
+ if (flags) {
+ return flags.split('').every(function(flag) {
+ return ~VALID_FLAGS.indexOf(flag);
+ });
+ }
+ return false;
+}
diff --git a/node_modules/stylus/lib/functions/math-prop.js b/node_modules/stylus/lib/functions/math-prop.js
new file mode 100644
index 00000000..06c25e2a
--- /dev/null
+++ b/node_modules/stylus/lib/functions/math-prop.js
@@ -0,0 +1,13 @@
+var nodes = require('../nodes');
+
+/**
+ * Get Math `prop`.
+ *
+ * @param {String} prop
+ * @return {Unit}
+ * @api private
+ */
+
+module.exports = function math(prop){
+ return new nodes.Unit(Math[prop.string]);
+};
diff --git a/node_modules/stylus/lib/functions/math.js b/node_modules/stylus/lib/functions/math.js
new file mode 100644
index 00000000..c3ef6818
--- /dev/null
+++ b/node_modules/stylus/lib/functions/math.js
@@ -0,0 +1,17 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Apply Math `fn` to `n`.
+ *
+ * @param {Unit} n
+ * @param {String} fn
+ * @return {Unit}
+ * @api private
+ */
+
+module.exports = function math(n, fn){
+ utils.assertType(n, 'unit', 'n');
+ utils.assertString(fn, 'fn');
+ return new nodes.Unit(Math[fn.string](n.val), n.type);
+};
diff --git a/node_modules/stylus/lib/functions/merge.js b/node_modules/stylus/lib/functions/merge.js
new file mode 100644
index 00000000..a524973b
--- /dev/null
+++ b/node_modules/stylus/lib/functions/merge.js
@@ -0,0 +1,24 @@
+var utils = require('../utils');
+
+/**
+ * Merge the object `dest` with the given args.
+ *
+ * @param {Object} dest
+ * @param {Object} ...
+ * @return {Object} dest
+ * @api public
+ */
+
+(module.exports = function merge(dest){
+ utils.assertPresent(dest, 'dest');
+ dest = utils.unwrap(dest).first;
+ utils.assertType(dest, 'object', 'dest');
+
+ var last = utils.unwrap(arguments[arguments.length - 1]).first
+ , deep = (true === last.val);
+
+ for (var i = 1, len = arguments.length - deep; i < len; ++i) {
+ utils.merge(dest.vals, utils.unwrap(arguments[i]).first.vals, deep);
+ }
+ return dest;
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/operate.js b/node_modules/stylus/lib/functions/operate.js
new file mode 100644
index 00000000..ae244bab
--- /dev/null
+++ b/node_modules/stylus/lib/functions/operate.js
@@ -0,0 +1,18 @@
+var utils = require('../utils');
+
+/**
+ * Perform `op` on the `left` and `right` operands.
+ *
+ * @param {String} op
+ * @param {Node} left
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+module.exports = function operate(op, left, right){
+ utils.assertType(op, 'string', 'op');
+ utils.assertPresent(left, 'left');
+ utils.assertPresent(right, 'right');
+ return left.operate(op.val, right);
+};
diff --git a/node_modules/stylus/lib/functions/opposite-position.js b/node_modules/stylus/lib/functions/opposite-position.js
new file mode 100644
index 00000000..8a8f4101
--- /dev/null
+++ b/node_modules/stylus/lib/functions/opposite-position.js
@@ -0,0 +1,32 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Return the opposites of the given `positions`.
+ *
+ * Examples:
+ *
+ * opposite-position(top left)
+ * // => bottom right
+ *
+ * @param {Expression} positions
+ * @return {Expression}
+ * @api public
+ */
+
+(module.exports = function oppositePosition(positions){
+ var expr = [];
+ utils.unwrap(positions).nodes.forEach(function(pos, i){
+ utils.assertString(pos, 'position ' + i);
+ pos = (function(){ switch (pos.string) {
+ case 'top': return 'bottom';
+ case 'bottom': return 'top';
+ case 'left': return 'right';
+ case 'right': return 'left';
+ case 'center': return 'center';
+ default: throw new Error('invalid position ' + pos);
+ }})();
+ expr.push(new nodes.Literal(pos));
+ });
+ return expr;
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/p.js b/node_modules/stylus/lib/functions/p.js
new file mode 100644
index 00000000..7d32e572
--- /dev/null
+++ b/node_modules/stylus/lib/functions/p.js
@@ -0,0 +1,18 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Inspect the given `expr`.
+ *
+ * @param {Expression} expr
+ * @api public
+ */
+
+(module.exports = function p(){
+ [].slice.call(arguments).forEach(function(expr){
+ expr = utils.unwrap(expr);
+ if (!expr.nodes.length) return;
+ console.log('\u001b[90minspect:\u001b[0m %s', expr.toString().replace(/^\(|\)$/g, ''));
+ })
+ return nodes.null;
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/pathjoin.js b/node_modules/stylus/lib/functions/pathjoin.js
new file mode 100644
index 00000000..853fe460
--- /dev/null
+++ b/node_modules/stylus/lib/functions/pathjoin.js
@@ -0,0 +1,16 @@
+var path = require('path');
+
+/**
+ * Peform a path join.
+ *
+ * @param {String} path
+ * @return {String}
+ * @api public
+ */
+
+(module.exports = function pathjoin(){
+ var paths = [].slice.call(arguments).map(function(path){
+ return path.first.string;
+ });
+ return path.join.apply(null, paths).replace(/\\/g, '/');
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/pop.js b/node_modules/stylus/lib/functions/pop.js
new file mode 100644
index 00000000..90f7f4b0
--- /dev/null
+++ b/node_modules/stylus/lib/functions/pop.js
@@ -0,0 +1,14 @@
+var utils = require('../utils');
+
+/**
+ * Pop a value from `expr`.
+ *
+ * @param {Expression} expr
+ * @return {Node}
+ * @api public
+ */
+
+(module.exports = function pop(expr) {
+ expr = utils.unwrap(expr);
+ return expr.nodes.pop();
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/prefix-classes.js b/node_modules/stylus/lib/functions/prefix-classes.js
new file mode 100644
index 00000000..12aa816f
--- /dev/null
+++ b/node_modules/stylus/lib/functions/prefix-classes.js
@@ -0,0 +1,22 @@
+var utils = require('../utils');
+
+/**
+ * Prefix css classes in a block
+ *
+ * @param {String} prefix
+ * @param {Block} block
+ * @return {Block}
+ * @api private
+ */
+
+module.exports = function prefixClasses(prefix, block){
+ utils.assertString(prefix, 'prefix');
+ utils.assertType(block, 'block', 'block');
+
+ var _prefix = this.prefix;
+
+ this.options.prefix = this.prefix = prefix.string;
+ block = this.visit(block);
+ this.options.prefix = this.prefix = _prefix;
+ return block;
+};
diff --git a/node_modules/stylus/lib/functions/push.js b/node_modules/stylus/lib/functions/push.js
new file mode 100644
index 00000000..f9448067
--- /dev/null
+++ b/node_modules/stylus/lib/functions/push.js
@@ -0,0 +1,18 @@
+var utils = require('../utils');
+
+/**
+ * Push the given args to `expr`.
+ *
+ * @param {Expression} expr
+ * @param {Node} ...
+ * @return {Unit}
+ * @api public
+ */
+
+(module.exports = function(expr){
+ expr = utils.unwrap(expr);
+ for (var i = 1, len = arguments.length; i < len; ++i) {
+ expr.nodes.push(utils.unwrap(arguments[i]).clone());
+ }
+ return expr.nodes.length;
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/range.js b/node_modules/stylus/lib/functions/range.js
new file mode 100644
index 00000000..7b4660c7
--- /dev/null
+++ b/node_modules/stylus/lib/functions/range.js
@@ -0,0 +1,32 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Returns a list of units from `start` to `stop`
+ * by `step`. If `step` argument is omitted,
+ * it defaults to 1.
+ *
+ * @param {Unit} start
+ * @param {Unit} stop
+ * @param {Unit} [step]
+ * @return {Expression}
+ * @api public
+ */
+
+module.exports = function range(start, stop, step){
+ utils.assertType(start, 'unit', 'start');
+ utils.assertType(stop, 'unit', 'stop');
+ if (step) {
+ utils.assertType(step, 'unit', 'step');
+ if (0 == step.val) {
+ throw new Error('ArgumentError: "step" argument must not be zero');
+ }
+ } else {
+ step = new nodes.Unit(1);
+ }
+ var list = new nodes.Expression;
+ for (var i = start.val; i <= stop.val; i += step.val) {
+ list.push(new nodes.Unit(i, start.type));
+ }
+ return list;
+};
diff --git a/node_modules/stylus/lib/functions/red.js b/node_modules/stylus/lib/functions/red.js
new file mode 100644
index 00000000..0b794121
--- /dev/null
+++ b/node_modules/stylus/lib/functions/red.js
@@ -0,0 +1,33 @@
+var nodes = require('../nodes')
+ , rgba = require('./rgba');
+
+/**
+ * Return the red component of the given `color`,
+ * or set the red component to the optional second `value` argument.
+ *
+ * Examples:
+ *
+ * red(#c00)
+ * // => 204
+ *
+ * red(#000, 255)
+ * // => #f00
+ *
+ * @param {RGBA|HSLA} color
+ * @param {Unit} [value]
+ * @return {Unit|RGBA}
+ * @api public
+ */
+
+module.exports = function red(color, value){
+ color = color.rgba;
+ if (value) {
+ return rgba(
+ value,
+ new nodes.Unit(color.g),
+ new nodes.Unit(color.b),
+ new nodes.Unit(color.a)
+ );
+ }
+ return new nodes.Unit(color.r, '');
+};
diff --git a/node_modules/stylus/lib/functions/remove.js b/node_modules/stylus/lib/functions/remove.js
new file mode 100644
index 00000000..d8e157aa
--- /dev/null
+++ b/node_modules/stylus/lib/functions/remove.js
@@ -0,0 +1,17 @@
+var utils = require('../utils');
+
+/**
+ * Remove the given `key` from the `object`.
+ *
+ * @param {Object} object
+ * @param {String} key
+ * @return {Object}
+ * @api public
+ */
+
+module.exports = function remove(object, key){
+ utils.assertType(object, 'object', 'object');
+ utils.assertString(key, 'key');
+ delete object.vals[key.string];
+ return object;
+};
diff --git a/node_modules/stylus/lib/functions/replace.js b/node_modules/stylus/lib/functions/replace.js
new file mode 100644
index 00000000..15d9c904
--- /dev/null
+++ b/node_modules/stylus/lib/functions/replace.js
@@ -0,0 +1,23 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Returns string with all matches of `pattern` replaced by `replacement` in given `val`
+ *
+ * @param {String} pattern
+ * @param {String} replacement
+ * @param {String|Ident} val
+ * @return {String|Ident}
+ * @api public
+ */
+
+module.exports = function replace(pattern, replacement, val){
+ utils.assertString(pattern, 'pattern');
+ utils.assertString(replacement, 'replacement');
+ utils.assertString(val, 'val');
+ pattern = new RegExp(pattern.string, 'g');
+ var res = val.string.replace(pattern, replacement.string);
+ return val instanceof nodes.Ident
+ ? new nodes.Ident(res)
+ : new nodes.String(res);
+};
diff --git a/node_modules/stylus/lib/functions/resolver.js b/node_modules/stylus/lib/functions/resolver.js
new file mode 100644
index 00000000..e2ce4d01
--- /dev/null
+++ b/node_modules/stylus/lib/functions/resolver.js
@@ -0,0 +1,85 @@
+/**
+ * Module dependencies.
+ */
+
+var Compiler = require('../visitor/compiler')
+ , nodes = require('../nodes')
+ , parse = require('url').parse
+ , relative = require('path').relative
+ , join = require('path').join
+ , dirname = require('path').dirname
+ , extname = require('path').extname
+ , sep = require('path').sep;
+
+/**
+ * Return a url() function which resolves urls.
+ *
+ * Options:
+ *
+ * - `paths` resolution path(s), merged with general lookup paths
+ * - `nocheck` don't check file existence
+ *
+ * Examples:
+ *
+ * stylus(str)
+ * .set('filename', __dirname + '/css/test.styl')
+ * .define('url', stylus.resolver({ nocheck: true }))
+ * .render(function(err, css){ ... })
+ *
+ * @param {Object} [options]
+ * @return {Function}
+ * @api public
+ */
+
+module.exports = function(options) {
+ options = options || {};
+
+ function resolver(url) {
+ // Compile the url
+ var compiler = new Compiler(url)
+ , filename = url.filename;
+ compiler.isURL = true;
+ url = parse(url.nodes.map(function(node){
+ return compiler.visit(node);
+ }).join(''));
+
+ // Parse literal
+ var literal = new nodes.Literal('url("' + url.href + '")')
+ , path = url.pathname
+ , dest = this.options.dest
+ , tail = ''
+ , res;
+
+ // Absolute or hash
+ if (url.protocol || !path || '/' == path[0]) return literal;
+
+ // Check that file exists
+ if (!options.nocheck) {
+ var _paths = options.paths || [];
+ path = require('../utils').lookup(path, _paths.concat(this.paths));
+ if (!path) return literal;
+ }
+
+ if (this.includeCSS && extname(path) == '.css')
+ return new nodes.Literal(url.href);
+
+ if (url.search) tail += url.search;
+ if (url.hash) tail += url.hash;
+
+ if (dest && extname(dest) == '.css')
+ dest = dirname(dest);
+
+ res = relative(dest || dirname(this.filename), options.nocheck
+ ? join(dirname(filename), path)
+ : path) + tail;
+
+ if ('\\' == sep) res = res.replace(/\\/g, '/');
+
+ return new nodes.Literal('url("' + res + '")');
+ };
+
+ // Expose options to Evaluator
+ resolver.options = options;
+ resolver.raw = true;
+ return resolver;
+};
diff --git a/node_modules/stylus/lib/functions/rgb.js b/node_modules/stylus/lib/functions/rgb.js
new file mode 100644
index 00000000..316e90bb
--- /dev/null
+++ b/node_modules/stylus/lib/functions/rgb.js
@@ -0,0 +1,40 @@
+var utils = require('../utils')
+ , nodes = require('../nodes')
+ , rgba = require('./rgba');
+
+/**
+ * Return a `RGBA` from the r,g,b channels.
+ *
+ * Examples:
+ *
+ * rgb(255,204,0)
+ * // => #ffcc00
+ *
+ * rgb(#fff)
+ * // => #fff
+ *
+ * @param {Unit|RGBA|HSLA} red
+ * @param {Unit} green
+ * @param {Unit} blue
+ * @return {RGBA}
+ * @api public
+ */
+
+module.exports = function rgb(red, green, blue){
+ switch (arguments.length) {
+ case 1:
+ utils.assertColor(red);
+ var color = red.rgba;
+ return new nodes.RGBA(
+ color.r
+ , color.g
+ , color.b
+ , 1);
+ default:
+ return rgba(
+ red
+ , green
+ , blue
+ , new nodes.Unit(1));
+ }
+};
diff --git a/node_modules/stylus/lib/functions/rgba.js b/node_modules/stylus/lib/functions/rgba.js
new file mode 100644
index 00000000..81320a17
--- /dev/null
+++ b/node_modules/stylus/lib/functions/rgba.js
@@ -0,0 +1,59 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Return a `RGBA` from the r,g,b,a channels.
+ *
+ * Examples:
+ *
+ * rgba(255,0,0,0.5)
+ * // => rgba(255,0,0,0.5)
+ *
+ * rgba(255,0,0,1)
+ * // => #ff0000
+ *
+ * rgba(#ffcc00, 50%)
+ * // rgba(255,204,0,0.5)
+ *
+ * @param {Unit|RGBA|HSLA} red
+ * @param {Unit} green
+ * @param {Unit} blue
+ * @param {Unit} alpha
+ * @return {RGBA}
+ * @api public
+ */
+
+module.exports = function rgba(red, green, blue, alpha){
+ switch (arguments.length) {
+ case 1:
+ utils.assertColor(red);
+ return red.rgba;
+ case 2:
+ utils.assertColor(red);
+ var color = red.rgba;
+ utils.assertType(green, 'unit', 'alpha');
+ alpha = green.clone();
+ if ('%' == alpha.type) alpha.val /= 100;
+ return new nodes.RGBA(
+ color.r
+ , color.g
+ , color.b
+ , alpha.val);
+ default:
+ utils.assertType(red, 'unit', 'red');
+ utils.assertType(green, 'unit', 'green');
+ utils.assertType(blue, 'unit', 'blue');
+ utils.assertType(alpha, 'unit', 'alpha');
+ var r = '%' == red.type ? Math.round(red.val * 2.55) : red.val
+ , g = '%' == green.type ? Math.round(green.val * 2.55) : green.val
+ , b = '%' == blue.type ? Math.round(blue.val * 2.55) : blue.val;
+
+ alpha = alpha.clone();
+ if (alpha && '%' == alpha.type) alpha.val /= 100;
+ return new nodes.RGBA(
+ r
+ , g
+ , b
+ , alpha.val);
+ }
+};
diff --git a/node_modules/stylus/lib/functions/s.js b/node_modules/stylus/lib/functions/s.js
new file mode 100644
index 00000000..6106c9fc
--- /dev/null
+++ b/node_modules/stylus/lib/functions/s.js
@@ -0,0 +1,37 @@
+var utils = require('../utils')
+ , nodes = require('../nodes')
+ , Compiler = require('../visitor/compiler');
+
+/**
+ * Return a `Literal` with the given `fmt`, and
+ * variable number of arguments.
+ *
+ * @param {String} fmt
+ * @param {Node} ...
+ * @return {Literal}
+ * @api public
+ */
+
+(module.exports = function s(fmt){
+ fmt = utils.unwrap(fmt).nodes[0];
+ utils.assertString(fmt);
+ var self = this
+ , str = fmt.string
+ , args = arguments
+ , i = 1;
+
+ // format
+ str = str.replace(/%(s|d)/g, function(_, specifier){
+ var arg = args[i++] || nodes.null;
+ switch (specifier) {
+ case 's':
+ return new Compiler(arg, self.options).compile();
+ case 'd':
+ arg = utils.unwrap(arg).first;
+ if ('unit' != arg.nodeName) throw new Error('%d requires a unit');
+ return arg.val;
+ }
+ });
+
+ return new nodes.Literal(str);
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/saturation.js b/node_modules/stylus/lib/functions/saturation.js
new file mode 100644
index 00000000..6ad5956d
--- /dev/null
+++ b/node_modules/stylus/lib/functions/saturation.js
@@ -0,0 +1,35 @@
+var nodes = require('../nodes')
+ , hsla = require('./hsla')
+ , component = require('./component');
+
+/**
+ * Return the saturation component of the given `color`,
+ * or set the saturation component to the optional second `value` argument.
+ *
+ * Examples:
+ *
+ * saturation(#00c)
+ * // => 100%
+ *
+ * saturation(#00c, 50%)
+ * // => #339
+ *
+ * @param {RGBA|HSLA} color
+ * @param {Unit} [value]
+ * @return {Unit|RGBA}
+ * @api public
+ */
+
+module.exports = function saturation(color, value){
+ if (value) {
+ var hslaColor = color.hsla;
+ return hsla(
+ new nodes.Unit(hslaColor.h),
+ value,
+ new nodes.Unit(hslaColor.l),
+ new nodes.Unit(hslaColor.a)
+ )
+ }
+ return component(color, new nodes.String('saturation'));
+};
+
diff --git a/node_modules/stylus/lib/functions/selector-exists.js b/node_modules/stylus/lib/functions/selector-exists.js
new file mode 100644
index 00000000..68914af5
--- /dev/null
+++ b/node_modules/stylus/lib/functions/selector-exists.js
@@ -0,0 +1,23 @@
+var utils = require('../utils');
+
+/**
+ * Returns true if the given selector exists.
+ *
+ * @param {String} sel
+ * @return {Boolean}
+ * @api public
+ */
+
+module.exports = function selectorExists(sel) {
+ utils.assertString(sel, 'selector');
+
+ if (!this.__selectorsMap__) {
+ var Normalizer = require('../visitor/normalizer')
+ , visitor = new Normalizer(this.root.clone());
+ visitor.visit(visitor.root);
+
+ this.__selectorsMap__ = visitor.map;
+ }
+
+ return sel.string in this.__selectorsMap__;
+};
diff --git a/node_modules/stylus/lib/functions/selector.js b/node_modules/stylus/lib/functions/selector.js
new file mode 100644
index 00000000..45a421d6
--- /dev/null
+++ b/node_modules/stylus/lib/functions/selector.js
@@ -0,0 +1,71 @@
+var utils = require('../utils');
+
+/**
+ * Return the current selector or compile
+ * selector from a string or a list.
+ *
+ * @param {String|Expression}
+ * @return {String}
+ * @api public
+ */
+
+(module.exports = function selector(){
+ var stack = this.selectorStack
+ , args = [].slice.call(arguments);
+
+ if (1 == args.length) {
+ var expr = utils.unwrap(args[0])
+ , len = expr.nodes.length;
+
+ // selector('.a')
+ if (1 == len) {
+ utils.assertString(expr.first, 'selector');
+ var SelectorParser = require('../selector-parser')
+ , val = expr.first.string
+ , parsed = new SelectorParser(val).parse().val;
+
+ if (parsed == val) return val;
+
+ stack.push(parse(val));
+ } else if (len > 1) {
+ // selector-list = '.a', '.b', '.c'
+ // selector(selector-list)
+ if (expr.isList) {
+ pushToStack(expr.nodes, stack);
+ // selector('.a' '.b' '.c')
+ } else {
+ stack.push(parse(expr.nodes.map(function(node){
+ utils.assertString(node, 'selector');
+ return node.string;
+ }).join(' ')));
+ }
+ }
+ // selector('.a', '.b', '.c')
+ } else if (args.length > 1) {
+ pushToStack(args, stack);
+ }
+
+ return stack.length ? utils.compileSelectors(stack).join(',') : '&';
+}).raw = true;
+
+function pushToStack(selectors, stack) {
+ selectors.forEach(function(sel) {
+ sel = sel.first;
+ utils.assertString(sel, 'selector');
+ stack.push(parse(sel.string));
+ });
+}
+
+function parse(selector) {
+ var Parser = new require('../parser')
+ , parser = new Parser(selector)
+ , nodes;
+ parser.state.push('selector-parts');
+ nodes = parser.selector();
+ nodes.forEach(function(node) {
+ node.val = node.segments.map(function(seg){
+ return seg.toString();
+ }).join('');
+ });
+ return nodes;
+}
diff --git a/node_modules/stylus/lib/functions/selectors.js b/node_modules/stylus/lib/functions/selectors.js
new file mode 100644
index 00000000..ba09d4b6
--- /dev/null
+++ b/node_modules/stylus/lib/functions/selectors.js
@@ -0,0 +1,43 @@
+var nodes = require('../nodes')
+ , Parser = require('../selector-parser');
+
+/**
+ * Return a list with raw selectors parts
+ * of the current group.
+ *
+ * For example:
+ *
+ * .a, .b
+ * .c
+ * .d
+ * test: selectors() // => '.a,.b', '& .c', '& .d'
+ *
+ * @return {Expression}
+ * @api public
+ */
+
+module.exports = function selectors(){
+ var stack = this.selectorStack
+ , expr = new nodes.Expression(true);
+
+ if (stack.length) {
+ for (var i = 0; i < stack.length; i++) {
+ var group = stack[i]
+ , nested;
+
+ if (group.length > 1) {
+ expr.push(new nodes.String(group.map(function(selector) {
+ nested = new Parser(selector.val).parse().nested;
+ return (nested && i ? '& ' : '') + selector.val;
+ }).join(',')))
+ } else {
+ var selector = group[0].val
+ nested = new Parser(selector).parse().nested;
+ expr.push(new nodes.String((nested && i ? '& ' : '') + selector));
+ }
+ }
+ } else {
+ expr.push(new nodes.String('&'));
+ }
+ return expr;
+};
diff --git a/node_modules/stylus/lib/functions/shift.js b/node_modules/stylus/lib/functions/shift.js
new file mode 100644
index 00000000..8a2b5292
--- /dev/null
+++ b/node_modules/stylus/lib/functions/shift.js
@@ -0,0 +1,15 @@
+var utils = require('../utils');
+
+/**
+ * Shift an element from `expr`.
+ *
+ * @param {Expression} expr
+ * @return {Node}
+ * @api public
+ */
+
+ (module.exports = function(expr){
+ expr = utils.unwrap(expr);
+ return expr.nodes.shift();
+ }).raw = true;
+
diff --git a/node_modules/stylus/lib/functions/slice.js b/node_modules/stylus/lib/functions/slice.js
new file mode 100644
index 00000000..d5b9282c
--- /dev/null
+++ b/node_modules/stylus/lib/functions/slice.js
@@ -0,0 +1,28 @@
+var utils = require('../utils'),
+ nodes = require('../nodes');
+
+/**
+ * This is a heler function for the slice method
+ *
+ * @param {String|Ident} vals
+ * @param {Unit} start [0]
+ * @param {Unit} end [vals.length]
+ * @return {String|Literal|Null}
+ * @api public
+*/
+(module.exports = function slice(val, start, end) {
+ start = start && start.nodes[0].val;
+ end = end && end.nodes[0].val;
+
+ val = utils.unwrap(val).nodes;
+
+ if (val.length > 1) {
+ return utils.coerce(val.slice(start, end), true);
+ }
+
+ var result = val[0].string.slice(start, end);
+
+ return val[0] instanceof nodes.Ident
+ ? new nodes.Ident(result)
+ : new nodes.String(result);
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/split.js b/node_modules/stylus/lib/functions/split.js
new file mode 100644
index 00000000..8513c2ff
--- /dev/null
+++ b/node_modules/stylus/lib/functions/split.js
@@ -0,0 +1,25 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Splits the given `val` by `delim`
+ *
+ * @param {String} delim
+ * @param {String|Ident} val
+ * @return {Expression}
+ * @api public
+ */
+
+module.exports = function split(delim, val){
+ utils.assertString(delim, 'delimiter');
+ utils.assertString(val, 'val');
+ var splitted = val.string.split(delim.string);
+ var expr = new nodes.Expression();
+ var ItemNode = val instanceof nodes.Ident
+ ? nodes.Ident
+ : nodes.String;
+ for (var i = 0, len = splitted.length; i < len; ++i) {
+ expr.nodes.push(new ItemNode(splitted[i]));
+ }
+ return expr;
+};
diff --git a/node_modules/stylus/lib/functions/substr.js b/node_modules/stylus/lib/functions/substr.js
new file mode 100644
index 00000000..75bffaf6
--- /dev/null
+++ b/node_modules/stylus/lib/functions/substr.js
@@ -0,0 +1,22 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Returns substring of the given `val`.
+ *
+ * @param {String|Ident} val
+ * @param {Number} start
+ * @param {Number} [length]
+ * @return {String|Ident}
+ * @api public
+ */
+
+module.exports = function substr(val, start, length){
+ utils.assertString(val, 'val');
+ utils.assertType(start, 'unit', 'start');
+ length = length && length.val;
+ var res = val.string.substr(start.val, length);
+ return val instanceof nodes.Ident
+ ? new nodes.Ident(res)
+ : new nodes.String(res);
+};
diff --git a/node_modules/stylus/lib/functions/tan.js b/node_modules/stylus/lib/functions/tan.js
new file mode 100644
index 00000000..311a086a
--- /dev/null
+++ b/node_modules/stylus/lib/functions/tan.js
@@ -0,0 +1,28 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Return the tangent of the given `angle`.
+ *
+ * @param {Unit} angle
+ * @return {Unit}
+ * @api public
+ */
+
+module.exports = function tan(angle) {
+ utils.assertType(angle, 'unit', 'angle');
+
+ var radians = angle.val;
+
+ if (angle.type === 'deg') {
+ radians *= Math.PI / 180;
+ }
+
+ var m = Math.pow(10, 9);
+
+ var sin = Math.round(Math.sin(radians) * m) / m
+ , cos = Math.round(Math.cos(radians) * m) / m
+ , tan = Math.round(m * sin / cos ) / m;
+
+ return new nodes.Unit(tan, '');
+};
diff --git a/node_modules/stylus/lib/functions/trace.js b/node_modules/stylus/lib/functions/trace.js
new file mode 100644
index 00000000..6d75b815
--- /dev/null
+++ b/node_modules/stylus/lib/functions/trace.js
@@ -0,0 +1,12 @@
+var nodes = require('../nodes');
+
+/**
+ * Output stack trace.
+ *
+ * @api public
+ */
+
+module.exports = function trace(){
+ console.log(this.stack);
+ return nodes.null;
+};
diff --git a/node_modules/stylus/lib/functions/transparentify.js b/node_modules/stylus/lib/functions/transparentify.js
new file mode 100644
index 00000000..b7758e81
--- /dev/null
+++ b/node_modules/stylus/lib/functions/transparentify.js
@@ -0,0 +1,63 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Returns the transparent version of the given `top` color,
+ * as if it was blend over the given `bottom` color.
+ *
+ * Examples:
+ *
+ * transparentify(#808080)
+ * => rgba(0,0,0,0.5)
+ *
+ * transparentify(#414141, #000)
+ * => rgba(255,255,255,0.25)
+ *
+ * transparentify(#91974C, #F34949, 0.5)
+ * => rgba(47,229,79,0.5)
+ *
+ * @param {RGBA|HSLA} top
+ * @param {RGBA|HSLA} [bottom=#fff]
+ * @param {Unit} [alpha]
+ * @return {RGBA}
+ * @api public
+ */
+
+module.exports = function transparentify(top, bottom, alpha){
+ utils.assertColor(top);
+ top = top.rgba;
+ // Handle default arguments
+ bottom = bottom || new nodes.RGBA(255, 255, 255, 1);
+ if (!alpha && bottom && !bottom.rgba) {
+ alpha = bottom;
+ bottom = new nodes.RGBA(255, 255, 255, 1);
+ }
+ utils.assertColor(bottom);
+ bottom = bottom.rgba;
+ var bestAlpha = ['r', 'g', 'b'].map(function(channel){
+ return (top[channel] - bottom[channel]) / ((0 < (top[channel] - bottom[channel]) ? 255 : 0) - bottom[channel]);
+ }).sort(function(a, b){return a < b;})[0];
+ if (alpha) {
+ utils.assertType(alpha, 'unit', 'alpha');
+ if ('%' == alpha.type) {
+ bestAlpha = alpha.val / 100;
+ } else if (!alpha.type) {
+ bestAlpha = alpha = alpha.val;
+ }
+ }
+ bestAlpha = Math.max(Math.min(bestAlpha, 1), 0);
+ // Calculate the resulting color
+ function processChannel(channel) {
+ if (0 == bestAlpha) {
+ return bottom[channel]
+ } else {
+ return bottom[channel] + (top[channel] - bottom[channel]) / bestAlpha
+ }
+ }
+ return new nodes.RGBA(
+ processChannel('r'),
+ processChannel('g'),
+ processChannel('b'),
+ Math.round(bestAlpha * 100) / 100
+ );
+}
diff --git a/node_modules/stylus/lib/functions/type.js b/node_modules/stylus/lib/functions/type.js
new file mode 100644
index 00000000..acb5ff35
--- /dev/null
+++ b/node_modules/stylus/lib/functions/type.js
@@ -0,0 +1,30 @@
+var utils = require('../utils');
+
+/**
+ * Return type of `node`.
+ *
+ * Examples:
+ *
+ * type(12)
+ * // => 'unit'
+ *
+ * type(#fff)
+ * // => 'color'
+ *
+ * type(type)
+ * // => 'function'
+ *
+ * type(unbound)
+ * typeof(unbound)
+ * type-of(unbound)
+ * // => 'ident'
+ *
+ * @param {Node} node
+ * @return {String}
+ * @api public
+ */
+
+module.exports = function type(node){
+ utils.assertPresent(node, 'expression');
+ return node.nodeName;
+};
diff --git a/node_modules/stylus/lib/functions/unit.js b/node_modules/stylus/lib/functions/unit.js
new file mode 100644
index 00000000..bd904a55
--- /dev/null
+++ b/node_modules/stylus/lib/functions/unit.js
@@ -0,0 +1,23 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Assign `type` to the given `unit` or return `unit`'s type.
+ *
+ * @param {Unit} unit
+ * @param {String|Ident} type
+ * @return {Unit}
+ * @api public
+ */
+
+module.exports = function unit(unit, type){
+ utils.assertType(unit, 'unit', 'unit');
+
+ // Assign
+ if (type) {
+ utils.assertString(type, 'type');
+ return new nodes.Unit(unit.val, type.string);
+ } else {
+ return unit.type || '';
+ }
+};
diff --git a/node_modules/stylus/lib/functions/unquote.js b/node_modules/stylus/lib/functions/unquote.js
new file mode 100644
index 00000000..41ebb807
--- /dev/null
+++ b/node_modules/stylus/lib/functions/unquote.js
@@ -0,0 +1,23 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Unquote the given `string`.
+ *
+ * Examples:
+ *
+ * unquote("sans-serif")
+ * // => sans-serif
+ *
+ * unquote(sans-serif)
+ * // => sans-serif
+ *
+ * @param {String|Ident} string
+ * @return {Literal}
+ * @api public
+ */
+
+module.exports = function unquote(string){
+ utils.assertString(string, 'string');
+ return new nodes.Literal(string.string);
+};
diff --git a/node_modules/stylus/lib/functions/unshift.js b/node_modules/stylus/lib/functions/unshift.js
new file mode 100644
index 00000000..377ef01c
--- /dev/null
+++ b/node_modules/stylus/lib/functions/unshift.js
@@ -0,0 +1,18 @@
+var utils = require('../utils');
+
+/**
+ * Unshift the given args to `expr`.
+ *
+ * @param {Expression} expr
+ * @param {Node} ...
+ * @return {Unit}
+ * @api public
+ */
+
+(module.exports = function(expr){
+ expr = utils.unwrap(expr);
+ for (var i = 1, len = arguments.length; i < len; ++i) {
+ expr.nodes.unshift(utils.unwrap(arguments[i]));
+ }
+ return expr.nodes.length;
+}).raw = true;
diff --git a/node_modules/stylus/lib/functions/url.js b/node_modules/stylus/lib/functions/url.js
new file mode 100644
index 00000000..616db430
--- /dev/null
+++ b/node_modules/stylus/lib/functions/url.js
@@ -0,0 +1,142 @@
+
+/*!
+ * Stylus - plugin - url
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Compiler = require('../visitor/compiler')
+ , events = require('../renderer').events
+ , nodes = require('../nodes')
+ , parse = require('url').parse
+ , extname = require('path').extname
+ , utils = require('../utils')
+ , fs = require('fs');
+
+/**
+ * Mime table.
+ */
+
+var defaultMimes = {
+ '.gif': 'image/gif'
+ , '.png': 'image/png'
+ , '.jpg': 'image/jpeg'
+ , '.jpeg': 'image/jpeg'
+ , '.svg': 'image/svg+xml'
+ , '.webp': 'image/webp'
+ , '.ttf': 'application/x-font-ttf'
+ , '.eot': 'application/vnd.ms-fontobject'
+ , '.woff': 'application/font-woff'
+ , '.woff2': 'application/font-woff2'
+};
+
+/**
+ * Supported encoding types
+ */
+var encodingTypes = {
+ BASE_64: 'base64',
+ UTF8: 'charset=utf-8'
+}
+
+/**
+ * Return a url() function with the given `options`.
+ *
+ * Options:
+ *
+ * - `limit` bytesize limit defaulting to 30Kb
+ * - `paths` image resolution path(s), merged with general lookup paths
+ *
+ * Examples:
+ *
+ * stylus(str)
+ * .set('filename', __dirname + '/css/test.styl')
+ * .define('url', stylus.url({ paths: [__dirname + '/public'] }))
+ * .render(function(err, css){ ... })
+ *
+ * @param {Object} options
+ * @return {Function}
+ * @api public
+ */
+
+module.exports = function(options) {
+ options = options || {};
+
+ var _paths = options.paths || [];
+ var sizeLimit = null != options.limit ? options.limit : 30000;
+ var mimes = options.mimes || defaultMimes;
+
+ /**
+ * @param {object} url - The path to the image you want to encode.
+ * @param {object} enc - The encoding for the image. Defaults to base64, the
+ * other valid option is `utf8`.
+ */
+ function fn(url, enc){
+ // Compile the url
+ var compiler = new Compiler(url)
+ , encoding = encodingTypes.BASE_64;
+
+ compiler.isURL = true;
+ url = url.nodes.map(function(node){
+ return compiler.visit(node);
+ }).join('');
+
+ // Parse literal
+ url = parse(url);
+ var ext = extname(url.pathname)
+ , mime = mimes[ext]
+ , hash = url.hash || ''
+ , literal = new nodes.Literal('url("' + url.href + '")')
+ , paths = _paths.concat(this.paths)
+ , buf
+ , result;
+
+ // Not supported
+ if (!mime) return literal;
+
+ // Absolute
+ if (url.protocol) return literal;
+
+ // Lookup
+ var found = utils.lookup(url.pathname, paths);
+
+ // Failed to lookup
+ if (!found) {
+ events.emit(
+ 'file not found'
+ , 'File ' + literal + ' could not be found, literal url retained!'
+ );
+
+ return literal;
+ }
+
+ // Read data
+ buf = fs.readFileSync(found);
+
+ // Too large
+ if (false !== sizeLimit && buf.length > sizeLimit) return literal;
+
+ if (enc && 'utf8' == enc.first.val.toLowerCase()) {
+ encoding = encodingTypes.UTF8;
+ result = buf.toString('utf8').replace(/\s+/g, ' ')
+ .replace(/[{}\|\\\^~\[\]`"<>#%]/g, function(match) {
+ return '%' + match[0].charCodeAt(0).toString(16).toUpperCase();
+ }).trim();
+ } else {
+ result = buf.toString(encoding) + hash;
+ }
+
+ // Encode
+ return new nodes.Literal('url("data:' + mime + ';' + encoding + ',' + result + '")');
+ };
+
+ fn.raw = true;
+ return fn;
+};
+
+// Exporting default mimes so we could easily access them
+module.exports.mimes = defaultMimes;
+
diff --git a/node_modules/stylus/lib/functions/use.js b/node_modules/stylus/lib/functions/use.js
new file mode 100644
index 00000000..da28e4d0
--- /dev/null
+++ b/node_modules/stylus/lib/functions/use.js
@@ -0,0 +1,74 @@
+var utils = require('../utils')
+ , path = require('path');
+
+/**
+* Use the given `plugin`
+*
+* Examples:
+*
+* use("plugins/add.js")
+*
+* width add(10, 100)
+* // => width: 110
+*/
+
+module.exports = function use(plugin, options){
+ utils.assertString(plugin, 'plugin');
+
+ if (options) {
+ utils.assertType(options, 'object', 'options');
+ options = parseObject(options);
+ }
+
+ // lookup
+ plugin = plugin.string;
+ var found = utils.lookup(plugin, this.options.paths, this.options.filename);
+ if (!found) throw new Error('failed to locate plugin file "' + plugin + '"');
+
+ // use
+ var fn = require(path.resolve(found));
+ if ('function' != typeof fn) {
+ throw new Error('plugin "' + plugin + '" does not export a function');
+ }
+ this.renderer.use(fn(options || this.options));
+};
+
+/**
+ * Attempt to parse object node to the javascript object.
+ *
+ * @param {Object} obj
+ * @return {Object}
+ * @api private
+ */
+
+function parseObject(obj){
+ obj = obj.vals;
+ for (var key in obj) {
+ var nodes = obj[key].nodes[0].nodes;
+ if (nodes && nodes.length) {
+ obj[key] = [];
+ for (var i = 0, len = nodes.length; i < len; ++i) {
+ obj[key].push(convert(nodes[i]));
+ }
+ } else {
+ obj[key] = convert(obj[key].first);
+ }
+ }
+ return obj;
+
+ function convert(node){
+ switch (node.nodeName) {
+ case 'object':
+ return parseObject(node);
+ case 'boolean':
+ return node.isTrue;
+ case 'unit':
+ return node.type ? node.toString() : +node.val;
+ case 'string':
+ case 'literal':
+ return node.val;
+ default:
+ return node.toString();
+ }
+ }
+}
diff --git a/node_modules/stylus/lib/functions/warn.js b/node_modules/stylus/lib/functions/warn.js
new file mode 100644
index 00000000..eee647d6
--- /dev/null
+++ b/node_modules/stylus/lib/functions/warn.js
@@ -0,0 +1,15 @@
+var utils = require('../utils')
+ , nodes = require('../nodes');
+
+/**
+ * Warn with the given `msg` prefixed by "Warning: ".
+ *
+ * @param {String} msg
+ * @api public
+ */
+
+module.exports = function warn(msg){
+ utils.assertType(msg, 'string', 'msg');
+ console.warn('Warning: %s', msg.val);
+ return nodes.null;
+};
diff --git a/node_modules/stylus/lib/lexer.js b/node_modules/stylus/lib/lexer.js
new file mode 100644
index 00000000..a9457e50
--- /dev/null
+++ b/node_modules/stylus/lib/lexer.js
@@ -0,0 +1,882 @@
+
+/*!
+ * Stylus - Lexer
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Token = require('./token')
+ , nodes = require('./nodes')
+ , errors = require('./errors');
+
+/**
+ * Expose `Lexer`.
+ */
+
+exports = module.exports = Lexer;
+
+/**
+ * Operator aliases.
+ */
+
+var alias = {
+ 'and': '&&'
+ , 'or': '||'
+ , 'is': '=='
+ , 'isnt': '!='
+ , 'is not': '!='
+ , ':=': '?='
+};
+
+/**
+ * Initialize a new `Lexer` with the given `str` and `options`.
+ *
+ * @param {String} str
+ * @param {Object} options
+ * @api private
+ */
+
+function Lexer(str, options) {
+ options = options || {};
+ this.stash = [];
+ this.indentStack = [];
+ this.indentRe = null;
+ this.lineno = 1;
+ this.column = 1;
+
+ // HACK!
+ function comment(str, val, offset, s) {
+ var inComment = s.lastIndexOf('/*', offset) > s.lastIndexOf('*/', offset)
+ , commentIdx = s.lastIndexOf('//', offset)
+ , i = s.lastIndexOf('\n', offset)
+ , double = 0
+ , single = 0;
+
+ if (~commentIdx && commentIdx > i) {
+ while (i != offset) {
+ if ("'" == s[i]) single ? single-- : single++;
+ if ('"' == s[i]) double ? double-- : double++;
+
+ if ('/' == s[i] && '/' == s[i + 1]) {
+ inComment = !single && !double;
+ break;
+ }
+ ++i;
+ }
+ }
+
+ return inComment
+ ? str
+ : val + '\r';
+ };
+
+ // Remove UTF-8 BOM.
+ if ('\uFEFF' == str.charAt(0)) str = str.slice(1);
+
+ this.str = str
+ .replace(/\s+$/, '\n')
+ .replace(/\r\n?/g, '\n')
+ .replace(/\\ *\n/g, '\r')
+ .replace(/([,(:](?!\/\/[^ ])) *(?:\/\/[^\n]*|\/\*.*?\*\/)?\n\s*/g, comment)
+ .replace(/\s*\n[ \t]*([,)])/g, comment);
+};
+
+/**
+ * Lexer prototype.
+ */
+
+Lexer.prototype = {
+
+ /**
+ * Custom inspect.
+ */
+
+ inspect: function(){
+ var tok
+ , tmp = this.str
+ , buf = [];
+ while ('eos' != (tok = this.next()).type) {
+ buf.push(tok.inspect());
+ }
+ this.str = tmp;
+ return buf.concat(tok.inspect()).join('\n');
+ },
+
+ /**
+ * Lookahead `n` tokens.
+ *
+ * @param {Number} n
+ * @return {Object}
+ * @api private
+ */
+
+ lookahead: function(n){
+ var fetch = n - this.stash.length;
+ while (fetch-- > 0) this.stash.push(this.advance());
+ return this.stash[--n];
+ },
+
+ /**
+ * Consume the given `len`.
+ *
+ * @param {Number|Array} len
+ * @api private
+ */
+
+ skip: function(len){
+ var chunk = len[0];
+ len = chunk ? chunk.length : len;
+ this.str = this.str.substr(len);
+ if (chunk) {
+ this.move(chunk);
+ } else {
+ this.column += len;
+ }
+ },
+
+ /**
+ * Move current line and column position.
+ *
+ * @param {String} str
+ * @api private
+ */
+
+ move: function(str){
+ var lines = str.match(/\n/g)
+ , idx = str.lastIndexOf('\n');
+
+ if (lines) this.lineno += lines.length;
+ this.column = ~idx
+ ? str.length - idx
+ : this.column + str.length;
+ },
+
+ /**
+ * Fetch next token including those stashed by peek.
+ *
+ * @return {Token}
+ * @api private
+ */
+
+ next: function() {
+ var tok = this.stashed() || this.advance();
+ this.prev = tok;
+ return tok;
+ },
+
+ /**
+ * Check if the current token is a part of selector.
+ *
+ * @return {Boolean}
+ * @api private
+ */
+
+ isPartOfSelector: function() {
+ var tok = this.stash[this.stash.length - 1] || this.prev;
+ switch (tok && tok.type) {
+ // #for
+ case 'color':
+ return 2 == tok.val.raw.length;
+ // .or
+ case '.':
+ // [is]
+ case '[':
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * Fetch next token.
+ *
+ * @return {Token}
+ * @api private
+ */
+
+ advance: function() {
+ var column = this.column
+ , line = this.lineno
+ , tok = this.eos()
+ || this.null()
+ || this.sep()
+ || this.keyword()
+ || this.urlchars()
+ || this.comment()
+ || this.newline()
+ || this.escaped()
+ || this.important()
+ || this.literal()
+ || this.anonFunc()
+ || this.atrule()
+ || this.function()
+ || this.brace()
+ || this.paren()
+ || this.color()
+ || this.string()
+ || this.unit()
+ || this.namedop()
+ || this.boolean()
+ || this.unicode()
+ || this.ident()
+ || this.op()
+ || this.eol()
+ || this.space()
+ || this.selector();
+ tok.lineno = line;
+ tok.column = column;
+ return tok;
+ },
+
+ /**
+ * Lookahead a single token.
+ *
+ * @return {Token}
+ * @api private
+ */
+
+ peek: function() {
+ return this.lookahead(1);
+ },
+
+ /**
+ * Return the next possibly stashed token.
+ *
+ * @return {Token}
+ * @api private
+ */
+
+ stashed: function() {
+ return this.stash.shift();
+ },
+
+ /**
+ * EOS | trailing outdents.
+ */
+
+ eos: function() {
+ if (this.str.length) return;
+ if (this.indentStack.length) {
+ this.indentStack.shift();
+ return new Token('outdent');
+ } else {
+ return new Token('eos');
+ }
+ },
+
+ /**
+ * url char
+ */
+
+ urlchars: function() {
+ var captures;
+ if (!this.isURL) return;
+ if (captures = /^[\/:@.;?&=*!,<>#%0-9]+/.exec(this.str)) {
+ this.skip(captures);
+ return new Token('literal', new nodes.Literal(captures[0]));
+ }
+ },
+
+ /**
+ * ';' [ \t]*
+ */
+
+ sep: function() {
+ var captures;
+ if (captures = /^;[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ return new Token(';');
+ }
+ },
+
+ /**
+ * '\r'
+ */
+
+ eol: function() {
+ if ('\r' == this.str[0]) {
+ ++this.lineno;
+ this.skip(1);
+ return this.advance();
+ }
+ },
+
+ /**
+ * ' '+
+ */
+
+ space: function() {
+ var captures;
+ if (captures = /^([ \t]+)/.exec(this.str)) {
+ this.skip(captures);
+ return new Token('space');
+ }
+ },
+
+ /**
+ * '\\' . ' '*
+ */
+
+ escaped: function() {
+ var captures;
+ if (captures = /^\\(.)[ \t]*/.exec(this.str)) {
+ var c = captures[1];
+ this.skip(captures);
+ return new Token('ident', new nodes.Literal(c));
+ }
+ },
+
+ /**
+ * '@css' ' '* '{' .* '}' ' '*
+ */
+
+ literal: function() {
+ // HACK attack !!!
+ var captures;
+ if (captures = /^@css[ \t]*\{/.exec(this.str)) {
+ this.skip(captures);
+ var c
+ , braces = 1
+ , css = ''
+ , node;
+ while (c = this.str[0]) {
+ this.str = this.str.substr(1);
+ switch (c) {
+ case '{': ++braces; break;
+ case '}': --braces; break;
+ case '\n':
+ case '\r':
+ ++this.lineno;
+ break;
+ }
+ css += c;
+ if (!braces) break;
+ }
+ css = css.replace(/\s*}$/, '');
+ node = new nodes.Literal(css);
+ node.css = true;
+ return new Token('literal', node);
+ }
+ },
+
+ /**
+ * '!important' ' '*
+ */
+
+ important: function() {
+ var captures;
+ if (captures = /^!important[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ return new Token('ident', new nodes.Literal('!important'));
+ }
+ },
+
+ /**
+ * '{' | '}'
+ */
+
+ brace: function() {
+ var captures;
+ if (captures = /^([{}])/.exec(this.str)) {
+ this.skip(1);
+ var brace = captures[1];
+ return new Token(brace, brace);
+ }
+ },
+
+ /**
+ * '(' | ')' ' '*
+ */
+
+ paren: function() {
+ var captures;
+ if (captures = /^([()])([ \t]*)/.exec(this.str)) {
+ var paren = captures[1];
+ this.skip(captures);
+ if (')' == paren) this.isURL = false;
+ var tok = new Token(paren, paren);
+ tok.space = captures[2];
+ return tok;
+ }
+ },
+
+ /**
+ * 'null'
+ */
+
+ null: function() {
+ var captures
+ , tok;
+ if (captures = /^(null)\b[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ if (this.isPartOfSelector()) {
+ tok = new Token('ident', new nodes.Ident(captures[0]));
+ } else {
+ tok = new Token('null', nodes.null);
+ }
+ return tok;
+ }
+ },
+
+ /**
+ * 'if'
+ * | 'else'
+ * | 'unless'
+ * | 'return'
+ * | 'for'
+ * | 'in'
+ */
+
+ keyword: function() {
+ var captures
+ , tok;
+ if (captures = /^(return|if|else|unless|for|in)\b[ \t]*/.exec(this.str)) {
+ var keyword = captures[1];
+ this.skip(captures);
+ if (this.isPartOfSelector()) {
+ tok = new Token('ident', new nodes.Ident(captures[0]));
+ } else {
+ tok = new Token(keyword, keyword);
+ }
+ return tok;
+ }
+ },
+
+ /**
+ * 'not'
+ * | 'and'
+ * | 'or'
+ * | 'is'
+ * | 'is not'
+ * | 'isnt'
+ * | 'is a'
+ * | 'is defined'
+ */
+
+ namedop: function() {
+ var captures
+ , tok;
+ if (captures = /^(not|and|or|is a|is defined|isnt|is not|is)(?!-)\b([ \t]*)/.exec(this.str)) {
+ var op = captures[1];
+ this.skip(captures);
+ if (this.isPartOfSelector()) {
+ tok = new Token('ident', new nodes.Ident(captures[0]));
+ } else {
+ op = alias[op] || op;
+ tok = new Token(op, op);
+ }
+ tok.space = captures[2];
+ return tok;
+ }
+ },
+
+ /**
+ * ','
+ * | '+'
+ * | '+='
+ * | '-'
+ * | '-='
+ * | '*'
+ * | '*='
+ * | '/'
+ * | '/='
+ * | '%'
+ * | '%='
+ * | '**'
+ * | '!'
+ * | '&'
+ * | '&&'
+ * | '||'
+ * | '>'
+ * | '>='
+ * | '<'
+ * | '<='
+ * | '='
+ * | '=='
+ * | '!='
+ * | '!'
+ * | '~'
+ * | '?='
+ * | ':='
+ * | '?'
+ * | ':'
+ * | '['
+ * | ']'
+ * | '.'
+ * | '..'
+ * | '...'
+ */
+
+ op: function() {
+ var captures;
+ if (captures = /^([.]{1,3}|&&|\|\||[!<>=?:]=|\*\*|[-+*\/%]=?|[,=?:!~<>&\[\]])([ \t]*)/.exec(this.str)) {
+ var op = captures[1];
+ this.skip(captures);
+ op = alias[op] || op;
+ var tok = new Token(op, op);
+ tok.space = captures[2];
+ this.isURL = false;
+ return tok;
+ }
+ },
+
+ /**
+ * '@('
+ */
+
+ anonFunc: function() {
+ var tok;
+ if ('@' == this.str[0] && '(' == this.str[1]) {
+ this.skip(2);
+ tok = new Token('function', new nodes.Ident('anonymous'));
+ tok.anonymous = true;
+ return tok;
+ }
+ },
+
+ /**
+ * '@' (-(\w+)-)?[a-zA-Z0-9-_]+
+ */
+
+ atrule: function() {
+ var captures;
+ if (captures = /^@(?:-(\w+)-)?([a-zA-Z0-9-_]+)[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ var vendor = captures[1]
+ , type = captures[2]
+ , tok;
+ switch (type) {
+ case 'require':
+ case 'import':
+ case 'charset':
+ case 'namespace':
+ case 'media':
+ case 'scope':
+ case 'supports':
+ return new Token(type);
+ case 'document':
+ return new Token('-moz-document');
+ case 'block':
+ return new Token('atblock');
+ case 'extend':
+ case 'extends':
+ return new Token('extend');
+ case 'keyframes':
+ return new Token(type, vendor);
+ default:
+ return new Token('atrule', (vendor ? '-' + vendor + '-' + type : type));
+ }
+ }
+ },
+
+ /**
+ * '//' *
+ */
+
+ comment: function() {
+ // Single line
+ if ('/' == this.str[0] && '/' == this.str[1]) {
+ var end = this.str.indexOf('\n');
+ if (-1 == end) end = this.str.length;
+ this.skip(end);
+ return this.advance();
+ }
+
+ // Multi-line
+ if ('/' == this.str[0] && '*' == this.str[1]) {
+ var end = this.str.indexOf('*/');
+ if (-1 == end) end = this.str.length;
+ var str = this.str.substr(0, end + 2)
+ , lines = str.split(/\n|\r/).length - 1
+ , suppress = true
+ , inline = false;
+ this.lineno += lines;
+ this.skip(end + 2);
+ // output
+ if ('!' == str[2]) {
+ str = str.replace('*!', '*');
+ suppress = false;
+ }
+ if (this.prev && ';' == this.prev.type) inline = true;
+ return new Token('comment', new nodes.Comment(str, suppress, inline));
+ }
+ },
+
+ /**
+ * 'true' | 'false'
+ */
+
+ boolean: function() {
+ var captures;
+ if (captures = /^(true|false)\b([ \t]*)/.exec(this.str)) {
+ var val = nodes.Boolean('true' == captures[1]);
+ this.skip(captures);
+ var tok = new Token('boolean', val);
+ tok.space = captures[2];
+ return tok;
+ }
+ },
+
+ /**
+ * 'U+' [0-9A-Fa-f?]{1,6}(?:-[0-9A-Fa-f]{1,6})?
+ */
+
+ unicode: function() {
+ var captures;
+ if (captures = /^u\+[0-9a-f?]{1,6}(?:-[0-9a-f]{1,6})?/i.exec(this.str)) {
+ this.skip(captures);
+ return new Token('literal', new nodes.Literal(captures[0]));
+ }
+ },
+
+ /**
+ * -*[_a-zA-Z$] [-\w\d$]* '('
+ */
+
+ function: function() {
+ var captures;
+ if (captures = /^(-*[_a-zA-Z$][-\w\d$]*)\(([ \t]*)/.exec(this.str)) {
+ var name = captures[1];
+ this.skip(captures);
+ this.isURL = 'url' == name;
+ var tok = new Token('function', new nodes.Ident(name));
+ tok.space = captures[2];
+ return tok;
+ }
+ },
+
+ /**
+ * -*[_a-zA-Z$] [-\w\d$]*
+ */
+
+ ident: function() {
+ var captures;
+ if (captures = /^-*[_a-zA-Z$][-\w\d$]*/.exec(this.str)) {
+ this.skip(captures);
+ return new Token('ident', new nodes.Ident(captures[0]));
+ }
+ },
+
+ /**
+ * '\n' ' '+
+ */
+
+ newline: function() {
+ var captures, re;
+
+ // we have established the indentation regexp
+ if (this.indentRe){
+ captures = this.indentRe.exec(this.str);
+ // figure out if we are using tabs or spaces
+ } else {
+ // try tabs
+ re = /^\n([\t]*)[ \t]*/;
+ captures = re.exec(this.str);
+
+ // nope, try spaces
+ if (captures && !captures[1].length) {
+ re = /^\n([ \t]*)/;
+ captures = re.exec(this.str);
+ }
+
+ // established
+ if (captures && captures[1].length) this.indentRe = re;
+ }
+
+
+ if (captures) {
+ var tok
+ , indents = captures[1].length;
+
+ this.skip(captures);
+ if (this.str[0] === ' ' || this.str[0] === '\t') {
+ throw new errors.SyntaxError('Invalid indentation. You can use tabs or spaces to indent, but not both.');
+ }
+
+ // Blank line
+ if ('\n' == this.str[0]) return this.advance();
+
+ // Outdent
+ if (this.indentStack.length && indents < this.indentStack[0]) {
+ while (this.indentStack.length && this.indentStack[0] > indents) {
+ this.stash.push(new Token('outdent'));
+ this.indentStack.shift();
+ }
+ tok = this.stash.pop();
+ // Indent
+ } else if (indents && indents != this.indentStack[0]) {
+ this.indentStack.unshift(indents);
+ tok = new Token('indent');
+ // Newline
+ } else {
+ tok = new Token('newline');
+ }
+
+ return tok;
+ }
+ },
+
+ /**
+ * '-'? (digit+ | digit* '.' digit+) unit
+ */
+
+ unit: function() {
+ var captures;
+ if (captures = /^(-)?(\d+\.\d+|\d+|\.\d+)(%|[a-zA-Z]+)?[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ var n = parseFloat(captures[2]);
+ if ('-' == captures[1]) n = -n;
+ var node = new nodes.Unit(n, captures[3]);
+ node.raw = captures[0];
+ return new Token('unit', node);
+ }
+ },
+
+ /**
+ * '"' [^"]+ '"' | "'"" [^']+ "'"
+ */
+
+ string: function() {
+ var captures;
+ if (captures = /^("[^"]*"|'[^']*')[ \t]*/.exec(this.str)) {
+ var str = captures[1]
+ , quote = captures[0][0];
+ this.skip(captures);
+ str = str.slice(1,-1).replace(/\\n/g, '\n');
+ return new Token('string', new nodes.String(str, quote));
+ }
+ },
+
+ /**
+ * #rrggbbaa | #rrggbb | #rgba | #rgb | #nn | #n
+ */
+
+ color: function() {
+ return this.rrggbbaa()
+ || this.rrggbb()
+ || this.rgba()
+ || this.rgb()
+ || this.nn()
+ || this.n()
+ },
+
+ /**
+ * #n
+ */
+
+ n: function() {
+ var captures;
+ if (captures = /^#([a-fA-F0-9]{1})[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ var n = parseInt(captures[1] + captures[1], 16)
+ , color = new nodes.RGBA(n, n, n, 1);
+ color.raw = captures[0];
+ return new Token('color', color);
+ }
+ },
+
+ /**
+ * #nn
+ */
+
+ nn: function() {
+ var captures;
+ if (captures = /^#([a-fA-F0-9]{2})[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ var n = parseInt(captures[1], 16)
+ , color = new nodes.RGBA(n, n, n, 1);
+ color.raw = captures[0];
+ return new Token('color', color);
+ }
+ },
+
+ /**
+ * #rgb
+ */
+
+ rgb: function() {
+ var captures;
+ if (captures = /^#([a-fA-F0-9]{3})[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ var rgb = captures[1]
+ , r = parseInt(rgb[0] + rgb[0], 16)
+ , g = parseInt(rgb[1] + rgb[1], 16)
+ , b = parseInt(rgb[2] + rgb[2], 16)
+ , color = new nodes.RGBA(r, g, b, 1);
+ color.raw = captures[0];
+ return new Token('color', color);
+ }
+ },
+
+ /**
+ * #rgba
+ */
+
+ rgba: function() {
+ var captures;
+ if (captures = /^#([a-fA-F0-9]{4})[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ var rgb = captures[1]
+ , r = parseInt(rgb[0] + rgb[0], 16)
+ , g = parseInt(rgb[1] + rgb[1], 16)
+ , b = parseInt(rgb[2] + rgb[2], 16)
+ , a = parseInt(rgb[3] + rgb[3], 16)
+ , color = new nodes.RGBA(r, g, b, a/255);
+ color.raw = captures[0];
+ return new Token('color', color);
+ }
+ },
+
+ /**
+ * #rrggbb
+ */
+
+ rrggbb: function() {
+ var captures;
+ if (captures = /^#([a-fA-F0-9]{6})[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ var rgb = captures[1]
+ , r = parseInt(rgb.substr(0, 2), 16)
+ , g = parseInt(rgb.substr(2, 2), 16)
+ , b = parseInt(rgb.substr(4, 2), 16)
+ , color = new nodes.RGBA(r, g, b, 1);
+ color.raw = captures[0];
+ return new Token('color', color);
+ }
+ },
+
+ /**
+ * #rrggbbaa
+ */
+
+ rrggbbaa: function() {
+ var captures;
+ if (captures = /^#([a-fA-F0-9]{8})[ \t]*/.exec(this.str)) {
+ this.skip(captures);
+ var rgb = captures[1]
+ , r = parseInt(rgb.substr(0, 2), 16)
+ , g = parseInt(rgb.substr(2, 2), 16)
+ , b = parseInt(rgb.substr(4, 2), 16)
+ , a = parseInt(rgb.substr(6, 2), 16)
+ , color = new nodes.RGBA(r, g, b, a/255);
+ color.raw = captures[0];
+ return new Token('color', color);
+ }
+ },
+
+ /**
+ * ^|[^\n,;]+
+ */
+
+ selector: function() {
+ var captures;
+ if (captures = /^\^|.*?(?=\/\/(?![^\[]*\])|[,\n{])/.exec(this.str)) {
+ var selector = captures[0];
+ this.skip(captures);
+ return new Token('selector', selector);
+ }
+ }
+};
diff --git a/node_modules/stylus/lib/middleware.js b/node_modules/stylus/lib/middleware.js
new file mode 100644
index 00000000..b6e901a3
--- /dev/null
+++ b/node_modules/stylus/lib/middleware.js
@@ -0,0 +1,256 @@
+/*!
+ * Stylus - middleware
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var stylus = require('./stylus')
+ , fs = require('fs')
+ , url = require('url')
+ , dirname = require('path').dirname
+ , mkdirp = require('mkdirp')
+ , join = require('path').join
+ , sep = require('path').sep
+ , debug = require('debug')('stylus:middleware');
+
+/**
+ * Import map.
+ */
+
+var imports = {};
+
+/**
+ * Return Connect middleware with the given `options`.
+ *
+ * Options:
+ *
+ * `force` Always re-compile
+ * `src` Source directory used to find .styl files,
+ * a string or function accepting `(path)` of request.
+ * `dest` Destination directory used to output .css files,
+ * a string or function accepting `(path)` of request,
+ * when undefined defaults to `src`.
+ * `compile` Custom compile function, accepting the arguments
+ * `(str, path)`.
+ * `compress` Whether the output .css files should be compressed
+ * `firebug` Emits debug infos in the generated CSS that can
+ * be used by the FireStylus Firebug plugin
+ * `linenos` Emits comments in the generated CSS indicating
+ * the corresponding Stylus line
+ * 'sourcemap' Generates a sourcemap in sourcemaps v3 format
+ *
+ * Examples:
+ *
+ * Here we set up the custom compile function so that we may
+ * set the `compress` option, or define additional functions.
+ *
+ * By default the compile function simply sets the `filename`
+ * and renders the CSS.
+ *
+ * function compile(str, path) {
+ * return stylus(str)
+ * .set('filename', path)
+ * .set('compress', true);
+ * }
+ *
+ * Pass the middleware to Connect, grabbing .styl files from this directory
+ * and saving .css files to _./public_. Also supplying our custom `compile` function.
+ *
+ * Following that we have a `static()` layer setup to serve the .css
+ * files generated by Stylus.
+ *
+ * var app = connect();
+ *
+ * app.middleware({
+ * src: __dirname
+ * , dest: __dirname + '/public'
+ * , compile: compile
+ * })
+ *
+ * app.use(connect.static(__dirname + '/public'));
+ *
+ * @param {Object} options
+ * @return {Function}
+ * @api public
+ */
+
+module.exports = function(options){
+ options = options || {};
+
+ // Accept src/dest dir
+ if ('string' == typeof options) {
+ options = { src: options };
+ }
+
+ // Force compilation
+ var force = options.force;
+
+ // Source dir required
+ var src = options.src;
+ if (!src) throw new Error('stylus.middleware() requires "src" directory');
+
+ // Default dest dir to source
+ var dest = options.dest || src;
+
+ // Default compile callback
+ options.compile = options.compile || function(str, path){
+ // inline sourcemap
+ if (options.sourcemap) {
+ if ('boolean' == typeof options.sourcemap)
+ options.sourcemap = {};
+ options.sourcemap.inline = true;
+ }
+
+ return stylus(str)
+ .set('filename', path)
+ .set('compress', options.compress)
+ .set('firebug', options.firebug)
+ .set('linenos', options.linenos)
+ .set('sourcemap', options.sourcemap);
+ };
+
+ // Middleware
+ return function stylus(req, res, next){
+ if ('GET' != req.method && 'HEAD' != req.method) return next();
+ var path = url.parse(req.url).pathname;
+ if (/\.css$/.test(path)) {
+
+ if (typeof dest == 'string') {
+ // check for dest-path overlap
+ var overlap = compare(dest, path).length;
+ if ('/' == path.charAt(0)) overlap++;
+ path = path.slice(overlap);
+ }
+
+ var cssPath, stylusPath;
+ cssPath = (typeof dest == 'function')
+ ? dest(path)
+ : join(dest, path);
+ stylusPath = (typeof src == 'function')
+ ? src(path)
+ : join(src, path.replace('.css', '.styl'));
+
+ // Ignore ENOENT to fall through as 404
+ function error(err) {
+ next('ENOENT' == err.code
+ ? null
+ : err);
+ }
+
+ // Force
+ if (force) return compile();
+
+ // Compile to cssPath
+ function compile() {
+ debug('read %s', cssPath);
+ fs.readFile(stylusPath, 'utf8', function(err, str){
+ if (err) return error(err);
+ var style = options.compile(str, stylusPath);
+ var paths = style.options._imports = [];
+ imports[stylusPath] = null;
+ style.render(function(err, css){
+ if (err) return next(err);
+ debug('render %s', stylusPath);
+ imports[stylusPath] = paths;
+ mkdirp(dirname(cssPath), parseInt('0700', 8), function(err){
+ if (err) return error(err);
+ fs.writeFile(cssPath, css, 'utf8', next);
+ });
+ });
+ });
+ }
+
+ // Re-compile on server restart, disregarding
+ // mtimes since we need to map imports
+ if (!imports[stylusPath]) return compile();
+
+ // Compare mtimes
+ fs.stat(stylusPath, function(err, stylusStats){
+ if (err) return error(err);
+ fs.stat(cssPath, function(err, cssStats){
+ // CSS has not been compiled, compile it!
+ if (err) {
+ if ('ENOENT' == err.code) {
+ debug('not found %s', cssPath);
+ compile();
+ } else {
+ next(err);
+ }
+ } else {
+ // Source has changed, compile it
+ if (stylusStats.mtime > cssStats.mtime) {
+ debug('modified %s', cssPath);
+ compile();
+ // Already compiled, check imports
+ } else {
+ checkImports(stylusPath, function(changed){
+ if (debug && changed.length) {
+ changed.forEach(function(path) {
+ debug('modified import %s', path);
+ });
+ }
+ changed.length ? compile() : next();
+ });
+ }
+ }
+ });
+ });
+ } else {
+ next();
+ }
+ }
+};
+
+/**
+ * Check `path`'s imports to see if they have been altered.
+ *
+ * @param {String} path
+ * @param {Function} fn
+ * @api private
+ */
+
+function checkImports(path, fn) {
+ var nodes = imports[path];
+ if (!nodes) return fn();
+ if (!nodes.length) return fn();
+
+ var pending = nodes.length
+ , changed = [];
+
+ nodes.forEach(function(imported){
+ fs.stat(imported.path, function(err, stat){
+ // error or newer mtime
+ if (err || !imported.mtime || stat.mtime > imported.mtime) {
+ changed.push(imported.path);
+ }
+ --pending || fn(changed);
+ });
+ });
+}
+
+/**
+ * get the overlaping path from the end of path A, and the begining of path B.
+ *
+ * @param {String} pathA
+ * @param {String} pathB
+ * @return {String}
+ * @api private
+ */
+
+function compare(pathA, pathB) {
+ pathA = pathA.split(sep);
+ pathB = pathB.split('/');
+ if (!pathA[pathA.length - 1]) pathA.pop();
+ if (!pathB[0]) pathB.shift();
+ var overlap = [];
+
+ while (pathA[pathA.length - 1] == pathB[0]) {
+ overlap.push(pathA.pop());
+ pathB.shift();
+ }
+ return overlap.join('/');
+}
diff --git a/node_modules/stylus/lib/nodes/arguments.js b/node_modules/stylus/lib/nodes/arguments.js
new file mode 100644
index 00000000..3c56b49c
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/arguments.js
@@ -0,0 +1,92 @@
+
+/*!
+ * Stylus - Arguments
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('../nodes')
+ , utils = require('../utils');
+
+/**
+ * Initialize a new `Arguments`.
+ *
+ * @api public
+ */
+
+var Arguments = module.exports = function Arguments(){
+ nodes.Expression.call(this);
+ this.map = {};
+};
+
+/**
+ * Inherit from `nodes.Expression.prototype`.
+ */
+
+Arguments.prototype.__proto__ = nodes.Expression.prototype;
+
+/**
+ * Initialize an `Arguments` object with the nodes
+ * from the given `expr`.
+ *
+ * @param {Expression} expr
+ * @return {Arguments}
+ * @api public
+ */
+
+Arguments.fromExpression = function(expr){
+ var args = new Arguments
+ , len = expr.nodes.length;
+ args.lineno = expr.lineno;
+ args.column = expr.column;
+ args.isList = expr.isList;
+ for (var i = 0; i < len; ++i) {
+ args.push(expr.nodes[i]);
+ }
+ return args;
+};
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Arguments.prototype.clone = function(parent){
+ var clone = nodes.Expression.prototype.clone.call(this, parent);
+ clone.map = {};
+ for (var key in this.map) {
+ clone.map[key] = this.map[key].clone(parent, clone);
+ }
+ clone.isList = this.isList;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Arguments.prototype.toJSON = function(){
+ return {
+ __type: 'Arguments',
+ map: this.map,
+ isList: this.isList,
+ preserve: this.preserve,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename,
+ nodes: this.nodes
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/atblock.js b/node_modules/stylus/lib/nodes/atblock.js
new file mode 100644
index 00000000..03a191cf
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/atblock.js
@@ -0,0 +1,79 @@
+/*!
+ * Stylus - @block
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `@block` node.
+ *
+ * @api public
+ */
+
+var Atblock = module.exports = function Atblock(){
+ Node.call(this);
+};
+
+/**
+ * Return `block` nodes.
+ */
+
+Atblock.prototype.__defineGetter__('nodes', function(){
+ return this.block.nodes;
+});
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Atblock.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Atblock.prototype.clone = function(parent){
+ var clone = new Atblock;
+ clone.block = this.block.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return @block.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Atblock.prototype.toString = function(){
+ return '@block';
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Atblock.prototype.toJSON = function(){
+ return {
+ __type: 'Atblock',
+ block: this.block,
+ lineno: this.lineno,
+ column: this.column,
+ fileno: this.fileno
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/atrule.js b/node_modules/stylus/lib/nodes/atrule.js
new file mode 100644
index 00000000..43301b50
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/atrule.js
@@ -0,0 +1,136 @@
+/*!
+ * Stylus - at-rule
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new at-rule node.
+ *
+ * @param {String} type
+ * @api public
+ */
+
+var Atrule = module.exports = function Atrule(type){
+ Node.call(this);
+ this.type = type;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Atrule.prototype.__proto__ = Node.prototype;
+
+/**
+ * Check if at-rule's block has only properties.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Atrule.prototype.__defineGetter__('hasOnlyProperties', function(){
+ if (!this.block) return false;
+
+ var nodes = this.block.nodes;
+ for (var i = 0, len = nodes.length; i < len; ++i) {
+ var nodeName = nodes[i].nodeName;
+ switch(nodes[i].nodeName) {
+ case 'property':
+ case 'expression':
+ case 'comment':
+ continue;
+ default:
+ return false;
+ }
+ }
+ return true;
+});
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Atrule.prototype.clone = function(parent){
+ var clone = new Atrule(this.type);
+ if (this.block) clone.block = this.block.clone(parent, clone);
+ clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); });
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Atrule.prototype.toJSON = function(){
+ var json = {
+ __type: 'Atrule',
+ type: this.type,
+ segments: this.segments,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+ if (this.block) json.block = this.block;
+ return json;
+};
+
+/**
+ * Return @<type>.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Atrule.prototype.toString = function(){
+ return '@' + this.type;
+};
+
+/**
+ * Check if the at-rule's block has output nodes.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Atrule.prototype.__defineGetter__('hasOutput', function(){
+ return !!this.block && hasOutput(this.block);
+});
+
+function hasOutput(block) {
+ var nodes = block.nodes;
+
+ // only placeholder selectors
+ if (nodes.every(function(node){
+ return 'group' == node.nodeName && node.hasOnlyPlaceholders;
+ })) return false;
+
+ // something visible
+ return nodes.some(function(node) {
+ switch (node.nodeName) {
+ case 'property':
+ case 'literal':
+ case 'import':
+ return true;
+ case 'block':
+ return hasOutput(node);
+ default:
+ if (node.block) return hasOutput(node.block);
+ }
+ });
+}
diff --git a/node_modules/stylus/lib/nodes/binop.js b/node_modules/stylus/lib/nodes/binop.js
new file mode 100644
index 00000000..c56aee39
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/binop.js
@@ -0,0 +1,83 @@
+
+/*!
+ * Stylus - BinOp
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `BinOp` with `op`, `left` and `right`.
+ *
+ * @param {String} op
+ * @param {Node} left
+ * @param {Node} right
+ * @api public
+ */
+
+var BinOp = module.exports = function BinOp(op, left, right){
+ Node.call(this);
+ this.op = op;
+ this.left = left;
+ this.right = right;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+BinOp.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+BinOp.prototype.clone = function(parent){
+ var clone = new BinOp(this.op);
+ clone.left = this.left.clone(parent, clone);
+ clone.right = this.right && this.right.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ if (this.val) clone.val = this.val.clone(parent, clone);
+ return clone;
+};
+
+/**
+ * Return <left> <op> <right>
+ *
+ * @return {String}
+ * @api public
+ */
+BinOp.prototype.toString = function() {
+ return this.left.toString() + ' ' + this.op + ' ' + this.right.toString();
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+BinOp.prototype.toJSON = function(){
+ var json = {
+ __type: 'BinOp',
+ left: this.left,
+ right: this.right,
+ op: this.op,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+ if (this.val) json.val = this.val;
+ return json;
+};
diff --git a/node_modules/stylus/lib/nodes/block.js b/node_modules/stylus/lib/nodes/block.js
new file mode 100644
index 00000000..ed4e9776
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/block.js
@@ -0,0 +1,127 @@
+
+/*!
+ * Stylus - Block
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Block` node with `parent` Block.
+ *
+ * @param {Block} parent
+ * @api public
+ */
+
+var Block = module.exports = function Block(parent, node){
+ Node.call(this);
+ this.nodes = [];
+ this.parent = parent;
+ this.node = node;
+ this.scope = true;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Block.prototype.__proto__ = Node.prototype;
+
+/**
+ * Check if this block has properties..
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Block.prototype.__defineGetter__('hasProperties', function(){
+ for (var i = 0, len = this.nodes.length; i < len; ++i) {
+ if ('property' == this.nodes[i].nodeName) {
+ return true;
+ }
+ }
+});
+
+/**
+ * Check if this block has @media nodes.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Block.prototype.__defineGetter__('hasMedia', function(){
+ for (var i = 0, len = this.nodes.length; i < len; ++i) {
+ var nodeName = this.nodes[i].nodeName;
+ if ('media' == nodeName) {
+ return true;
+ }
+ }
+ return false;
+});
+
+/**
+ * Check if this block is empty.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Block.prototype.__defineGetter__('isEmpty', function(){
+ return !this.nodes.length;
+});
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Block.prototype.clone = function(parent, node){
+ parent = parent || this.parent;
+ var clone = new Block(parent, node || this.node);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ clone.scope = this.scope;
+ this.nodes.forEach(function(node){
+ clone.push(node.clone(clone, clone));
+ });
+ return clone;
+};
+
+/**
+ * Push a `node` to this block.
+ *
+ * @param {Node} node
+ * @api public
+ */
+
+Block.prototype.push = function(node){
+ this.nodes.push(node);
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Block.prototype.toJSON = function(){
+ return {
+ __type: 'Block',
+ // parent: this.parent,
+ // node: this.node,
+ scope: this.scope,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename,
+ nodes: this.nodes
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/boolean.js b/node_modules/stylus/lib/nodes/boolean.js
new file mode 100644
index 00000000..97c11971
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/boolean.js
@@ -0,0 +1,117 @@
+
+/*!
+ * Stylus - Boolean
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `Boolean` node with the given `val`.
+ *
+ * @param {Boolean} val
+ * @api public
+ */
+
+var Boolean = module.exports = function Boolean(val){
+ Node.call(this);
+ if (this.nodeName) {
+ this.val = !!val;
+ } else {
+ return new Boolean(val);
+ }
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Boolean.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return `this` node.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Boolean.prototype.toBoolean = function(){
+ return this;
+};
+
+/**
+ * Return `true` if this node represents `true`.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Boolean.prototype.__defineGetter__('isTrue', function(){
+ return this.val;
+});
+
+/**
+ * Return `true` if this node represents `false`.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Boolean.prototype.__defineGetter__('isFalse', function(){
+ return ! this.val;
+});
+
+/**
+ * Negate the value.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Boolean.prototype.negate = function(){
+ return new Boolean(!this.val);
+};
+
+/**
+ * Return 'Boolean'.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Boolean.prototype.inspect = function(){
+ return '[Boolean ' + this.val + ']';
+};
+
+/**
+ * Return 'true' or 'false'.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Boolean.prototype.toString = function(){
+ return this.val
+ ? 'true'
+ : 'false';
+};
+
+/**
+ * Return a JSON representaiton of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Boolean.prototype.toJSON = function(){
+ return {
+ __type: 'Boolean',
+ val: this.val
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/call.js b/node_modules/stylus/lib/nodes/call.js
new file mode 100644
index 00000000..5cf655df
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/call.js
@@ -0,0 +1,85 @@
+
+/*!
+ * Stylus - Call
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Call` with `name` and `args`.
+ *
+ * @param {String} name
+ * @param {Expression} args
+ * @api public
+ */
+
+var Call = module.exports = function Call(name, args){
+ Node.call(this);
+ this.name = name;
+ this.args = args;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Call.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Call.prototype.clone = function(parent){
+ var clone = new Call(this.name);
+ clone.args = this.args.clone(parent, clone);
+ if (this.block) clone.block = this.block.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return <name>(param1, param2, ...).
+ *
+ * @return {String}
+ * @api public
+ */
+
+Call.prototype.toString = function(){
+ var args = this.args.nodes.map(function(node) {
+ var str = node.toString();
+ return str.slice(1, str.length - 1);
+ }).join(', ');
+
+ return this.name + '(' + args + ')';
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Call.prototype.toJSON = function(){
+ var json = {
+ __type: 'Call',
+ name: this.name,
+ args: this.args,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+ if (this.block) json.block = this.block;
+ return json;
+};
diff --git a/node_modules/stylus/lib/nodes/charset.js b/node_modules/stylus/lib/nodes/charset.js
new file mode 100644
index 00000000..e6d52077
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/charset.js
@@ -0,0 +1,58 @@
+
+/*!
+ * Stylus - Charset
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Charset` with the given `val`
+ *
+ * @param {String} val
+ * @api public
+ */
+
+var Charset = module.exports = function Charset(val){
+ Node.call(this);
+ this.val = val;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Charset.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return @charset "val".
+ *
+ * @return {String}
+ * @api public
+ */
+
+Charset.prototype.toString = function(){
+ return '@charset ' + this.val;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Charset.prototype.toJSON = function(){
+ return {
+ __type: 'Charset',
+ val: this.val,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/comment.js b/node_modules/stylus/lib/nodes/comment.js
new file mode 100644
index 00000000..56b59b3b
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/comment.js
@@ -0,0 +1,64 @@
+
+/*!
+ * Stylus - Comment
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Comment` with the given `str`.
+ *
+ * @param {String} str
+ * @param {Boolean} suppress
+ * @param {Boolean} inline
+ * @api public
+ */
+
+var Comment = module.exports = function Comment(str, suppress, inline){
+ Node.call(this);
+ this.str = str;
+ this.suppress = suppress;
+ this.inline = inline;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Comment.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Comment.prototype.toJSON = function(){
+ return {
+ __type: 'Comment',
+ str: this.str,
+ suppress: this.suppress,
+ inline: this.inline,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return comment.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Comment.prototype.toString = function(){
+ return this.str;
+};
diff --git a/node_modules/stylus/lib/nodes/each.js b/node_modules/stylus/lib/nodes/each.js
new file mode 100644
index 00000000..985bd29d
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/each.js
@@ -0,0 +1,75 @@
+
+/*!
+ * Stylus - Each
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `Each` node with the given `val` name,
+ * `key` name, `expr`, and `block`.
+ *
+ * @param {String} val
+ * @param {String} key
+ * @param {Expression} expr
+ * @param {Block} block
+ * @api public
+ */
+
+var Each = module.exports = function Each(val, key, expr, block){
+ Node.call(this);
+ this.val = val;
+ this.key = key;
+ this.expr = expr;
+ this.block = block;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Each.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Each.prototype.clone = function(parent){
+ var clone = new Each(this.val, this.key);
+ clone.expr = this.expr.clone(parent, clone);
+ clone.block = this.block.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Each.prototype.toJSON = function(){
+ return {
+ __type: 'Each',
+ val: this.val,
+ key: this.key,
+ expr: this.expr,
+ block: this.block,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/expression.js b/node_modules/stylus/lib/nodes/expression.js
new file mode 100644
index 00000000..92293f32
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/expression.js
@@ -0,0 +1,220 @@
+
+/*!
+ * Stylus - Expression
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('../nodes')
+ , utils = require('../utils');
+
+/**
+ * Initialize a new `Expression`.
+ *
+ * @param {Boolean} isList
+ * @api public
+ */
+
+var Expression = module.exports = function Expression(isList){
+ Node.call(this);
+ this.nodes = [];
+ this.isList = isList;
+};
+
+/**
+ * Check if the variable has a value.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Expression.prototype.__defineGetter__('isEmpty', function(){
+ return !this.nodes.length;
+});
+
+/**
+ * Return the first node in this expression.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Expression.prototype.__defineGetter__('first', function(){
+ return this.nodes[0]
+ ? this.nodes[0].first
+ : nodes.null;
+});
+
+/**
+ * Hash all the nodes in order.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Expression.prototype.__defineGetter__('hash', function(){
+ return this.nodes.map(function(node){
+ return node.hash;
+ }).join('::');
+});
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Expression.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Expression.prototype.clone = function(parent){
+ var clone = new this.constructor(this.isList);
+ clone.preserve = this.preserve;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ clone.nodes = this.nodes.map(function(node) {
+ return node.clone(parent, clone);
+ });
+ return clone;
+};
+
+/**
+ * Push the given `node`.
+ *
+ * @param {Node} node
+ * @api public
+ */
+
+Expression.prototype.push = function(node){
+ this.nodes.push(node);
+};
+
+/**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+Expression.prototype.operate = function(op, right, val){
+ switch (op) {
+ case '[]=':
+ var self = this
+ , range = utils.unwrap(right).nodes
+ , val = utils.unwrap(val)
+ , len
+ , node;
+ range.forEach(function(unit){
+ len = self.nodes.length;
+ if ('unit' == unit.nodeName) {
+ var i = unit.val < 0 ? len + unit.val : unit.val
+ , n = i;
+ while (i-- > len) self.nodes[i] = nodes.null;
+ self.nodes[n] = val;
+ } else if (unit.string) {
+ node = self.nodes[0];
+ if (node && 'object' == node.nodeName) node.set(unit.string, val.clone());
+ }
+ });
+ return val;
+ case '[]':
+ var expr = new nodes.Expression
+ , vals = utils.unwrap(this).nodes
+ , range = utils.unwrap(right).nodes
+ , node;
+ range.forEach(function(unit){
+ if ('unit' == unit.nodeName) {
+ node = vals[unit.val < 0 ? vals.length + unit.val : unit.val];
+ } else if ('object' == vals[0].nodeName) {
+ node = vals[0].get(unit.string);
+ }
+ if (node) expr.push(node);
+ });
+ return expr.isEmpty
+ ? nodes.null
+ : utils.unwrap(expr);
+ case '||':
+ return this.toBoolean().isTrue
+ ? this
+ : right;
+ case 'in':
+ return Node.prototype.operate.call(this, op, right);
+ case '!=':
+ return this.operate('==', right, val).negate();
+ case '==':
+ var len = this.nodes.length
+ , right = right.toExpression()
+ , a
+ , b;
+ if (len != right.nodes.length) return nodes.false;
+ for (var i = 0; i < len; ++i) {
+ a = this.nodes[i];
+ b = right.nodes[i];
+ if (a.operate(op, b).isTrue) continue;
+ return nodes.false;
+ }
+ return nodes.true;
+ break;
+ default:
+ return this.first.operate(op, right, val);
+ }
+};
+
+/**
+ * Expressions with length > 1 are truthy,
+ * otherwise the first value's toBoolean()
+ * method is invoked.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Expression.prototype.toBoolean = function(){
+ if (this.nodes.length > 1) return nodes.true;
+ return this.first.toBoolean();
+};
+
+/**
+ * Return "<a> <b> <c>" or "<a>, <b>, <c>" if
+ * the expression represents a list.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Expression.prototype.toString = function(){
+ return '(' + this.nodes.map(function(node){
+ return node.toString();
+ }).join(this.isList ? ', ' : ' ') + ')';
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Expression.prototype.toJSON = function(){
+ return {
+ __type: 'Expression',
+ isList: this.isList,
+ preserve: this.preserve,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename,
+ nodes: this.nodes
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/extend.js b/node_modules/stylus/lib/nodes/extend.js
new file mode 100644
index 00000000..05458b61
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/extend.js
@@ -0,0 +1,69 @@
+
+/*!
+ * Stylus - Extend
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Extend` with the given `selectors` array.
+ *
+ * @param {Array} selectors array of the selectors
+ * @api public
+ */
+
+var Extend = module.exports = function Extend(selectors){
+ Node.call(this);
+ this.selectors = selectors;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Extend.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Extend.prototype.clone = function(){
+ return new Extend(this.selectors);
+};
+
+/**
+ * Return `@extend selectors`.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Extend.prototype.toString = function(){
+ return '@extend ' + this.selectors.join(', ');
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Extend.prototype.toJSON = function(){
+ return {
+ __type: 'Extend',
+ selectors: this.selectors,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/feature.js b/node_modules/stylus/lib/nodes/feature.js
new file mode 100644
index 00000000..f4e18328
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/feature.js
@@ -0,0 +1,84 @@
+
+/*!
+ * Stylus - Feature
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Feature` with the given `segs`.
+ *
+ * @param {Array} segs
+ * @api public
+ */
+
+var Feature = module.exports = function Feature(segs){
+ Node.call(this);
+ this.segments = segs;
+ this.expr = null;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Feature.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Feature.prototype.clone = function(parent){
+ var clone = new Feature;
+ clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); });
+ if (this.expr) clone.expr = this.expr.clone(parent, clone);
+ if (this.name) clone.name = this.name;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return "<ident>" or "(<ident>: <expr>)"
+ *
+ * @return {String}
+ * @api public
+ */
+
+Feature.prototype.toString = function(){
+ if (this.expr) {
+ return '(' + this.segments.join('') + ': ' + this.expr.toString() + ')';
+ } else {
+ return this.segments.join('');
+ }
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Feature.prototype.toJSON = function(){
+ var json = {
+ __type: 'Feature',
+ segments: this.segments,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+ if (this.expr) json.expr = this.expr;
+ if (this.name) json.name = this.name;
+ return json;
+};
diff --git a/node_modules/stylus/lib/nodes/function.js b/node_modules/stylus/lib/nodes/function.js
new file mode 100644
index 00000000..25a6586b
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/function.js
@@ -0,0 +1,128 @@
+
+/*!
+ * Stylus - Function
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Function` with `name`, `params`, and `body`.
+ *
+ * @param {String} name
+ * @param {Params|Function} params
+ * @param {Block} body
+ * @api public
+ */
+
+var Function = module.exports = function Function(name, params, body){
+ Node.call(this);
+ this.name = name;
+ this.params = params;
+ this.block = body;
+ if ('function' == typeof params) this.fn = params;
+};
+
+/**
+ * Check function arity.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Function.prototype.__defineGetter__('arity', function(){
+ return this.params.length;
+});
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Function.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return hash.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Function.prototype.__defineGetter__('hash', function(){
+ return 'function ' + this.name;
+});
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Function.prototype.clone = function(parent){
+ if (this.fn) {
+ var clone = new Function(
+ this.name
+ , this.fn);
+ } else {
+ var clone = new Function(this.name);
+ clone.params = this.params.clone(parent, clone);
+ clone.block = this.block.clone(parent, clone);
+ }
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return <name>(param1, param2, ...).
+ *
+ * @return {String}
+ * @api public
+ */
+
+Function.prototype.toString = function(){
+ if (this.fn) {
+ return this.name
+ + '('
+ + this.fn.toString()
+ .match(/^function *\w*\((.*?)\)/)
+ .slice(1)
+ .join(', ')
+ + ')';
+ } else {
+ return this.name
+ + '('
+ + this.params.nodes.join(', ')
+ + ')';
+ }
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Function.prototype.toJSON = function(){
+ var json = {
+ __type: 'Function',
+ name: this.name,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+ if (this.fn) {
+ json.fn = this.fn;
+ } else {
+ json.params = this.params;
+ json.block = this.block;
+ }
+ return json;
+};
diff --git a/node_modules/stylus/lib/nodes/group.js b/node_modules/stylus/lib/nodes/group.js
new file mode 100644
index 00000000..8c1a4ea3
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/group.js
@@ -0,0 +1,110 @@
+
+/*!
+ * Stylus - Group
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Group`.
+ *
+ * @api public
+ */
+
+var Group = module.exports = function Group(){
+ Node.call(this);
+ this.nodes = [];
+ this.extends = [];
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Group.prototype.__proto__ = Node.prototype;
+
+/**
+ * Push the given `selector` node.
+ *
+ * @param {Selector} selector
+ * @api public
+ */
+
+Group.prototype.push = function(selector){
+ this.nodes.push(selector);
+};
+
+/**
+ * Return this set's `Block`.
+ */
+
+Group.prototype.__defineGetter__('block', function(){
+ return this.nodes[0].block;
+});
+
+/**
+ * Assign `block` to each selector in this set.
+ *
+ * @param {Block} block
+ * @api public
+ */
+
+Group.prototype.__defineSetter__('block', function(block){
+ for (var i = 0, len = this.nodes.length; i < len; ++i) {
+ this.nodes[i].block = block;
+ }
+});
+
+/**
+ * Check if this set has only placeholders.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Group.prototype.__defineGetter__('hasOnlyPlaceholders', function(){
+ return this.nodes.every(function(selector) { return selector.isPlaceholder; });
+});
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Group.prototype.clone = function(parent){
+ var clone = new Group;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ this.nodes.forEach(function(node){
+ clone.push(node.clone(parent, clone));
+ });
+ clone.filename = this.filename;
+ clone.block = this.block.clone(parent, clone);
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Group.prototype.toJSON = function(){
+ return {
+ __type: 'Group',
+ nodes: this.nodes,
+ block: this.block,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/hsla.js b/node_modules/stylus/lib/nodes/hsla.js
new file mode 100644
index 00000000..bea1e124
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/hsla.js
@@ -0,0 +1,277 @@
+
+/*!
+ * Stylus - HSLA
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `HSLA` with the given h,s,l,a component values.
+ *
+ * @param {Number} h
+ * @param {Number} s
+ * @param {Number} l
+ * @param {Number} a
+ * @api public
+ */
+
+var HSLA = exports = module.exports = function HSLA(h,s,l,a){
+ Node.call(this);
+ this.h = clampDegrees(h);
+ this.s = clampPercentage(s);
+ this.l = clampPercentage(l);
+ this.a = clampAlpha(a);
+ this.hsla = this;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+HSLA.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return hsla(n,n,n,n).
+ *
+ * @return {String}
+ * @api public
+ */
+
+HSLA.prototype.toString = function(){
+ return 'hsla('
+ + this.h + ','
+ + this.s.toFixed(0) + '%,'
+ + this.l.toFixed(0) + '%,'
+ + this.a + ')';
+};
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+HSLA.prototype.clone = function(parent){
+ var clone = new HSLA(
+ this.h
+ , this.s
+ , this.l
+ , this.a);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+HSLA.prototype.toJSON = function(){
+ return {
+ __type: 'HSLA',
+ h: this.h,
+ s: this.s,
+ l: this.l,
+ a: this.a,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return rgba `RGBA` representation.
+ *
+ * @return {RGBA}
+ * @api public
+ */
+
+HSLA.prototype.__defineGetter__('rgba', function(){
+ return nodes.RGBA.fromHSLA(this);
+});
+
+/**
+ * Return hash.
+ *
+ * @return {String}
+ * @api public
+ */
+
+HSLA.prototype.__defineGetter__('hash', function(){
+ return this.rgba.toString();
+});
+
+/**
+ * Add h,s,l to the current component values.
+ *
+ * @param {Number} h
+ * @param {Number} s
+ * @param {Number} l
+ * @return {HSLA} new node
+ * @api public
+ */
+
+HSLA.prototype.add = function(h,s,l){
+ return new HSLA(
+ this.h + h
+ , this.s + s
+ , this.l + l
+ , this.a);
+};
+
+/**
+ * Subtract h,s,l from the current component values.
+ *
+ * @param {Number} h
+ * @param {Number} s
+ * @param {Number} l
+ * @return {HSLA} new node
+ * @api public
+ */
+
+HSLA.prototype.sub = function(h,s,l){
+ return this.add(-h, -s, -l);
+};
+
+/**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+HSLA.prototype.operate = function(op, right){
+ switch (op) {
+ case '==':
+ case '!=':
+ case '<=':
+ case '>=':
+ case '<':
+ case '>':
+ case 'is a':
+ case '||':
+ case '&&':
+ return this.rgba.operate(op, right);
+ default:
+ return this.rgba.operate(op, right).hsla;
+ }
+};
+
+/**
+ * Return `HSLA` representation of the given `color`.
+ *
+ * @param {RGBA} color
+ * @return {HSLA}
+ * @api public
+ */
+
+exports.fromRGBA = function(rgba){
+ var r = rgba.r / 255
+ , g = rgba.g / 255
+ , b = rgba.b / 255
+ , a = rgba.a;
+
+ var min = Math.min(r,g,b)
+ , max = Math.max(r,g,b)
+ , l = (max + min) / 2
+ , d = max - min
+ , h, s;
+
+ switch (max) {
+ case min: h = 0; break;
+ case r: h = 60 * (g-b) / d; break;
+ case g: h = 60 * (b-r) / d + 120; break;
+ case b: h = 60 * (r-g) / d + 240; break;
+ }
+
+ if (max == min) {
+ s = 0;
+ } else if (l < .5) {
+ s = d / (2 * l);
+ } else {
+ s = d / (2 - 2 * l);
+ }
+
+ h %= 360;
+ s *= 100;
+ l *= 100;
+
+ return new HSLA(h,s,l,a);
+};
+
+/**
+ * Adjust lightness by `percent`.
+ *
+ * @param {Number} percent
+ * @return {HSLA} for chaining
+ * @api public
+ */
+
+HSLA.prototype.adjustLightness = function(percent){
+ this.l = clampPercentage(this.l + this.l * (percent / 100));
+ return this;
+};
+
+/**
+ * Adjust hue by `deg`.
+ *
+ * @param {Number} deg
+ * @return {HSLA} for chaining
+ * @api public
+ */
+
+HSLA.prototype.adjustHue = function(deg){
+ this.h = clampDegrees(this.h + deg);
+ return this;
+};
+
+/**
+ * Clamp degree `n` >= 0 and <= 360.
+ *
+ * @param {Number} n
+ * @return {Number}
+ * @api private
+ */
+
+function clampDegrees(n) {
+ n = n % 360;
+ return n >= 0 ? n : 360 + n;
+}
+
+/**
+ * Clamp percentage `n` >= 0 and <= 100.
+ *
+ * @param {Number} n
+ * @return {Number}
+ * @api private
+ */
+
+function clampPercentage(n) {
+ return Math.max(0, Math.min(n, 100));
+}
+
+/**
+ * Clamp alpha `n` >= 0 and <= 1.
+ *
+ * @param {Number} n
+ * @return {Number}
+ * @api private
+ */
+
+function clampAlpha(n) {
+ return Math.max(0, Math.min(n, 1));
+}
diff --git a/node_modules/stylus/lib/nodes/ident.js b/node_modules/stylus/lib/nodes/ident.js
new file mode 100644
index 00000000..181f738a
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/ident.js
@@ -0,0 +1,156 @@
+
+/*!
+ * Stylus - Ident
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `Ident` by `name` with the given `val` node.
+ *
+ * @param {String} name
+ * @param {Node} val
+ * @api public
+ */
+
+var Ident = module.exports = function Ident(name, val, mixin){
+ Node.call(this);
+ this.name = name;
+ this.string = name;
+ this.val = val || nodes.null;
+ this.mixin = !!mixin;
+};
+
+/**
+ * Check if the variable has a value.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Ident.prototype.__defineGetter__('isEmpty', function(){
+ return undefined == this.val;
+});
+
+/**
+ * Return hash.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Ident.prototype.__defineGetter__('hash', function(){
+ return this.name;
+});
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Ident.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Ident.prototype.clone = function(parent){
+ var clone = new Ident(this.name);
+ clone.val = this.val.clone(parent, clone);
+ clone.mixin = this.mixin;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ clone.property = this.property;
+ clone.rest = this.rest;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Ident.prototype.toJSON = function(){
+ return {
+ __type: 'Ident',
+ name: this.name,
+ val: this.val,
+ mixin: this.mixin,
+ property: this.property,
+ rest: this.rest,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return <name>.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Ident.prototype.toString = function(){
+ return this.name;
+};
+
+/**
+ * Coerce `other` to an ident.
+ *
+ * @param {Node} other
+ * @return {String}
+ * @api public
+ */
+
+Ident.prototype.coerce = function(other){
+ switch (other.nodeName) {
+ case 'ident':
+ case 'string':
+ case 'literal':
+ return new Ident(other.string);
+ case 'unit':
+ return new Ident(other.toString());
+ default:
+ return Node.prototype.coerce.call(this, other);
+ }
+};
+
+/**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+Ident.prototype.operate = function(op, right){
+ var val = right.first;
+ switch (op) {
+ case '-':
+ if ('unit' == val.nodeName) {
+ var expr = new nodes.Expression;
+ val = val.clone();
+ val.val = -val.val;
+ expr.push(this);
+ expr.push(val);
+ return expr;
+ }
+ case '+':
+ return new nodes.Ident(this.string + this.coerce(val).string);
+ }
+ return Node.prototype.operate.call(this, op, right);
+};
diff --git a/node_modules/stylus/lib/nodes/if.js b/node_modules/stylus/lib/nodes/if.js
new file mode 100644
index 00000000..e7d354d2
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/if.js
@@ -0,0 +1,78 @@
+
+/*!
+ * Stylus - If
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `If` with the given `cond`.
+ *
+ * @param {Expression} cond
+ * @param {Boolean|Block} negate, block
+ * @api public
+ */
+
+var If = module.exports = function If(cond, negate){
+ Node.call(this);
+ this.cond = cond;
+ this.elses = [];
+ if (negate && negate.nodeName) {
+ this.block = negate;
+ } else {
+ this.negate = negate;
+ }
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+If.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+If.prototype.clone = function(parent){
+ var clone = new If();
+ clone.cond = this.cond.clone(parent, clone);
+ clone.block = this.block.clone(parent, clone);
+ clone.elses = this.elses.map(function(node){ return node.clone(parent, clone); });
+ clone.negate = this.negate;
+ clone.postfix = this.postfix;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+If.prototype.toJSON = function(){
+ return {
+ __type: 'If',
+ cond: this.cond,
+ block: this.block,
+ elses: this.elses,
+ negate: this.negate,
+ postfix: this.postfix,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/import.js b/node_modules/stylus/lib/nodes/import.js
new file mode 100644
index 00000000..7a3548a4
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/import.js
@@ -0,0 +1,68 @@
+
+/*!
+ * Stylus - Import
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Import` with the given `expr`.
+ *
+ * @param {Expression} expr
+ * @api public
+ */
+
+var Import = module.exports = function Import(expr, once){
+ Node.call(this);
+ this.path = expr;
+ this.once = once || false;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Import.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Import.prototype.clone = function(parent){
+ var clone = new Import();
+ clone.path = this.path.nodeName ? this.path.clone(parent, clone) : this.path;
+ clone.once = this.once;
+ clone.mtime = this.mtime;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Import.prototype.toJSON = function(){
+ return {
+ __type: 'Import',
+ path: this.path,
+ once: this.once,
+ mtime: this.mtime,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/index.js b/node_modules/stylus/lib/nodes/index.js
new file mode 100644
index 00000000..d9b79b99
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/index.js
@@ -0,0 +1,59 @@
+
+/*!
+ * Stylus - nodes
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Constructors
+ */
+
+exports.Node = require('./node');
+exports.Root = require('./root');
+exports.Null = require('./null');
+exports.Each = require('./each');
+exports.If = require('./if');
+exports.Call = require('./call');
+exports.UnaryOp = require('./unaryop');
+exports.BinOp = require('./binop');
+exports.Ternary = require('./ternary');
+exports.Block = require('./block');
+exports.Unit = require('./unit');
+exports.String = require('./string');
+exports.HSLA = require('./hsla');
+exports.RGBA = require('./rgba');
+exports.Ident = require('./ident');
+exports.Group = require('./group');
+exports.Literal = require('./literal');
+exports.Boolean = require('./boolean');
+exports.Return = require('./return');
+exports.Media = require('./media');
+exports.QueryList = require('./query-list');
+exports.Query = require('./query');
+exports.Feature = require('./feature');
+exports.Params = require('./params');
+exports.Comment = require('./comment');
+exports.Keyframes = require('./keyframes');
+exports.Member = require('./member');
+exports.Charset = require('./charset');
+exports.Namespace = require('./namespace');
+exports.Import = require('./import');
+exports.Extend = require('./extend');
+exports.Object = require('./object');
+exports.Function = require('./function');
+exports.Property = require('./property');
+exports.Selector = require('./selector');
+exports.Expression = require('./expression');
+exports.Arguments = require('./arguments');
+exports.Atblock = require('./atblock');
+exports.Atrule = require('./atrule');
+exports.Supports = require('./supports');
+
+/**
+ * Singletons.
+ */
+
+exports.true = new exports.Boolean(true);
+exports.false = new exports.Boolean(false);
+exports.null = new exports.Null;
diff --git a/node_modules/stylus/lib/nodes/keyframes.js b/node_modules/stylus/lib/nodes/keyframes.js
new file mode 100644
index 00000000..e4e1271a
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/keyframes.js
@@ -0,0 +1,81 @@
+
+/*!
+ * Stylus - Keyframes
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Atrule = require('./atrule');
+
+/**
+ * Initialize a new `Keyframes` with the given `segs`,
+ * and optional vendor `prefix`.
+ *
+ * @param {Array} segs
+ * @param {String} prefix
+ * @api public
+ */
+
+var Keyframes = module.exports = function Keyframes(segs, prefix){
+ Atrule.call(this, 'keyframes');
+ this.segments = segs;
+ this.prefix = prefix || 'official';
+};
+
+/**
+ * Inherit from `Atrule.prototype`.
+ */
+
+Keyframes.prototype.__proto__ = Atrule.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Keyframes.prototype.clone = function(parent){
+ var clone = new Keyframes;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ clone.segments = this.segments.map(function(node) { return node.clone(parent, clone); });
+ clone.prefix = this.prefix;
+ clone.block = this.block.clone(parent, clone);
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Keyframes.prototype.toJSON = function(){
+ return {
+ __type: 'Keyframes',
+ segments: this.segments,
+ prefix: this.prefix,
+ block: this.block,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return `@keyframes name`.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Keyframes.prototype.toString = function(){
+ return '@keyframes ' + this.segments.join('');
+};
diff --git a/node_modules/stylus/lib/nodes/literal.js b/node_modules/stylus/lib/nodes/literal.js
new file mode 100644
index 00000000..c95d9638
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/literal.js
@@ -0,0 +1,112 @@
+
+/*!
+ * Stylus - Literal
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `Literal` with the given `str`.
+ *
+ * @param {String} str
+ * @api public
+ */
+
+var Literal = module.exports = function Literal(str){
+ Node.call(this);
+ this.val = str;
+ this.string = str;
+ this.prefixed = false;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Literal.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return hash.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Literal.prototype.__defineGetter__('hash', function(){
+ return this.val;
+});
+
+/**
+ * Return literal value.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Literal.prototype.toString = function(){
+ return this.val;
+};
+
+/**
+ * Coerce `other` to a literal.
+ *
+ * @param {Node} other
+ * @return {String}
+ * @api public
+ */
+
+Literal.prototype.coerce = function(other){
+ switch (other.nodeName) {
+ case 'ident':
+ case 'string':
+ case 'literal':
+ return new Literal(other.string);
+ default:
+ return Node.prototype.coerce.call(this, other);
+ }
+};
+
+/**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+Literal.prototype.operate = function(op, right){
+ var val = right.first;
+ switch (op) {
+ case '+':
+ return new nodes.Literal(this.string + this.coerce(val).string);
+ default:
+ return Node.prototype.operate.call(this, op, right);
+ }
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Literal.prototype.toJSON = function(){
+ return {
+ __type: 'Literal',
+ val: this.val,
+ string: this.string,
+ prefixed: this.prefixed,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/media.js b/node_modules/stylus/lib/nodes/media.js
new file mode 100644
index 00000000..65fdf7ba
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/media.js
@@ -0,0 +1,76 @@
+
+/*!
+ * Stylus - Media
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Atrule = require('./atrule');
+
+/**
+ * Initialize a new `Media` with the given `val`
+ *
+ * @param {String} val
+ * @api public
+ */
+
+var Media = module.exports = function Media(val){
+ Atrule.call(this, 'media');
+ this.val = val;
+};
+
+/**
+ * Inherit from `Atrule.prototype`.
+ */
+
+Media.prototype.__proto__ = Atrule.prototype;
+
+/**
+ * Clone this node.
+ *
+ * @return {Media}
+ * @api public
+ */
+
+Media.prototype.clone = function(parent){
+ var clone = new Media;
+ clone.val = this.val.clone(parent, clone);
+ clone.block = this.block.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Media.prototype.toJSON = function(){
+ return {
+ __type: 'Media',
+ val: this.val,
+ block: this.block,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return @media "val".
+ *
+ * @return {String}
+ * @api public
+ */
+
+Media.prototype.toString = function(){
+ return '@media ' + this.val;
+};
diff --git a/node_modules/stylus/lib/nodes/member.js b/node_modules/stylus/lib/nodes/member.js
new file mode 100644
index 00000000..af947388
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/member.js
@@ -0,0 +1,82 @@
+
+/*!
+ * Stylus - Member
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Member` with `left` and `right`.
+ *
+ * @param {Node} left
+ * @param {Node} right
+ * @api public
+ */
+
+var Member = module.exports = function Member(left, right){
+ Node.call(this);
+ this.left = left;
+ this.right = right;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Member.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Member.prototype.clone = function(parent){
+ var clone = new Member;
+ clone.left = this.left.clone(parent, clone);
+ clone.right = this.right.clone(parent, clone);
+ if (this.val) clone.val = this.val.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Member.prototype.toJSON = function(){
+ var json = {
+ __type: 'Member',
+ left: this.left,
+ right: this.right,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+ if (this.val) json.val = this.val;
+ return json;
+};
+
+/**
+ * Return a string representation of this node.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Member.prototype.toString = function(){
+ return this.left.toString()
+ + '.' + this.right.toString();
+};
diff --git a/node_modules/stylus/lib/nodes/namespace.js b/node_modules/stylus/lib/nodes/namespace.js
new file mode 100644
index 00000000..878b474e
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/namespace.js
@@ -0,0 +1,60 @@
+/*!
+ * Stylus - Namespace
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Namespace` with the given `val` and `prefix`
+ *
+ * @param {String|Call} val
+ * @param {String} [prefix]
+ * @api public
+ */
+
+var Namespace = module.exports = function Namespace(val, prefix){
+ Node.call(this);
+ this.val = val;
+ this.prefix = prefix;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Namespace.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return @namespace "val".
+ *
+ * @return {String}
+ * @api public
+ */
+
+Namespace.prototype.toString = function(){
+ return '@namespace ' + (this.prefix ? this.prefix + ' ' : '') + this.val;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Namespace.prototype.toJSON = function(){
+ return {
+ __type: 'Namespace',
+ val: this.val,
+ prefix: this.prefix,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/node.js b/node_modules/stylus/lib/nodes/node.js
new file mode 100644
index 00000000..a392c970
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/node.js
@@ -0,0 +1,250 @@
+
+/*!
+ * Stylus - Node
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Evaluator = require('../visitor/evaluator')
+ , utils = require('../utils')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `CoercionError` with the given `msg`.
+ *
+ * @param {String} msg
+ * @api private
+ */
+
+function CoercionError(msg) {
+ this.name = 'CoercionError'
+ this.message = msg
+ Error.captureStackTrace(this, CoercionError);
+}
+
+/**
+ * Inherit from `Error.prototype`.
+ */
+
+CoercionError.prototype.__proto__ = Error.prototype;
+
+/**
+ * Node constructor.
+ *
+ * @api public
+ */
+
+var Node = module.exports = function Node(){
+ this.lineno = nodes.lineno || 1;
+ this.column = nodes.column || 1;
+ this.filename = nodes.filename;
+};
+
+Node.prototype = {
+ constructor: Node,
+
+ /**
+ * Return this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+ get first() {
+ return this;
+ },
+
+ /**
+ * Return hash.
+ *
+ * @return {String}
+ * @api public
+ */
+
+ get hash() {
+ return this.val;
+ },
+
+ /**
+ * Return node name.
+ *
+ * @return {String}
+ * @api public
+ */
+
+ get nodeName() {
+ return this.constructor.name.toLowerCase();
+ },
+
+ /**
+ * Return this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+ clone: function(){
+ return this;
+ },
+
+ /**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+ toJSON: function(){
+ return {
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+ },
+
+ /**
+ * Nodes by default evaluate to themselves.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+ eval: function(){
+ return new Evaluator(this).evaluate();
+ },
+
+ /**
+ * Return true.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+ toBoolean: function(){
+ return nodes.true;
+ },
+
+ /**
+ * Return the expression, or wrap this node in an expression.
+ *
+ * @return {Expression}
+ * @api public
+ */
+
+ toExpression: function(){
+ if ('expression' == this.nodeName) return this;
+ var expr = new nodes.Expression;
+ expr.push(this);
+ return expr;
+ },
+
+ /**
+ * Return false if `op` is generally not coerced.
+ *
+ * @param {String} op
+ * @return {Boolean}
+ * @api private
+ */
+
+ shouldCoerce: function(op){
+ switch (op) {
+ case 'is a':
+ case 'in':
+ case '||':
+ case '&&':
+ return false;
+ default:
+ return true;
+ }
+ },
+
+ /**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+ operate: function(op, right){
+ switch (op) {
+ case 'is a':
+ if ('string' == right.first.nodeName) {
+ return nodes.Boolean(this.nodeName == right.val);
+ } else {
+ throw new Error('"is a" expects a string, got ' + right.toString());
+ }
+ case '==':
+ return nodes.Boolean(this.hash == right.hash);
+ case '!=':
+ return nodes.Boolean(this.hash != right.hash);
+ case '>=':
+ return nodes.Boolean(this.hash >= right.hash);
+ case '<=':
+ return nodes.Boolean(this.hash <= right.hash);
+ case '>':
+ return nodes.Boolean(this.hash > right.hash);
+ case '<':
+ return nodes.Boolean(this.hash < right.hash);
+ case '||':
+ return this.toBoolean().isTrue
+ ? this
+ : right;
+ case 'in':
+ var vals = utils.unwrap(right).nodes
+ , len = vals && vals.length
+ , hash = this.hash;
+ if (!vals) throw new Error('"in" given invalid right-hand operand, expecting an expression');
+
+ // 'prop' in obj
+ if (1 == len && 'object' == vals[0].nodeName) {
+ return nodes.Boolean(vals[0].has(this.hash));
+ }
+
+ for (var i = 0; i < len; ++i) {
+ if (hash == vals[i].hash) {
+ return nodes.true;
+ }
+ }
+ return nodes.false;
+ case '&&':
+ var a = this.toBoolean()
+ , b = right.toBoolean();
+ return a.isTrue && b.isTrue
+ ? right
+ : a.isFalse
+ ? this
+ : right;
+ default:
+ if ('[]' == op) {
+ var msg = 'cannot perform '
+ + this
+ + '[' + right + ']';
+ } else {
+ var msg = 'cannot perform'
+ + ' ' + this
+ + ' ' + op
+ + ' ' + right;
+ }
+ throw new Error(msg);
+ }
+ },
+
+ /**
+ * Default coercion throws.
+ *
+ * @param {Node} other
+ * @return {Node}
+ * @api public
+ */
+
+ coerce: function(other){
+ if (other.nodeName == this.nodeName) return other;
+ throw new CoercionError('cannot coerce ' + other + ' to ' + this.nodeName);
+ }
+};
diff --git a/node_modules/stylus/lib/nodes/null.js b/node_modules/stylus/lib/nodes/null.js
new file mode 100644
index 00000000..4efea99f
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/null.js
@@ -0,0 +1,88 @@
+
+/*!
+ * Stylus - Null
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `Null` node.
+ *
+ * @api public
+ */
+
+var Null = module.exports = function Null(){};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Null.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return 'Null'.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Null.prototype.inspect =
+Null.prototype.toString = function(){
+ return 'null';
+};
+
+/**
+ * Return false.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Null.prototype.toBoolean = function(){
+ return nodes.false;
+};
+
+/**
+ * Check if the node is a null node.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Null.prototype.__defineGetter__('isNull', function(){
+ return true;
+});
+
+/**
+ * Return hash.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Null.prototype.__defineGetter__('hash', function(){
+ return null;
+});
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Null.prototype.toJSON = function(){
+ return {
+ __type: 'Null',
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/object.js b/node_modules/stylus/lib/nodes/object.js
new file mode 100644
index 00000000..a52c749c
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/object.js
@@ -0,0 +1,213 @@
+
+/*!
+ * Stylus - Object
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./')
+ , nativeObj = {}.constructor;
+
+/**
+ * Initialize a new `Object`.
+ *
+ * @api public
+ */
+
+var Object = module.exports = function Object(){
+ Node.call(this);
+ this.vals = {};
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Object.prototype.__proto__ = Node.prototype;
+
+/**
+ * Set `key` to `val`.
+ *
+ * @param {String} key
+ * @param {Node} val
+ * @return {Object} for chaining
+ * @api public
+ */
+
+Object.prototype.set = function(key, val){
+ this.vals[key] = val;
+ return this;
+};
+
+/**
+ * Return length.
+ *
+ * @return {Number}
+ * @api public
+ */
+
+Object.prototype.__defineGetter__('length', function() {
+ return nativeObj.keys(this.vals).length;
+});
+
+/**
+ * Get `key`.
+ *
+ * @param {String} key
+ * @return {Node}
+ * @api public
+ */
+
+Object.prototype.get = function(key){
+ return this.vals[key] || nodes.null;
+};
+
+/**
+ * Has `key`?
+ *
+ * @param {String} key
+ * @return {Boolean}
+ * @api public
+ */
+
+Object.prototype.has = function(key){
+ return key in this.vals;
+};
+
+/**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+Object.prototype.operate = function(op, right){
+ switch (op) {
+ case '.':
+ case '[]':
+ return this.get(right.hash);
+ case '==':
+ var vals = this.vals
+ , a
+ , b;
+ if ('object' != right.nodeName || this.length != right.length)
+ return nodes.false;
+ for (var key in vals) {
+ a = vals[key];
+ b = right.vals[key];
+ if (a.operate(op, b).isFalse)
+ return nodes.false;
+ }
+ return nodes.true;
+ case '!=':
+ return this.operate('==', right).negate();
+ default:
+ return Node.prototype.operate.call(this, op, right);
+ }
+};
+
+/**
+ * Return Boolean based on the length of this object.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Object.prototype.toBoolean = function(){
+ return nodes.Boolean(this.length);
+};
+
+/**
+ * Convert object to string with properties.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Object.prototype.toBlock = function(){
+ var str = '{'
+ , key
+ , val;
+ for (key in this.vals) {
+ val = this.get(key);
+ if ('object' == val.first.nodeName) {
+ str += key + ' ' + val.first.toBlock();
+ } else {
+ switch (key) {
+ case '@charset':
+ str += key + ' ' + val.first.toString() + ';';
+ break;
+ default:
+ str += key + ':' + toString(val) + ';';
+ }
+ }
+ }
+ str += '}';
+ return str;
+
+ function toString(node) {
+ if (node.nodes) {
+ return node.nodes.map(toString).join(node.isList ? ',' : ' ');
+ } else if ('literal' == node.nodeName && ',' == node.val) {
+ return '\\,';
+ }
+ return node.toString();
+ }
+};
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Object.prototype.clone = function(parent){
+ var clone = new Object;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ for (var key in this.vals) {
+ clone.vals[key] = this.vals[key].clone(parent, clone);
+ }
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Object.prototype.toJSON = function(){
+ return {
+ __type: 'Object',
+ vals: this.vals,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return "{ <prop>: <val> }"
+ *
+ * @return {String}
+ * @api public
+ */
+
+Object.prototype.toString = function(){
+ var obj = {};
+ for (var prop in this.vals) {
+ obj[prop] = this.vals[prop].toString();
+ }
+ return JSON.stringify(obj);
+};
diff --git a/node_modules/stylus/lib/nodes/params.js b/node_modules/stylus/lib/nodes/params.js
new file mode 100644
index 00000000..d7ac6d74
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/params.js
@@ -0,0 +1,90 @@
+
+/*!
+ * Stylus - Params
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Params` with `name`, `params`, and `body`.
+ *
+ * @param {String} name
+ * @param {Params} params
+ * @param {Expression} body
+ * @api public
+ */
+
+var Params = module.exports = function Params(){
+ Node.call(this);
+ this.nodes = [];
+};
+
+/**
+ * Check function arity.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Params.prototype.__defineGetter__('length', function(){
+ return this.nodes.length;
+});
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Params.prototype.__proto__ = Node.prototype;
+
+/**
+ * Push the given `node`.
+ *
+ * @param {Node} node
+ * @api public
+ */
+
+Params.prototype.push = function(node){
+ this.nodes.push(node);
+};
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Params.prototype.clone = function(parent){
+ var clone = new Params;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ this.nodes.forEach(function(node){
+ clone.push(node.clone(parent, clone));
+ });
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Params.prototype.toJSON = function(){
+ return {
+ __type: 'Params',
+ nodes: this.nodes,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
diff --git a/node_modules/stylus/lib/nodes/property.js b/node_modules/stylus/lib/nodes/property.js
new file mode 100644
index 00000000..215785ac
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/property.js
@@ -0,0 +1,96 @@
+
+/*!
+ * Stylus - Property
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Property` with the given `segs` and optional `expr`.
+ *
+ * @param {Array} segs
+ * @param {Expression} expr
+ * @api public
+ */
+
+var Property = module.exports = function Property(segs, expr){
+ Node.call(this);
+ this.segments = segs;
+ this.expr = expr;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Property.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Property.prototype.clone = function(parent){
+ var clone = new Property(this.segments);
+ clone.name = this.name;
+ if (this.literal) clone.literal = this.literal;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); });
+ if (this.expr) clone.expr = this.expr.clone(parent, clone);
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Property.prototype.toJSON = function(){
+ var json = {
+ __type: 'Property',
+ segments: this.segments,
+ name: this.name,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+ if (this.expr) json.expr = this.expr;
+ if (this.literal) json.literal = this.literal;
+ return json;
+};
+
+/**
+ * Return string representation of this node.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Property.prototype.toString = function(){
+ return 'property(' + this.segments.join('') + ', ' + this.expr + ')';
+};
+
+/**
+ * Operate on the property expression.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+Property.prototype.operate = function(op, right, val){
+ return this.expr.operate(op, right, val);
+};
diff --git a/node_modules/stylus/lib/nodes/query-list.js b/node_modules/stylus/lib/nodes/query-list.js
new file mode 100644
index 00000000..3819640b
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/query-list.js
@@ -0,0 +1,108 @@
+
+/*!
+ * Stylus - QueryList
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `QueryList`.
+ *
+ * @api public
+ */
+
+var QueryList = module.exports = function QueryList(){
+ Node.call(this);
+ this.nodes = [];
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+QueryList.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+QueryList.prototype.clone = function(parent){
+ var clone = new QueryList;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ for (var i = 0; i < this.nodes.length; ++i) {
+ clone.push(this.nodes[i].clone(parent, clone));
+ }
+ return clone;
+};
+
+/**
+ * Push the given `node`.
+ *
+ * @param {Node} node
+ * @api public
+ */
+
+QueryList.prototype.push = function(node){
+ this.nodes.push(node);
+};
+
+/**
+ * Merges this query list with the `other`.
+ *
+ * @param {QueryList} other
+ * @return {QueryList}
+ * @api private
+ */
+
+QueryList.prototype.merge = function(other){
+ var list = new QueryList
+ , merged;
+ this.nodes.forEach(function(query){
+ for (var i = 0, len = other.nodes.length; i < len; ++i){
+ merged = query.merge(other.nodes[i]);
+ if (merged) list.push(merged);
+ }
+ });
+ return list;
+};
+
+/**
+ * Return "<a>, <b>, <c>"
+ *
+ * @return {String}
+ * @api public
+ */
+
+QueryList.prototype.toString = function(){
+ return '(' + this.nodes.map(function(node){
+ return node.toString();
+ }).join(', ') + ')';
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+QueryList.prototype.toJSON = function(){
+ return {
+ __type: 'QueryList',
+ nodes: this.nodes,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/query.js b/node_modules/stylus/lib/nodes/query.js
new file mode 100644
index 00000000..47a568b7
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/query.js
@@ -0,0 +1,170 @@
+
+/*!
+ * Stylus - Query
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Query`.
+ *
+ * @api public
+ */
+
+var Query = module.exports = function Query(){
+ Node.call(this);
+ this.nodes = [];
+ this.type = '';
+ this.predicate = '';
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Query.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Query.prototype.clone = function(parent){
+ var clone = new Query;
+ clone.predicate = this.predicate;
+ clone.type = this.type;
+ for (var i = 0, len = this.nodes.length; i < len; ++i) {
+ clone.push(this.nodes[i].clone(parent, clone));
+ }
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Push the given `feature`.
+ *
+ * @param {Feature} feature
+ * @api public
+ */
+
+Query.prototype.push = function(feature){
+ this.nodes.push(feature);
+};
+
+/**
+ * Return resolved type of this query.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Query.prototype.__defineGetter__('resolvedType', function(){
+ if (this.type) {
+ return this.type.nodeName
+ ? this.type.string
+ : this.type;
+ }
+});
+
+/**
+ * Return resolved predicate of this query.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Query.prototype.__defineGetter__('resolvedPredicate', function(){
+ if (this.predicate) {
+ return this.predicate.nodeName
+ ? this.predicate.string
+ : this.predicate;
+ }
+});
+
+/**
+ * Merges this query with the `other`.
+ *
+ * @param {Query} other
+ * @return {Query}
+ * @api private
+ */
+
+Query.prototype.merge = function(other){
+ var query = new Query
+ , p1 = this.resolvedPredicate
+ , p2 = other.resolvedPredicate
+ , t1 = this.resolvedType
+ , t2 = other.resolvedType
+ , type, pred;
+
+ // Stolen from Sass :D
+ t1 = t1 || t2;
+ t2 = t2 || t1;
+ if (('not' == p1) ^ ('not' == p2)) {
+ if (t1 == t2) return;
+ type = ('not' == p1) ? t2 : t1;
+ pred = ('not' == p1) ? p2 : p1;
+ } else if (('not' == p1) && ('not' == p2)) {
+ if (t1 != t2) return;
+ type = t1;
+ pred = 'not';
+ } else if (t1 != t2) {
+ return;
+ } else {
+ type = t1;
+ pred = p1 || p2;
+ }
+ query.predicate = pred;
+ query.type = type;
+ query.nodes = this.nodes.concat(other.nodes);
+ return query;
+};
+
+/**
+ * Return "<a> and <b> and <c>"
+ *
+ * @return {String}
+ * @api public
+ */
+
+Query.prototype.toString = function(){
+ var pred = this.predicate ? this.predicate + ' ' : ''
+ , type = this.type || ''
+ , len = this.nodes.length
+ , str = pred + type;
+ if (len) {
+ str += (type && ' and ') + this.nodes.map(function(expr){
+ return expr.toString();
+ }).join(' and ');
+ }
+ return str;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Query.prototype.toJSON = function(){
+ return {
+ __type: 'Query',
+ predicate: this.predicate,
+ type: this.type,
+ nodes: this.nodes,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/return.js b/node_modules/stylus/lib/nodes/return.js
new file mode 100644
index 00000000..003ef380
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/return.js
@@ -0,0 +1,63 @@
+
+/*!
+ * Stylus - Return
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `Return` node with the given `expr`.
+ *
+ * @param {Expression} expr
+ * @api public
+ */
+
+var Return = module.exports = function Return(expr){
+ this.expr = expr || nodes.null;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Return.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Return.prototype.clone = function(parent){
+ var clone = new Return();
+ clone.expr = this.expr.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Return.prototype.toJSON = function(){
+ return {
+ __type: 'Return',
+ expr: this.expr,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/rgba.js b/node_modules/stylus/lib/nodes/rgba.js
new file mode 100644
index 00000000..a961dc9c
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/rgba.js
@@ -0,0 +1,367 @@
+
+/*!
+ * Stylus - RGBA
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , HSLA = require('./hsla')
+ , functions = require('../functions')
+ , adjust = functions.adjust
+ , nodes = require('./');
+
+/**
+ * Initialize a new `RGBA` with the given r,g,b,a component values.
+ *
+ * @param {Number} r
+ * @param {Number} g
+ * @param {Number} b
+ * @param {Number} a
+ * @api public
+ */
+
+var RGBA = exports = module.exports = function RGBA(r,g,b,a){
+ Node.call(this);
+ this.r = clamp(r);
+ this.g = clamp(g);
+ this.b = clamp(b);
+ this.a = clampAlpha(a);
+ this.name = '';
+ this.rgba = this;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+RGBA.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return an `RGBA` without clamping values.
+ *
+ * @param {Number} r
+ * @param {Number} g
+ * @param {Number} b
+ * @param {Number} a
+ * @return {RGBA}
+ * @api public
+ */
+
+RGBA.withoutClamping = function(r,g,b,a){
+ var rgba = new RGBA(0,0,0,0);
+ rgba.r = r;
+ rgba.g = g;
+ rgba.b = b;
+ rgba.a = a;
+ return rgba;
+};
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+RGBA.prototype.clone = function(){
+ var clone = new RGBA(
+ this.r
+ , this.g
+ , this.b
+ , this.a);
+ clone.raw = this.raw;
+ clone.name = this.name;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+RGBA.prototype.toJSON = function(){
+ return {
+ __type: 'RGBA',
+ r: this.r,
+ g: this.g,
+ b: this.b,
+ a: this.a,
+ raw: this.raw,
+ name: this.name,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return true.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+RGBA.prototype.toBoolean = function(){
+ return nodes.true;
+};
+
+/**
+ * Return `HSLA` representation.
+ *
+ * @return {HSLA}
+ * @api public
+ */
+
+RGBA.prototype.__defineGetter__('hsla', function(){
+ return HSLA.fromRGBA(this);
+});
+
+/**
+ * Return hash.
+ *
+ * @return {String}
+ * @api public
+ */
+
+RGBA.prototype.__defineGetter__('hash', function(){
+ return this.toString();
+});
+
+/**
+ * Add r,g,b,a to the current component values.
+ *
+ * @param {Number} r
+ * @param {Number} g
+ * @param {Number} b
+ * @param {Number} a
+ * @return {RGBA} new node
+ * @api public
+ */
+
+RGBA.prototype.add = function(r,g,b,a){
+ return new RGBA(
+ this.r + r
+ , this.g + g
+ , this.b + b
+ , this.a + a);
+};
+
+/**
+ * Subtract r,g,b,a from the current component values.
+ *
+ * @param {Number} r
+ * @param {Number} g
+ * @param {Number} b
+ * @param {Number} a
+ * @return {RGBA} new node
+ * @api public
+ */
+
+RGBA.prototype.sub = function(r,g,b,a){
+ return new RGBA(
+ this.r - r
+ , this.g - g
+ , this.b - b
+ , a == 1 ? this.a : this.a - a);
+};
+
+/**
+ * Multiply rgb components by `n`.
+ *
+ * @param {String} n
+ * @return {RGBA} new node
+ * @api public
+ */
+
+RGBA.prototype.multiply = function(n){
+ return new RGBA(
+ this.r * n
+ , this.g * n
+ , this.b * n
+ , this.a);
+};
+
+/**
+ * Divide rgb components by `n`.
+ *
+ * @param {String} n
+ * @return {RGBA} new node
+ * @api public
+ */
+
+RGBA.prototype.divide = function(n){
+ return new RGBA(
+ this.r / n
+ , this.g / n
+ , this.b / n
+ , this.a);
+};
+
+/**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+RGBA.prototype.operate = function(op, right){
+ if ('in' != op) right = right.first
+
+ switch (op) {
+ case 'is a':
+ if ('string' == right.nodeName && 'color' == right.string) {
+ return nodes.true;
+ }
+ break;
+ case '+':
+ switch (right.nodeName) {
+ case 'unit':
+ var n = right.val;
+ switch (right.type) {
+ case '%': return adjust(this, new nodes.String('lightness'), right);
+ case 'deg': return this.hsla.adjustHue(n).rgba;
+ default: return this.add(n,n,n,0);
+ }
+ case 'rgba':
+ return this.add(right.r, right.g, right.b, right.a);
+ case 'hsla':
+ return this.hsla.add(right.h, right.s, right.l);
+ }
+ break;
+ case '-':
+ switch (right.nodeName) {
+ case 'unit':
+ var n = right.val;
+ switch (right.type) {
+ case '%': return adjust(this, new nodes.String('lightness'), new nodes.Unit(-n, '%'));
+ case 'deg': return this.hsla.adjustHue(-n).rgba;
+ default: return this.sub(n,n,n,0);
+ }
+ case 'rgba':
+ return this.sub(right.r, right.g, right.b, right.a);
+ case 'hsla':
+ return this.hsla.sub(right.h, right.s, right.l);
+ }
+ break;
+ case '*':
+ switch (right.nodeName) {
+ case 'unit':
+ return this.multiply(right.val);
+ }
+ break;
+ case '/':
+ switch (right.nodeName) {
+ case 'unit':
+ return this.divide(right.val);
+ }
+ break;
+ }
+ return Node.prototype.operate.call(this, op, right);
+};
+
+/**
+ * Return #nnnnnn, #nnn, or rgba(n,n,n,n) string representation of the color.
+ *
+ * @return {String}
+ * @api public
+ */
+
+RGBA.prototype.toString = function(){
+ function pad(n) {
+ return n < 16
+ ? '0' + n.toString(16)
+ : n.toString(16);
+ }
+
+ // special case for transparent named color
+ if ('transparent' == this.name)
+ return this.name;
+
+ if (1 == this.a) {
+ var r = pad(this.r)
+ , g = pad(this.g)
+ , b = pad(this.b);
+
+ // Compress
+ if (r[0] == r[1] && g[0] == g[1] && b[0] == b[1]) {
+ return '#' + r[0] + g[0] + b[0];
+ } else {
+ return '#' + r + g + b;
+ }
+ } else {
+ return 'rgba('
+ + this.r + ','
+ + this.g + ','
+ + this.b + ','
+ + (+this.a.toFixed(3)) + ')';
+ }
+};
+
+/**
+ * Return a `RGBA` from the given `hsla`.
+ *
+ * @param {HSLA} hsla
+ * @return {RGBA}
+ * @api public
+ */
+
+exports.fromHSLA = function(hsla){
+ var h = hsla.h / 360
+ , s = hsla.s / 100
+ , l = hsla.l / 100
+ , a = hsla.a;
+
+ var m2 = l <= .5 ? l * (s + 1) : l + s - l * s
+ , m1 = l * 2 - m2;
+
+ var r = hue(h + 1/3) * 0xff
+ , g = hue(h) * 0xff
+ , b = hue(h - 1/3) * 0xff;
+
+ function hue(h) {
+ if (h < 0) ++h;
+ if (h > 1) --h;
+ if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
+ if (h * 2 < 1) return m2;
+ if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;
+ return m1;
+ }
+
+ return new RGBA(r,g,b,a);
+};
+
+/**
+ * Clamp `n` >= 0 and <= 255.
+ *
+ * @param {Number} n
+ * @return {Number}
+ * @api private
+ */
+
+function clamp(n) {
+ return Math.max(0, Math.min(n.toFixed(0), 255));
+}
+
+/**
+ * Clamp alpha `n` >= 0 and <= 1.
+ *
+ * @param {Number} n
+ * @return {Number}
+ * @api private
+ */
+
+function clampAlpha(n) {
+ return Math.max(0, Math.min(n, 1));
+}
diff --git a/node_modules/stylus/lib/nodes/root.js b/node_modules/stylus/lib/nodes/root.js
new file mode 100644
index 00000000..3bfb3c21
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/root.js
@@ -0,0 +1,96 @@
+
+/*!
+ * Stylus - Root
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Root` node.
+ *
+ * @api public
+ */
+
+var Root = module.exports = function Root(){
+ this.nodes = [];
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Root.prototype.__proto__ = Node.prototype;
+
+/**
+ * Push a `node` to this block.
+ *
+ * @param {Node} node
+ * @api public
+ */
+
+Root.prototype.push = function(node){
+ this.nodes.push(node);
+};
+
+/**
+ * Unshift a `node` to this block.
+ *
+ * @param {Node} node
+ * @api public
+ */
+
+Root.prototype.unshift = function(node){
+ this.nodes.unshift(node);
+};
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Root.prototype.clone = function(){
+ var clone = new Root();
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ this.nodes.forEach(function(node){
+ clone.push(node.clone(clone, clone));
+ });
+ return clone;
+};
+
+/**
+ * Return "root".
+ *
+ * @return {String}
+ * @api public
+ */
+
+Root.prototype.toString = function(){
+ return '[Root]';
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Root.prototype.toJSON = function(){
+ return {
+ __type: 'Root',
+ nodes: this.nodes,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/selector.js b/node_modules/stylus/lib/nodes/selector.js
new file mode 100644
index 00000000..db183cc7
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/selector.js
@@ -0,0 +1,94 @@
+
+/*!
+ * Stylus - Selector
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Block = require('./block')
+ , Node = require('./node');
+
+/**
+ * Initialize a new `Selector` with the given `segs`.
+ *
+ * @param {Array} segs
+ * @api public
+ */
+
+var Selector = module.exports = function Selector(segs){
+ Node.call(this);
+ this.inherits = true;
+ this.segments = segs;
+ this.optional = false;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Selector.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return the selector string.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Selector.prototype.toString = function(){
+ return this.segments.join('') + (this.optional ? ' !optional' : '');
+};
+
+/**
+ * Check if this is placeholder selector.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Selector.prototype.__defineGetter__('isPlaceholder', function(){
+ return this.val && ~this.val.substr(0, 2).indexOf('$');
+});
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Selector.prototype.clone = function(parent){
+ var clone = new Selector;
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ clone.inherits = this.inherits;
+ clone.val = this.val;
+ clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); });
+ clone.optional = this.optional;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Selector.prototype.toJSON = function(){
+ return {
+ __type: 'Selector',
+ inherits: this.inherits,
+ segments: this.segments,
+ optional: this.optional,
+ val: this.val,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/string.js b/node_modules/stylus/lib/nodes/string.js
new file mode 100644
index 00000000..1fd2b450
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/string.js
@@ -0,0 +1,147 @@
+/*!
+ * Stylus - String
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , sprintf = require('../functions').s
+ , utils = require('../utils')
+ , nodes = require('./');
+
+/**
+ * Initialize a new `String` with the given `val`.
+ *
+ * @param {String} val
+ * @param {String} quote
+ * @api public
+ */
+
+var String = module.exports = function String(val, quote){
+ Node.call(this);
+ this.val = val;
+ this.string = val;
+ this.prefixed = false;
+ if (typeof quote !== 'string') {
+ this.quote = "'";
+ } else {
+ this.quote = quote;
+ }
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+String.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return quoted string.
+ *
+ * @return {String}
+ * @api public
+ */
+
+String.prototype.toString = function(){
+ return this.quote + this.val + this.quote;
+};
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+String.prototype.clone = function(){
+ var clone = new String(this.val, this.quote);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+String.prototype.toJSON = function(){
+ return {
+ __type: 'String',
+ val: this.val,
+ quote: this.quote,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return Boolean based on the length of this string.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+String.prototype.toBoolean = function(){
+ return nodes.Boolean(this.val.length);
+};
+
+/**
+ * Coerce `other` to a string.
+ *
+ * @param {Node} other
+ * @return {String}
+ * @api public
+ */
+
+String.prototype.coerce = function(other){
+ switch (other.nodeName) {
+ case 'string':
+ return other;
+ case 'expression':
+ return new String(other.nodes.map(function(node){
+ return this.coerce(node).val;
+ }, this).join(' '));
+ default:
+ return new String(other.toString());
+ }
+};
+
+/**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+String.prototype.operate = function(op, right){
+ switch (op) {
+ case '%':
+ var expr = new nodes.Expression;
+ expr.push(this);
+
+ // constructargs
+ var args = 'expression' == right.nodeName
+ ? utils.unwrap(right).nodes
+ : [right];
+
+ // apply
+ return sprintf.apply(null, [expr].concat(args));
+ case '+':
+ var expr = new nodes.Expression;
+ expr.push(new String(this.val + this.coerce(right).val));
+ return expr;
+ default:
+ return Node.prototype.operate.call(this, op, right);
+ }
+};
diff --git a/node_modules/stylus/lib/nodes/supports.js b/node_modules/stylus/lib/nodes/supports.js
new file mode 100644
index 00000000..ab058783
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/supports.js
@@ -0,0 +1,75 @@
+/*!
+ * Stylus - supports
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Atrule = require('./atrule');
+
+/**
+ * Initialize a new supports node.
+ *
+ * @param {Expression} condition
+ * @api public
+ */
+
+var Supports = module.exports = function Supports(condition){
+ Atrule.call(this, 'supports');
+ this.condition = condition;
+};
+
+/**
+ * Inherit from `Atrule.prototype`.
+ */
+
+Supports.prototype.__proto__ = Atrule.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Supports.prototype.clone = function(parent){
+ var clone = new Supports;
+ clone.condition = this.condition.clone(parent, clone);
+ clone.block = this.block.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Supports.prototype.toJSON = function(){
+ return {
+ __type: 'Supports',
+ condition: this.condition,
+ block: this.block,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Return @supports
+ *
+ * @return {String}
+ * @api public
+ */
+
+Supports.prototype.toString = function(){
+ return '@supports ' + this.condition;
+};
diff --git a/node_modules/stylus/lib/nodes/ternary.js b/node_modules/stylus/lib/nodes/ternary.js
new file mode 100644
index 00000000..2034170a
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/ternary.js
@@ -0,0 +1,71 @@
+
+/*!
+ * Stylus - Ternary
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `Ternary` with `cond`, `trueExpr` and `falseExpr`.
+ *
+ * @param {Expression} cond
+ * @param {Expression} trueExpr
+ * @param {Expression} falseExpr
+ * @api public
+ */
+
+var Ternary = module.exports = function Ternary(cond, trueExpr, falseExpr){
+ Node.call(this);
+ this.cond = cond;
+ this.trueExpr = trueExpr;
+ this.falseExpr = falseExpr;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Ternary.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Ternary.prototype.clone = function(parent){
+ var clone = new Ternary();
+ clone.cond = this.cond.clone(parent, clone);
+ clone.trueExpr = this.trueExpr.clone(parent, clone);
+ clone.falseExpr = this.falseExpr.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Ternary.prototype.toJSON = function(){
+ return {
+ __type: 'Ternary',
+ cond: this.cond,
+ trueExpr: this.trueExpr,
+ falseExpr: this.falseExpr,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/unaryop.js b/node_modules/stylus/lib/nodes/unaryop.js
new file mode 100644
index 00000000..6ac92ab3
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/unaryop.js
@@ -0,0 +1,66 @@
+
+/*!
+ * Stylus - UnaryOp
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node');
+
+/**
+ * Initialize a new `UnaryOp` with `op`, and `expr`.
+ *
+ * @param {String} op
+ * @param {Node} expr
+ * @api public
+ */
+
+var UnaryOp = module.exports = function UnaryOp(op, expr){
+ Node.call(this);
+ this.op = op;
+ this.expr = expr;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+UnaryOp.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+UnaryOp.prototype.clone = function(parent){
+ var clone = new UnaryOp(this.op);
+ clone.expr = this.expr.clone(parent, clone);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+UnaryOp.prototype.toJSON = function(){
+ return {
+ __type: 'UnaryOp',
+ op: this.op,
+ expr: this.expr,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
diff --git a/node_modules/stylus/lib/nodes/unit.js b/node_modules/stylus/lib/nodes/unit.js
new file mode 100644
index 00000000..2d38d84f
--- /dev/null
+++ b/node_modules/stylus/lib/nodes/unit.js
@@ -0,0 +1,214 @@
+
+/*!
+ * Stylus - Unit
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Node = require('./node')
+ , nodes = require('./');
+
+/**
+ * Unit conversion table.
+ */
+
+var FACTOR_TABLE = {
+ 'mm': {val: 1, label: 'mm'},
+ 'cm': {val: 10, label: 'mm'},
+ 'in': {val: 25.4, label: 'mm'},
+ 'pt': {val: 25.4/72, label: 'mm'},
+ 'ms': {val: 1, label: 'ms'},
+ 's': {val: 1000, label: 'ms'},
+ 'Hz': {val: 1, label: 'Hz'},
+ 'kHz': {val: 1000, label: 'Hz'}
+};
+
+/**
+ * Initialize a new `Unit` with the given `val` and unit `type`
+ * such as "px", "pt", "in", etc.
+ *
+ * @param {String} val
+ * @param {String} type
+ * @api public
+ */
+
+var Unit = module.exports = function Unit(val, type){
+ Node.call(this);
+ this.val = val;
+ this.type = type;
+};
+
+/**
+ * Inherit from `Node.prototype`.
+ */
+
+Unit.prototype.__proto__ = Node.prototype;
+
+/**
+ * Return Boolean based on the unit value.
+ *
+ * @return {Boolean}
+ * @api public
+ */
+
+Unit.prototype.toBoolean = function(){
+ return nodes.Boolean(this.type
+ ? true
+ : this.val);
+};
+
+/**
+ * Return unit string.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Unit.prototype.toString = function(){
+ return this.val + (this.type || '');
+};
+
+/**
+ * Return a clone of this node.
+ *
+ * @return {Node}
+ * @api public
+ */
+
+Unit.prototype.clone = function(){
+ var clone = new Unit(this.val, this.type);
+ clone.lineno = this.lineno;
+ clone.column = this.column;
+ clone.filename = this.filename;
+ return clone;
+};
+
+/**
+ * Return a JSON representation of this node.
+ *
+ * @return {Object}
+ * @api public
+ */
+
+Unit.prototype.toJSON = function(){
+ return {
+ __type: 'Unit',
+ val: this.val,
+ type: this.type,
+ lineno: this.lineno,
+ column: this.column,
+ filename: this.filename
+ };
+};
+
+/**
+ * Operate on `right` with the given `op`.
+ *
+ * @param {String} op
+ * @param {Node} right
+ * @return {Node}
+ * @api public
+ */
+
+Unit.prototype.operate = function(op, right){
+ var type = this.type || right.first.type;
+
+ // swap color
+ if ('rgba' == right.nodeName || 'hsla' == right.nodeName) {
+ return right.operate(op, this);
+ }
+
+ // operate
+ if (this.shouldCoerce(op)) {
+ right = right.first;
+ // percentages
+ if ('%' != this.type && ('-' == op || '+' == op) && '%' == right.type) {
+ right = new Unit(this.val * (right.val / 100), '%');
+ } else {
+ right = this.coerce(right);
+ }
+
+ switch (op) {
+ case '-':
+ return new Unit(this.val - right.val, type);
+ case '+':
+ // keyframes interpolation
+ type = type || (right.type == '%' && right.type);
+ return new Unit(this.val + right.val, type);
+ case '/':
+ return new Unit(this.val / right.val, type);
+ case '*':
+ return new Unit(this.val * right.val, type);
+ case '%':
+ return new Unit(this.val % right.val, type);
+ case '**':
+ return new Unit(Math.pow(this.val, right.val), type);
+ case '..':
+ case '...':
+ var start = this.val
+ , end = right.val
+ , expr = new nodes.Expression
+ , inclusive = '..' == op;
+ if (start < end) {
+ do {
+ expr.push(new nodes.Unit(start));
+ } while (inclusive ? ++start <= end : ++start < end);
+ } else {
+ do {
+ expr.push(new nodes.Unit(start));
+ } while (inclusive ? --start >= end : --start > end);
+ }
+ return expr;
+ }
+ }
+
+ return Node.prototype.operate.call(this, op, right);
+};
+
+/**
+ * Coerce `other` unit to the same type as `this` unit.
+ *
+ * Supports:
+ *
+ * mm -> cm | in
+ * cm -> mm | in
+ * in -> mm | cm
+ *
+ * ms -> s
+ * s -> ms
+ *
+ * Hz -> kHz
+ * kHz -> Hz
+ *
+ * @param {Unit} other
+ * @return {Unit}
+ * @api public
+ */
+
+Unit.prototype.coerce = function(other){
+ if ('unit' == other.nodeName) {
+ var a = this
+ , b = other
+ , factorA = FACTOR_TABLE[a.type]
+ , factorB = FACTOR_TABLE[b.type];
+
+ if (factorA && factorB && (factorA.label == factorB.label)) {
+ var bVal = b.val * (factorB.val / factorA.val);
+ return new nodes.Unit(bVal, a.type);
+ } else {
+ return new nodes.Unit(b.val, a.type);
+ }
+ } else if ('string' == other.nodeName) {
+ // keyframes interpolation
+ if ('%' == other.val) return new nodes.Unit(0, '%');
+ var val = parseFloat(other.val);
+ if (isNaN(val)) Node.prototype.coerce.call(this, other);
+ return new nodes.Unit(val);
+ } else {
+ return Node.prototype.coerce.call(this, other);
+ }
+};
diff --git a/node_modules/stylus/lib/parser.js b/node_modules/stylus/lib/parser.js
new file mode 100644
index 00000000..392d27e4
--- /dev/null
+++ b/node_modules/stylus/lib/parser.js
@@ -0,0 +1,2181 @@
+/*!
+ * Stylus - Parser
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Lexer = require('./lexer')
+ , nodes = require('./nodes')
+ , Token = require('./token')
+ , units = require('./units')
+ , errors = require('./errors')
+ , cache = require('./cache');
+
+// debuggers
+
+var debug = {
+ lexer: require('debug')('stylus:lexer')
+ , selector: require('debug')('stylus:parser:selector')
+};
+
+/**
+ * Selector composite tokens.
+ */
+
+var selectorTokens = [
+ 'ident'
+ , 'string'
+ , 'selector'
+ , 'function'
+ , 'comment'
+ , 'boolean'
+ , 'space'
+ , 'color'
+ , 'unit'
+ , 'for'
+ , 'in'
+ , '['
+ , ']'
+ , '('
+ , ')'
+ , '+'
+ , '-'
+ , '*'
+ , '*='
+ , '<'
+ , '>'
+ , '='
+ , ':'
+ , '&'
+ , '&&'
+ , '~'
+ , '{'
+ , '}'
+ , '.'
+ , '..'
+ , '/'
+];
+
+/**
+ * CSS pseudo-classes and pseudo-elements.
+ * See http://dev.w3.org/csswg/selectors4/
+ */
+
+var pseudoSelectors = [
+ // Logical Combinations
+ 'matches'
+ , 'not'
+
+ // Linguistic Pseudo-classes
+ , 'dir'
+ , 'lang'
+
+ // Location Pseudo-classes
+ , 'any-link'
+ , 'link'
+ , 'visited'
+ , 'local-link'
+ , 'target'
+ , 'scope'
+
+ // User Action Pseudo-classes
+ , 'hover'
+ , 'active'
+ , 'focus'
+ , 'drop'
+
+ // Time-dimensional Pseudo-classes
+ , 'current'
+ , 'past'
+ , 'future'
+
+ // The Input Pseudo-classes
+ , 'enabled'
+ , 'disabled'
+ , 'read-only'
+ , 'read-write'
+ , 'placeholder-shown'
+ , 'checked'
+ , 'indeterminate'
+ , 'valid'
+ , 'invalid'
+ , 'in-range'
+ , 'out-of-range'
+ , 'required'
+ , 'optional'
+ , 'user-error'
+
+ // Tree-Structural pseudo-classes
+ , 'root'
+ , 'empty'
+ , 'blank'
+ , 'nth-child'
+ , 'nth-last-child'
+ , 'first-child'
+ , 'last-child'
+ , 'only-child'
+ , 'nth-of-type'
+ , 'nth-last-of-type'
+ , 'first-of-type'
+ , 'last-of-type'
+ , 'only-of-type'
+ , 'nth-match'
+ , 'nth-last-match'
+
+ // Grid-Structural Selectors
+ , 'nth-column'
+ , 'nth-last-column'
+
+ // Pseudo-elements
+ , 'first-line'
+ , 'first-letter'
+ , 'before'
+ , 'after'
+
+ // Non-standard
+ , 'selection'
+];
+
+/**
+ * Initialize a new `Parser` with the given `str` and `options`.
+ *
+ * @param {String} str
+ * @param {Object} options
+ * @api private
+ */
+
+var Parser = module.exports = function Parser(str, options) {
+ var self = this;
+ options = options || {};
+ Parser.cache = Parser.cache || Parser.getCache(options);
+ this.hash = Parser.cache.key(str, options);
+ this.lexer = {};
+ if (!Parser.cache.has(this.hash)) {
+ this.lexer = new Lexer(str, options);
+ }
+ this.prefix = options.prefix || '';
+ this.root = options.root || new nodes.Root;
+ this.state = ['root'];
+ this.stash = [];
+ this.parens = 0;
+ this.css = 0;
+ this.state.pop = function(){
+ self.prevState = [].pop.call(this);
+ };
+};
+
+/**
+ * Get cache instance.
+ *
+ * @param {Object} options
+ * @return {Object}
+ * @api private
+ */
+
+Parser.getCache = function(options) {
+ return false === options.cache
+ ? cache(false)
+ : cache(options.cache || 'memory', options);
+};
+
+/**
+ * Parser prototype.
+ */
+
+Parser.prototype = {
+
+ /**
+ * Constructor.
+ */
+
+ constructor: Parser,
+
+ /**
+ * Return current state.
+ *
+ * @return {String}
+ * @api private
+ */
+
+ currentState: function() {
+ return this.state[this.state.length - 1];
+ },
+
+ /**
+ * Return previous state.
+ *
+ * @return {String}
+ * @api private
+ */
+
+ previousState: function() {
+ return this.state[this.state.length - 2];
+ },
+
+ /**
+ * Parse the input, then return the root node.
+ *
+ * @return {Node}
+ * @api private
+ */
+
+ parse: function(){
+ var block = this.parent = this.root;
+ if (Parser.cache.has(this.hash)) {
+ block = Parser.cache.get(this.hash);
+ // normalize cached imports
+ if ('block' == block.nodeName) block.constructor = nodes.Root;
+ } else {
+ while ('eos' != this.peek().type) {
+ this.skipWhitespace();
+ if ('eos' == this.peek().type) break;
+ var stmt = this.statement();
+ this.accept(';');
+ if (!stmt) this.error('unexpected token {peek}, not allowed at the root level');
+ block.push(stmt);
+ }
+ Parser.cache.set(this.hash, block);
+ }
+ return block;
+ },
+
+ /**
+ * Throw an `Error` with the given `msg`.
+ *
+ * @param {String} msg
+ * @api private
+ */
+
+ error: function(msg){
+ var type = this.peek().type
+ , val = undefined == this.peek().val
+ ? ''
+ : ' ' + this.peek().toString();
+ if (val.trim() == type.trim()) val = '';
+ throw new errors.ParseError(msg.replace('{peek}', '"' + type + val + '"'));
+ },
+
+ /**
+ * Accept the given token `type`, and return it,
+ * otherwise return `undefined`.
+ *
+ * @param {String} type
+ * @return {Token}
+ * @api private
+ */
+
+ accept: function(type){
+ if (type == this.peek().type) {
+ return this.next();
+ }
+ },
+
+ /**
+ * Expect token `type` and return it, throw otherwise.
+ *
+ * @param {String} type
+ * @return {Token}
+ * @api private
+ */
+
+ expect: function(type){
+ if (type != this.peek().type) {
+ this.error('expected "' + type + '", got {peek}');
+ }
+ return this.next();
+ },
+
+ /**
+ * Get the next token.
+ *
+ * @return {Token}
+ * @api private
+ */
+
+ next: function() {
+ var tok = this.stash.length
+ ? this.stash.pop()
+ : this.lexer.next()
+ , line = tok.lineno
+ , column = tok.column || 1;
+
+ if (tok.val && tok.val.nodeName) {
+ tok.val.lineno = line;
+ tok.val.column = column;
+ }
+ nodes.lineno = line;
+ nodes.column = column;
+ debug.lexer('%s %s', tok.type, tok.val || '');
+ return tok;
+ },
+
+ /**
+ * Peek with lookahead(1).
+ *
+ * @return {Token}
+ * @api private
+ */
+
+ peek: function() {
+ return this.lexer.peek();
+ },
+
+ /**
+ * Lookahead `n` tokens.
+ *
+ * @param {Number} n
+ * @return {Token}
+ * @api private
+ */
+
+ lookahead: function(n){
+ return this.lexer.lookahead(n);
+ },
+
+ /**
+ * Check if the token at `n` is a valid selector token.
+ *
+ * @param {Number} n
+ * @return {Boolean}
+ * @api private
+ */
+
+ isSelectorToken: function(n) {
+ var la = this.lookahead(n).type;
+ switch (la) {
+ case 'for':
+ return this.bracketed;
+ case '[':
+ this.bracketed = true;
+ return true;
+ case ']':
+ this.bracketed = false;
+ return true;
+ default:
+ return ~selectorTokens.indexOf(la);
+ }
+ },
+
+ /**
+ * Check if the token at `n` is a pseudo selector.
+ *
+ * @param {Number} n
+ * @return {Boolean}
+ * @api private
+ */
+
+ isPseudoSelector: function(n){
+ var val = this.lookahead(n).val;
+ return val && ~pseudoSelectors.indexOf(val.name);
+ },
+
+ /**
+ * Check if the current line contains `type`.
+ *
+ * @param {String} type
+ * @return {Boolean}
+ * @api private
+ */
+
+ lineContains: function(type){
+ var i = 1
+ , la;
+
+ while (la = this.lookahead(i++)) {
+ if (~['indent', 'outdent', 'newline', 'eos'].indexOf(la.type)) return;
+ if (type == la.type) return true;
+ }
+ },
+
+ /**
+ * Valid selector tokens.
+ */
+
+ selectorToken: function() {
+ if (this.isSelectorToken(1)) {
+ if ('{' == this.peek().type) {
+ // unclosed, must be a block
+ if (!this.lineContains('}')) return;
+ // check if ':' is within the braces.
+ // though not required by Stylus, chances
+ // are if someone is using {} they will
+ // use CSS-style props, helping us with
+ // the ambiguity in this case
+ var i = 0
+ , la;
+ while (la = this.lookahead(++i)) {
+ if ('}' == la.type) {
+ // Check empty block.
+ if (i == 2 || (i == 3 && this.lookahead(i - 1).type == 'space'))
+ return;
+ break;
+ }
+ if (':' == la.type) return;
+ }
+ }
+ return this.next();
+ }
+ },
+
+ /**
+ * Skip the given `tokens`.
+ *
+ * @param {Array} tokens
+ * @api private
+ */
+
+ skip: function(tokens) {
+ while (~tokens.indexOf(this.peek().type))
+ this.next();
+ },
+
+ /**
+ * Consume whitespace.
+ */
+
+ skipWhitespace: function() {
+ this.skip(['space', 'indent', 'outdent', 'newline']);
+ },
+
+ /**
+ * Consume newlines.
+ */
+
+ skipNewlines: function() {
+ while ('newline' == this.peek().type)
+ this.next();
+ },
+
+ /**
+ * Consume spaces.
+ */
+
+ skipSpaces: function() {
+ while ('space' == this.peek().type)
+ this.next();
+ },
+
+ /**
+ * Consume spaces and comments.
+ */
+
+ skipSpacesAndComments: function() {
+ while ('space' == this.peek().type
+ || 'comment' == this.peek().type)
+ this.next();
+ },
+
+ /**
+ * Check if the following sequence of tokens
+ * forms a function definition, ie trailing
+ * `{` or indentation.
+ */
+
+ looksLikeFunctionDefinition: function(i) {
+ return 'indent' == this.lookahead(i).type
+ || '{' == this.lookahead(i).type;
+ },
+
+ /**
+ * Check if the following sequence of tokens
+ * forms a selector.
+ *
+ * @param {Boolean} [fromProperty]
+ * @return {Boolean}
+ * @api private
+ */
+
+ looksLikeSelector: function(fromProperty) {
+ var i = 1
+ , brace;
+
+ // Real property
+ if (fromProperty && ':' == this.lookahead(i + 1).type
+ && (this.lookahead(i + 1).space || 'indent' == this.lookahead(i + 2).type))
+ return false;
+
+ // Assume selector when an ident is
+ // followed by a selector
+ while ('ident' == this.lookahead(i).type
+ && ('newline' == this.lookahead(i + 1).type
+ || ',' == this.lookahead(i + 1).type)) i += 2;
+
+ while (this.isSelectorToken(i)
+ || ',' == this.lookahead(i).type) {
+
+ if ('selector' == this.lookahead(i).type)
+ return true;
+
+ if ('&' == this.lookahead(i + 1).type)
+ return true;
+
+ if ('.' == this.lookahead(i).type && 'ident' == this.lookahead(i + 1).type)
+ return true;
+
+ if ('*' == this.lookahead(i).type && 'newline' == this.lookahead(i + 1).type)
+ return true;
+
+ // Pseudo-elements
+ if (':' == this.lookahead(i).type
+ && ':' == this.lookahead(i + 1).type)
+ return true;
+
+ // #a after an ident and newline
+ if ('color' == this.lookahead(i).type
+ && 'newline' == this.lookahead(i - 1).type)
+ return true;
+
+ if (this.looksLikeAttributeSelector(i))
+ return true;
+
+ if (('=' == this.lookahead(i).type || 'function' == this.lookahead(i).type)
+ && '{' == this.lookahead(i + 1).type)
+ return false;
+
+ // Hash values inside properties
+ if (':' == this.lookahead(i).type
+ && !this.isPseudoSelector(i + 1)
+ && this.lineContains('.'))
+ return false;
+
+ // the ':' token within braces signifies
+ // a selector. ex: "foo{bar:'baz'}"
+ if ('{' == this.lookahead(i).type) brace = true;
+ else if ('}' == this.lookahead(i).type) brace = false;
+ if (brace && ':' == this.lookahead(i).type) return true;
+
+ // '{' preceded by a space is considered a selector.
+ // for example "foo{bar}{baz}" may be a property,
+ // however "foo{bar} {baz}" is a selector
+ if ('space' == this.lookahead(i).type
+ && '{' == this.lookahead(i + 1).type)
+ return true;
+
+ // Assume pseudo selectors are NOT properties
+ // as 'td:th-child(1)' may look like a property
+ // and function call to the parser otherwise
+ if (':' == this.lookahead(i++).type
+ && !this.lookahead(i-1).space
+ && this.isPseudoSelector(i))
+ return true;
+
+ // Trailing space
+ if ('space' == this.lookahead(i).type
+ && 'newline' == this.lookahead(i + 1).type
+ && '{' == this.lookahead(i + 2).type)
+ return true;
+
+ if (',' == this.lookahead(i).type
+ && 'newline' == this.lookahead(i + 1).type)
+ return true;
+ }
+
+ // Trailing comma
+ if (',' == this.lookahead(i).type
+ && 'newline' == this.lookahead(i + 1).type)
+ return true;
+
+ // Trailing brace
+ if ('{' == this.lookahead(i).type
+ && 'newline' == this.lookahead(i + 1).type)
+ return true;
+
+ // css-style mode, false on ; }
+ if (this.css) {
+ if (';' == this.lookahead(i).type ||
+ '}' == this.lookahead(i - 1).type)
+ return false;
+ }
+
+ // Trailing separators
+ while (!~[
+ 'indent'
+ , 'outdent'
+ , 'newline'
+ , 'for'
+ , 'if'
+ , ';'
+ , '}'
+ , 'eos'].indexOf(this.lookahead(i).type))
+ ++i;
+
+ if ('indent' == this.lookahead(i).type)
+ return true;
+ },
+
+ /**
+ * Check if the following sequence of tokens
+ * forms an attribute selector.
+ */
+
+ looksLikeAttributeSelector: function(n) {
+ var type = this.lookahead(n).type;
+ if ('=' == type && this.bracketed) return true;
+ return ('ident' == type || 'string' == type)
+ && ']' == this.lookahead(n + 1).type
+ && ('newline' == this.lookahead(n + 2).type || this.isSelectorToken(n + 2))
+ && !this.lineContains(':')
+ && !this.lineContains('=');
+ },
+
+ /**
+ * Check if the following sequence of tokens
+ * forms a keyframe block.
+ */
+
+ looksLikeKeyframe: function() {
+ var i = 2
+ , type;
+ switch (this.lookahead(i).type) {
+ case '{':
+ case 'indent':
+ case ',':
+ return true;
+ case 'newline':
+ while ('unit' == this.lookahead(++i).type
+ || 'newline' == this.lookahead(i).type) ;
+ type = this.lookahead(i).type;
+ return 'indent' == type || '{' == type;
+ }
+ },
+
+ /**
+ * Check if the current state supports selectors.
+ */
+
+ stateAllowsSelector: function() {
+ switch (this.currentState()) {
+ case 'root':
+ case 'atblock':
+ case 'selector':
+ case 'conditional':
+ case 'function':
+ case 'atrule':
+ case 'for':
+ return true;
+ }
+ },
+
+ /**
+ * Try to assign @block to the node.
+ *
+ * @param {Expression} expr
+ * @private
+ */
+
+ assignAtblock: function(expr) {
+ try {
+ expr.push(this.atblock(expr));
+ } catch(err) {
+ this.error('invalid right-hand side operand in assignment, got {peek}');
+ }
+ },
+
+ /**
+ * statement
+ * | statement 'if' expression
+ * | statement 'unless' expression
+ */
+
+ statement: function() {
+ var stmt = this.stmt()
+ , state = this.prevState
+ , block
+ , op;
+
+ // special-case statements since it
+ // is not an expression. We could
+ // implement postfix conditionals at
+ // the expression level, however they
+ // would then fail to enclose properties
+ if (this.allowPostfix) {
+ this.allowPostfix = false;
+ state = 'expression';
+ }
+
+ switch (state) {
+ case 'assignment':
+ case 'expression':
+ case 'function arguments':
+ while (op =
+ this.accept('if')
+ || this.accept('unless')
+ || this.accept('for')) {
+ switch (op.type) {
+ case 'if':
+ case 'unless':
+ stmt = new nodes.If(this.expression(), stmt);
+ stmt.postfix = true;
+ stmt.negate = 'unless' == op.type;
+ this.accept(';');
+ break;
+ case 'for':
+ var key
+ , val = this.id().name;
+ if (this.accept(',')) key = this.id().name;
+ this.expect('in');
+ var each = new nodes.Each(val, key, this.expression());
+ block = new nodes.Block(this.parent, each);
+ block.push(stmt);
+ each.block = block;
+ stmt = each;
+ }
+ }
+ }
+
+ return stmt;
+ },
+
+ /**
+ * ident
+ * | selector
+ * | literal
+ * | charset
+ * | namespace
+ * | import
+ * | require
+ * | media
+ * | atrule
+ * | scope
+ * | keyframes
+ * | mozdocument
+ * | for
+ * | if
+ * | unless
+ * | comment
+ * | expression
+ * | 'return' expression
+ */
+
+ stmt: function() {
+ var type = this.peek().type;
+ switch (type) {
+ case 'keyframes':
+ return this.keyframes();
+ case '-moz-document':
+ return this.mozdocument();
+ case 'comment':
+ case 'selector':
+ case 'literal':
+ case 'charset':
+ case 'namespace':
+ case 'import':
+ case 'require':
+ case 'extend':
+ case 'media':
+ case 'atrule':
+ case 'ident':
+ case 'scope':
+ case 'supports':
+ case 'unless':
+ case 'function':
+ case 'for':
+ case 'if':
+ return this[type]();
+ case 'return':
+ return this.return();
+ case '{':
+ return this.property();
+ default:
+ // Contextual selectors
+ if (this.stateAllowsSelector()) {
+ switch (type) {
+ case 'color':
+ case '~':
+ case '>':
+ case '<':
+ case ':':
+ case '&':
+ case '&&':
+ case '[':
+ case '.':
+ case '/':
+ return this.selector();
+ // relative reference
+ case '..':
+ if ('/' == this.lookahead(2).type)
+ return this.selector();
+ case '+':
+ return 'function' == this.lookahead(2).type
+ ? this.functionCall()
+ : this.selector();
+ case '*':
+ return this.property();
+ // keyframe blocks (10%, 20% { ... })
+ case 'unit':
+ if (this.looksLikeKeyframe()) return this.selector();
+ case '-':
+ if ('{' == this.lookahead(2).type)
+ return this.property();
+ }
+ }
+
+ // Expression fallback
+ var expr = this.expression();
+ if (expr.isEmpty) this.error('unexpected {peek}');
+ return expr;
+ }
+ },
+
+ /**
+ * indent (!outdent)+ outdent
+ */
+
+ block: function(node, scope) {
+ var delim
+ , stmt
+ , next
+ , block = this.parent = new nodes.Block(this.parent, node);
+
+ if (false === scope) block.scope = false;
+
+ this.accept('newline');
+
+ // css-style
+ if (this.accept('{')) {
+ this.css++;
+ delim = '}';
+ this.skipWhitespace();
+ } else {
+ delim = 'outdent';
+ this.expect('indent');
+ }
+
+ while (delim != this.peek().type) {
+ // css-style
+ if (this.css) {
+ if (this.accept('newline') || this.accept('indent')) continue;
+ stmt = this.statement();
+ this.accept(';');
+ this.skipWhitespace();
+ } else {
+ if (this.accept('newline')) continue;
+ // skip useless indents and comments
+ next = this.lookahead(2).type;
+ if ('indent' == this.peek().type
+ && ~['outdent', 'newline', 'comment'].indexOf(next)) {
+ this.skip(['indent', 'outdent']);
+ continue;
+ }
+ if ('eos' == this.peek().type) return block;
+ stmt = this.statement();
+ this.accept(';');
+ }
+ if (!stmt) this.error('unexpected token {peek} in block');
+ block.push(stmt);
+ }
+
+ // css-style
+ if (this.css) {
+ this.skipWhitespace();
+ this.expect('}');
+ this.skipSpaces();
+ this.css--;
+ } else {
+ this.expect('outdent');
+ }
+
+ this.parent = block.parent;
+ return block;
+ },
+
+ /**
+ * comment space*
+ */
+
+ comment: function(){
+ var node = this.next().val;
+ this.skipSpaces();
+ return node;
+ },
+
+ /**
+ * for val (',' key) in expr
+ */
+
+ for: function() {
+ this.expect('for');
+ var key
+ , val = this.id().name;
+ if (this.accept(',')) key = this.id().name;
+ this.expect('in');
+ this.state.push('for');
+ this.cond = true;
+ var each = new nodes.Each(val, key, this.expression());
+ this.cond = false;
+ each.block = this.block(each, false);
+ this.state.pop();
+ return each;
+ },
+
+ /**
+ * return expression
+ */
+
+ return: function() {
+ this.expect('return');
+ var expr = this.expression();
+ return expr.isEmpty
+ ? new nodes.Return
+ : new nodes.Return(expr);
+ },
+
+ /**
+ * unless expression block
+ */
+
+ unless: function() {
+ this.expect('unless');
+ this.state.push('conditional');
+ this.cond = true;
+ var node = new nodes.If(this.expression(), true);
+ this.cond = false;
+ node.block = this.block(node, false);
+ this.state.pop();
+ return node;
+ },
+
+ /**
+ * if expression block (else block)?
+ */
+
+ if: function() {
+ this.expect('if');
+ this.state.push('conditional');
+ this.cond = true;
+ var node = new nodes.If(this.expression())
+ , cond
+ , block;
+ this.cond = false;
+ node.block = this.block(node, false);
+ this.skip(['newline', 'comment']);
+ while (this.accept('else')) {
+ if (this.accept('if')) {
+ this.cond = true;
+ cond = this.expression();
+ this.cond = false;
+ block = this.block(node, false);
+ node.elses.push(new nodes.If(cond, block));
+ } else {
+ node.elses.push(this.block(node, false));
+ break;
+ }
+ this.skip(['newline', 'comment']);
+ }
+ this.state.pop();
+ return node;
+ },
+
+ /**
+ * @block
+ *
+ * @param {Expression} [node]
+ */
+
+ atblock: function(node){
+ if (!node) this.expect('atblock');
+ node = new nodes.Atblock;
+ this.state.push('atblock');
+ node.block = this.block(node, false);
+ this.state.pop();
+ return node;
+ },
+
+ /**
+ * atrule selector? block?
+ */
+
+ atrule: function(){
+ var type = this.expect('atrule').val
+ , node = new nodes.Atrule(type)
+ , tok;
+ this.skipSpacesAndComments();
+ node.segments = this.selectorParts();
+ this.skipSpacesAndComments();
+ tok = this.peek().type;
+ if ('indent' == tok || '{' == tok || ('newline' == tok
+ && '{' == this.lookahead(2).type)) {
+ this.state.push('atrule');
+ node.block = this.block(node);
+ this.state.pop();
+ }
+ return node;
+ },
+
+ /**
+ * scope
+ */
+
+ scope: function(){
+ this.expect('scope');
+ var selector = this.selectorParts()
+ .map(function(selector) { return selector.val; })
+ .join('');
+ this.selectorScope = selector.trim();
+ return nodes.null;
+ },
+
+ /**
+ * supports
+ */
+
+ supports: function(){
+ this.expect('supports');
+ var node = new nodes.Supports(this.supportsCondition());
+ this.state.push('atrule');
+ node.block = this.block(node);
+ this.state.pop();
+ return node;
+ },
+
+ /**
+ * supports negation
+ * | supports op
+ * | expression
+ */
+
+ supportsCondition: function(){
+ var node = this.supportsNegation()
+ || this.supportsOp();
+ if (!node) {
+ this.cond = true;
+ node = this.expression();
+ this.cond = false;
+ }
+ return node;
+ },
+
+ /**
+ * 'not' supports feature
+ */
+
+ supportsNegation: function(){
+ if (this.accept('not')) {
+ var node = new nodes.Expression;
+ node.push(new nodes.Literal('not'));
+ node.push(this.supportsFeature());
+ return node;
+ }
+ },
+
+ /**
+ * supports feature (('and' | 'or') supports feature)+
+ */
+
+ supportsOp: function(){
+ var feature = this.supportsFeature()
+ , op
+ , expr;
+ if (feature) {
+ expr = new nodes.Expression;
+ expr.push(feature);
+ while (op = this.accept('&&') || this.accept('||')) {
+ expr.push(new nodes.Literal('&&' == op.val ? 'and' : 'or'));
+ expr.push(this.supportsFeature());
+ }
+ return expr;
+ }
+ },
+
+ /**
+ * ('(' supports condition ')')
+ * | feature
+ */
+
+ supportsFeature: function(){
+ this.skipSpacesAndComments();
+ if ('(' == this.peek().type) {
+ var la = this.lookahead(2).type;
+
+ if ('ident' == la || '{' == la) {
+ return this.feature();
+ } else {
+ this.expect('(');
+ var node = new nodes.Expression;
+ node.push(new nodes.Literal('('));
+ node.push(this.supportsCondition());
+ this.expect(')')
+ node.push(new nodes.Literal(')'));
+ this.skipSpacesAndComments();
+ return node;
+ }
+ }
+ },
+
+ /**
+ * extend
+ */
+
+ extend: function(){
+ var tok = this.expect('extend')
+ , selectors = []
+ , sel
+ , node
+ , arr;
+
+ do {
+ arr = this.selectorParts();
+
+ if (!arr.length) continue;
+
+ sel = new nodes.Selector(arr);
+ selectors.push(sel);
+
+ if ('!' !== this.peek().type) continue;
+
+ tok = this.lookahead(2);
+ if ('ident' !== tok.type || 'optional' !== tok.val.name) continue;
+
+ this.skip(['!', 'ident']);
+ sel.optional = true;
+ } while(this.accept(','));
+
+ node = new nodes.Extend(selectors);
+ node.lineno = tok.lineno;
+ node.column = tok.column;
+ return node;
+ },
+
+ /**
+ * media queries
+ */
+
+ media: function() {
+ this.expect('media');
+ this.state.push('atrule');
+ var media = new nodes.Media(this.queries());
+ media.block = this.block(media);
+ this.state.pop();
+ return media;
+ },
+
+ /**
+ * query (',' query)*
+ */
+
+ queries: function() {
+ var queries = new nodes.QueryList
+ , skip = ['comment', 'newline', 'space'];
+
+ do {
+ this.skip(skip);
+ queries.push(this.query());
+ this.skip(skip);
+ } while (this.accept(','));
+ return queries;
+ },
+
+ /**
+ * expression
+ * | (ident | 'not')? ident ('and' feature)*
+ * | feature ('and' feature)*
+ */
+
+ query: function() {
+ var query = new nodes.Query
+ , expr
+ , pred
+ , id;
+
+ // hash values support
+ if ('ident' == this.peek().type
+ && ('.' == this.lookahead(2).type
+ || '[' == this.lookahead(2).type)) {
+ this.cond = true;
+ expr = this.expression();
+ this.cond = false;
+ query.push(new nodes.Feature(expr.nodes));
+ return query;
+ }
+
+ if (pred = this.accept('ident') || this.accept('not')) {
+ pred = new nodes.Literal(pred.val.string || pred.val);
+
+ this.skipSpacesAndComments();
+ if (id = this.accept('ident')) {
+ query.type = id.val;
+ query.predicate = pred;
+ } else {
+ query.type = pred;
+ }
+ this.skipSpacesAndComments();
+
+ if (!this.accept('&&')) return query;
+ }
+
+ do {
+ query.push(this.feature());
+ } while (this.accept('&&'));
+
+ return query;
+ },
+
+ /**
+ * '(' ident ( ':'? expression )? ')'
+ */
+
+ feature: function() {
+ this.skipSpacesAndComments();
+ this.expect('(');
+ this.skipSpacesAndComments();
+ var node = new nodes.Feature(this.interpolate());
+ this.skipSpacesAndComments();
+ this.accept(':')
+ this.skipSpacesAndComments();
+ this.inProperty = true;
+ node.expr = this.list();
+ this.inProperty = false;
+ this.skipSpacesAndComments();
+ this.expect(')');
+ this.skipSpacesAndComments();
+ return node;
+ },
+
+ /**
+ * @-moz-document call (',' call)* block
+ */
+
+ mozdocument: function(){
+ this.expect('-moz-document');
+ var mozdocument = new nodes.Atrule('-moz-document')
+ , calls = [];
+ do {
+ this.skipSpacesAndComments();
+ calls.push(this.functionCall());
+ this.skipSpacesAndComments();
+ } while (this.accept(','));
+ mozdocument.segments = [new nodes.Literal(calls.join(', '))];
+ this.state.push('atrule');
+ mozdocument.block = this.block(mozdocument, false);
+ this.state.pop();
+ return mozdocument;
+ },
+
+ /**
+ * import expression
+ */
+
+ import: function() {
+ this.expect('import');
+ this.allowPostfix = true;
+ return new nodes.Import(this.expression(), false);
+ },
+
+ /**
+ * require expression
+ */
+
+ require: function() {
+ this.expect('require');
+ this.allowPostfix = true;
+ return new nodes.Import(this.expression(), true);
+ },
+
+ /**
+ * charset string
+ */
+
+ charset: function() {
+ this.expect('charset');
+ var str = this.expect('string').val;
+ this.allowPostfix = true;
+ return new nodes.Charset(str);
+ },
+
+ /**
+ * namespace ident? (string | url)
+ */
+
+ namespace: function() {
+ var str
+ , prefix;
+ this.expect('namespace');
+
+ this.skipSpacesAndComments();
+ if (prefix = this.accept('ident')) {
+ prefix = prefix.val;
+ }
+ this.skipSpacesAndComments();
+
+ str = this.accept('string') || this.url();
+ this.allowPostfix = true;
+ return new nodes.Namespace(str, prefix);
+ },
+
+ /**
+ * keyframes name block
+ */
+
+ keyframes: function() {
+ var tok = this.expect('keyframes')
+ , keyframes;
+
+ this.skipSpacesAndComments();
+ keyframes = new nodes.Keyframes(this.selectorParts(), tok.val);
+ this.skipSpacesAndComments();
+
+ // block
+ this.state.push('atrule');
+ keyframes.block = this.block(keyframes);
+ this.state.pop();
+
+ return keyframes;
+ },
+
+ /**
+ * literal
+ */
+
+ literal: function() {
+ return this.expect('literal').val;
+ },
+
+ /**
+ * ident space?
+ */
+
+ id: function() {
+ var tok = this.expect('ident');
+ this.accept('space');
+ return tok.val;
+ },
+
+ /**
+ * ident
+ * | assignment
+ * | property
+ * | selector
+ */
+
+ ident: function() {
+ var i = 2
+ , la = this.lookahead(i).type;
+
+ while ('space' == la) la = this.lookahead(++i).type;
+
+ switch (la) {
+ // Assignment
+ case '=':
+ case '?=':
+ case '-=':
+ case '+=':
+ case '*=':
+ case '/=':
+ case '%=':
+ return this.assignment();
+ // Member
+ case '.':
+ if ('space' == this.lookahead(i - 1).type) return this.selector();
+ if (this._ident == this.peek()) return this.id();
+ while ('=' != this.lookahead(++i).type
+ && !~['[', ',', 'newline', 'indent', 'eos'].indexOf(this.lookahead(i).type)) ;
+ if ('=' == this.lookahead(i).type) {
+ this._ident = this.peek();
+ return this.expression();
+ } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {
+ return this.selector();
+ }
+ // Assignment []=
+ case '[':
+ if (this._ident == this.peek()) return this.id();
+ while (']' != this.lookahead(i++).type
+ && 'selector' != this.lookahead(i).type
+ && 'eos' != this.lookahead(i).type) ;
+ if ('=' == this.lookahead(i).type) {
+ this._ident = this.peek();
+ return this.expression();
+ } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {
+ return this.selector();
+ }
+ // Operation
+ case '-':
+ case '+':
+ case '/':
+ case '*':
+ case '%':
+ case '**':
+ case '&&':
+ case '||':
+ case '>':
+ case '<':
+ case '>=':
+ case '<=':
+ case '!=':
+ case '==':
+ case '?':
+ case 'in':
+ case 'is a':
+ case 'is defined':
+ // Prevent cyclic .ident, return literal
+ if (this._ident == this.peek()) {
+ return this.id();
+ } else {
+ this._ident = this.peek();
+ switch (this.currentState()) {
+ // unary op or selector in property / for
+ case 'for':
+ case 'selector':
+ return this.property();
+ // Part of a selector
+ case 'root':
+ case 'atblock':
+ case 'atrule':
+ return '[' == la
+ ? this.subscript()
+ : this.selector();
+ case 'function':
+ case 'conditional':
+ return this.looksLikeSelector()
+ ? this.selector()
+ : this.expression();
+ // Do not disrupt the ident when an operand
+ default:
+ return this.operand
+ ? this.id()
+ : this.expression();
+ }
+ }
+ // Selector or property
+ default:
+ switch (this.currentState()) {
+ case 'root':
+ return this.selector();
+ case 'for':
+ case 'selector':
+ case 'function':
+ case 'conditional':
+ case 'atblock':
+ case 'atrule':
+ return this.property();
+ default:
+ var id = this.id();
+ if ('interpolation' == this.previousState()) id.mixin = true;
+ return id;
+ }
+ }
+ },
+
+ /**
+ * '*'? (ident | '{' expression '}')+
+ */
+
+ interpolate: function() {
+ var node
+ , segs = []
+ , star;
+
+ star = this.accept('*');
+ if (star) segs.push(new nodes.Literal('*'));
+
+ while (true) {
+ if (this.accept('{')) {
+ this.state.push('interpolation');
+ segs.push(this.expression());
+ this.expect('}');
+ this.state.pop();
+ } else if (node = this.accept('-')){
+ segs.push(new nodes.Literal('-'));
+ } else if (node = this.accept('ident')){
+ segs.push(node.val);
+ } else {
+ break;
+ }
+ }
+ if (!segs.length) this.expect('ident');
+ return segs;
+ },
+
+ /**
+ * property ':'? expression
+ * | ident
+ */
+
+ property: function() {
+ if (this.looksLikeSelector(true)) return this.selector();
+
+ // property
+ var ident = this.interpolate()
+ , prop = new nodes.Property(ident)
+ , ret = prop;
+
+ // optional ':'
+ this.accept('space');
+ if (this.accept(':')) this.accept('space');
+
+ this.state.push('property');
+ this.inProperty = true;
+ prop.expr = this.list();
+ if (prop.expr.isEmpty) ret = ident[0];
+ this.inProperty = false;
+ this.allowPostfix = true;
+ this.state.pop();
+
+ // optional ';'
+ this.accept(';');
+
+ return ret;
+ },
+
+ /**
+ * selector ',' selector
+ * | selector newline selector
+ * | selector block
+ */
+
+ selector: function() {
+ var arr
+ , group = new nodes.Group
+ , scope = this.selectorScope
+ , isRoot = 'root' == this.currentState()
+ , selector;
+
+ do {
+ // Clobber newline after ,
+ this.accept('newline');
+
+ arr = this.selectorParts();
+
+ // Push the selector
+ if (isRoot && scope) arr.unshift(new nodes.Literal(scope + ' '));
+ if (arr.length) {
+ selector = new nodes.Selector(arr);
+ selector.lineno = arr[0].lineno;
+ selector.column = arr[0].column;
+ group.push(selector);
+ }
+ } while (this.accept(',') || this.accept('newline'));
+
+ if ('selector-parts' == this.currentState()) return group.nodes;
+
+ this.state.push('selector');
+ group.block = this.block(group);
+ this.state.pop();
+
+ return group;
+ },
+
+ selectorParts: function(){
+ var tok
+ , arr = [];
+
+ // Selector candidates,
+ // stitched together to
+ // form a selector.
+ while (tok = this.selectorToken()) {
+ debug.selector('%s', tok);
+ // Selector component
+ switch (tok.type) {
+ case '{':
+ this.skipSpaces();
+ var expr = this.expression();
+ this.skipSpaces();
+ this.expect('}');
+ arr.push(expr);
+ break;
+ case this.prefix && '.':
+ var literal = new nodes.Literal(tok.val + this.prefix);
+ literal.prefixed = true;
+ arr.push(literal);
+ break;
+ case 'comment':
+ // ignore comments
+ break;
+ case 'color':
+ case 'unit':
+ arr.push(new nodes.Literal(tok.val.raw));
+ break;
+ case 'space':
+ arr.push(new nodes.Literal(' '));
+ break;
+ case 'function':
+ arr.push(new nodes.Literal(tok.val.name + '('));
+ break;
+ case 'ident':
+ arr.push(new nodes.Literal(tok.val.name || tok.val.string));
+ break;
+ default:
+ arr.push(new nodes.Literal(tok.val));
+ if (tok.space) arr.push(new nodes.Literal(' '));
+ }
+ }
+
+ return arr;
+ },
+
+ /**
+ * ident ('=' | '?=') expression
+ */
+
+ assignment: function() {
+ var op
+ , node
+ , name = this.id().name;
+
+ if (op =
+ this.accept('=')
+ || this.accept('?=')
+ || this.accept('+=')
+ || this.accept('-=')
+ || this.accept('*=')
+ || this.accept('/=')
+ || this.accept('%=')) {
+ this.state.push('assignment');
+ var expr = this.list();
+ // @block support
+ if (expr.isEmpty) this.assignAtblock(expr);
+ node = new nodes.Ident(name, expr);
+ this.state.pop();
+
+ switch (op.type) {
+ case '?=':
+ var defined = new nodes.BinOp('is defined', node)
+ , lookup = new nodes.Expression;
+ lookup.push(new nodes.Ident(name));
+ node = new nodes.Ternary(defined, lookup, node);
+ break;
+ case '+=':
+ case '-=':
+ case '*=':
+ case '/=':
+ case '%=':
+ node.val = new nodes.BinOp(op.type[0], new nodes.Ident(name), expr);
+ break;
+ }
+ }
+
+ return node;
+ },
+
+ /**
+ * definition
+ * | call
+ */
+
+ function: function() {
+ var parens = 1
+ , i = 2
+ , tok;
+
+ // Lookahead and determine if we are dealing
+ // with a function call or definition. Here
+ // we pair parens to prevent false negatives
+ out:
+ while (tok = this.lookahead(i++)) {
+ switch (tok.type) {
+ case 'function':
+ case '(':
+ ++parens;
+ break;
+ case ')':
+ if (!--parens) break out;
+ break;
+ case 'eos':
+ this.error('failed to find closing paren ")"');
+ }
+ }
+
+ // Definition or call
+ switch (this.currentState()) {
+ case 'expression':
+ return this.functionCall();
+ default:
+ return this.looksLikeFunctionDefinition(i)
+ ? this.functionDefinition()
+ : this.expression();
+ }
+ },
+
+ /**
+ * url '(' (expression | urlchars)+ ')'
+ */
+
+ url: function() {
+ this.expect('function');
+ this.state.push('function arguments');
+ var args = this.args();
+ this.expect(')');
+ this.state.pop();
+ return new nodes.Call('url', args);
+ },
+
+ /**
+ * '+'? ident '(' expression ')' block?
+ */
+
+ functionCall: function() {
+ var withBlock = this.accept('+');
+ if ('url' == this.peek().val.name) return this.url();
+ var name = this.expect('function').val.name;
+ this.state.push('function arguments');
+ this.parens++;
+ var args = this.args();
+ this.expect(')');
+ this.parens--;
+ this.state.pop();
+ var call = new nodes.Call(name, args);
+ if (withBlock) {
+ this.state.push('function');
+ call.block = this.block(call);
+ this.state.pop();
+ }
+ return call;
+ },
+
+ /**
+ * ident '(' params ')' block
+ */
+
+ functionDefinition: function() {
+ var name = this.expect('function').val.name;
+
+ // params
+ this.state.push('function params');
+ this.skipWhitespace();
+ var params = this.params();
+ this.skipWhitespace();
+ this.expect(')');
+ this.state.pop();
+
+ // Body
+ this.state.push('function');
+ var fn = new nodes.Function(name, params);
+ fn.block = this.block(fn);
+ this.state.pop();
+ return new nodes.Ident(name, fn);
+ },
+
+ /**
+ * ident
+ * | ident '...'
+ * | ident '=' expression
+ * | ident ',' ident
+ */
+
+ params: function() {
+ var tok
+ , node
+ , params = new nodes.Params;
+ while (tok = this.accept('ident')) {
+ this.accept('space');
+ params.push(node = tok.val);
+ if (this.accept('...')) {
+ node.rest = true;
+ } else if (this.accept('=')) {
+ node.val = this.expression();
+ }
+ this.skipWhitespace();
+ this.accept(',');
+ this.skipWhitespace();
+ }
+ return params;
+ },
+
+ /**
+ * (ident ':')? expression (',' (ident ':')? expression)*
+ */
+
+ args: function() {
+ var args = new nodes.Arguments
+ , keyword;
+
+ do {
+ // keyword
+ if ('ident' == this.peek().type && ':' == this.lookahead(2).type) {
+ keyword = this.next().val.string;
+ this.expect(':');
+ args.map[keyword] = this.expression();
+ // arg
+ } else {
+ args.push(this.expression());
+ }
+ } while (this.accept(','));
+
+ return args;
+ },
+
+ /**
+ * expression (',' expression)*
+ */
+
+ list: function() {
+ var node = this.expression();
+
+ while (this.accept(',')) {
+ if (node.isList) {
+ list.push(this.expression());
+ } else {
+ var list = new nodes.Expression(true);
+ list.push(node);
+ list.push(this.expression());
+ node = list;
+ }
+ }
+ return node;
+ },
+
+ /**
+ * negation+
+ */
+
+ expression: function() {
+ var node
+ , expr = new nodes.Expression;
+ this.state.push('expression');
+ while (node = this.negation()) {
+ if (!node) this.error('unexpected token {peek} in expression');
+ expr.push(node);
+ }
+ this.state.pop();
+ if (expr.nodes.length) {
+ expr.lineno = expr.nodes[0].lineno;
+ expr.column = expr.nodes[0].column;
+ }
+ return expr;
+ },
+
+ /**
+ * 'not' ternary
+ * | ternary
+ */
+
+ negation: function() {
+ if (this.accept('not')) {
+ return new nodes.UnaryOp('!', this.negation());
+ }
+ return this.ternary();
+ },
+
+ /**
+ * logical ('?' expression ':' expression)?
+ */
+
+ ternary: function() {
+ var node = this.logical();
+ if (this.accept('?')) {
+ var trueExpr = this.expression();
+ this.expect(':');
+ var falseExpr = this.expression();
+ node = new nodes.Ternary(node, trueExpr, falseExpr);
+ }
+ return node;
+ },
+
+ /**
+ * typecheck (('&&' | '||') typecheck)*
+ */
+
+ logical: function() {
+ var op
+ , node = this.typecheck();
+ while (op = this.accept('&&') || this.accept('||')) {
+ node = new nodes.BinOp(op.type, node, this.typecheck());
+ }
+ return node;
+ },
+
+ /**
+ * equality ('is a' equality)*
+ */
+
+ typecheck: function() {
+ var op
+ , node = this.equality();
+ while (op = this.accept('is a')) {
+ this.operand = true;
+ if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+ node = new nodes.BinOp(op.type, node, this.equality());
+ this.operand = false;
+ }
+ return node;
+ },
+
+ /**
+ * in (('==' | '!=') in)*
+ */
+
+ equality: function() {
+ var op
+ , node = this.in();
+ while (op = this.accept('==') || this.accept('!=')) {
+ this.operand = true;
+ if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+ node = new nodes.BinOp(op.type, node, this.in());
+ this.operand = false;
+ }
+ return node;
+ },
+
+ /**
+ * relational ('in' relational)*
+ */
+
+ in: function() {
+ var node = this.relational();
+ while (this.accept('in')) {
+ this.operand = true;
+ if (!node) this.error('illegal unary "in", missing left-hand operand');
+ node = new nodes.BinOp('in', node, this.relational());
+ this.operand = false;
+ }
+ return node;
+ },
+
+ /**
+ * range (('>=' | '<=' | '>' | '<') range)*
+ */
+
+ relational: function() {
+ var op
+ , node = this.range();
+ while (op =
+ this.accept('>=')
+ || this.accept('<=')
+ || this.accept('<')
+ || this.accept('>')
+ ) {
+ this.operand = true;
+ if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+ node = new nodes.BinOp(op.type, node, this.range());
+ this.operand = false;
+ }
+ return node;
+ },
+
+ /**
+ * additive (('..' | '...') additive)*
+ */
+
+ range: function() {
+ var op
+ , node = this.additive();
+ if (op = this.accept('...') || this.accept('..')) {
+ this.operand = true;
+ if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+ node = new nodes.BinOp(op.val, node, this.additive());
+ this.operand = false;
+ }
+ return node;
+ },
+
+ /**
+ * multiplicative (('+' | '-') multiplicative)*
+ */
+
+ additive: function() {
+ var op
+ , node = this.multiplicative();
+ while (op = this.accept('+') || this.accept('-')) {
+ this.operand = true;
+ node = new nodes.BinOp(op.type, node, this.multiplicative());
+ this.operand = false;
+ }
+ return node;
+ },
+
+ /**
+ * defined (('**' | '*' | '/' | '%') defined)*
+ */
+
+ multiplicative: function() {
+ var op
+ , node = this.defined();
+ while (op =
+ this.accept('**')
+ || this.accept('*')
+ || this.accept('/')
+ || this.accept('%')) {
+ this.operand = true;
+ if ('/' == op && this.inProperty && !this.parens) {
+ this.stash.push(new Token('literal', new nodes.Literal('/')));
+ this.operand = false;
+ return node;
+ } else {
+ if (!node) this.error('illegal unary "' + op + '", missing left-hand operand');
+ node = new nodes.BinOp(op.type, node, this.defined());
+ this.operand = false;
+ }
+ }
+ return node;
+ },
+
+ /**
+ * unary 'is defined'
+ * | unary
+ */
+
+ defined: function() {
+ var node = this.unary();
+ if (this.accept('is defined')) {
+ if (!node) this.error('illegal unary "is defined", missing left-hand operand');
+ node = new nodes.BinOp('is defined', node);
+ }
+ return node;
+ },
+
+ /**
+ * ('!' | '~' | '+' | '-') unary
+ * | subscript
+ */
+
+ unary: function() {
+ var op
+ , node;
+ if (op =
+ this.accept('!')
+ || this.accept('~')
+ || this.accept('+')
+ || this.accept('-')) {
+ this.operand = true;
+ node = this.unary();
+ if (!node) this.error('illegal unary "' + op + '"');
+ node = new nodes.UnaryOp(op.type, node);
+ this.operand = false;
+ return node;
+ }
+ return this.subscript();
+ },
+
+ /**
+ * member ('[' expression ']')+ '='?
+ * | member
+ */
+
+ subscript: function() {
+ var node = this.member()
+ , id;
+ while (this.accept('[')) {
+ node = new nodes.BinOp('[]', node, this.expression());
+ this.expect(']');
+ }
+ // TODO: TernaryOp :)
+ if (this.accept('=')) {
+ node.op += '=';
+ node.val = this.list();
+ // @block support
+ if (node.val.isEmpty) this.assignAtblock(node.val);
+ }
+ return node;
+ },
+
+ /**
+ * primary ('.' id)+ '='?
+ * | primary
+ */
+
+ member: function() {
+ var node = this.primary();
+ if (node) {
+ while (this.accept('.')) {
+ var id = new nodes.Ident(this.expect('ident').val.string);
+ node = new nodes.Member(node, id);
+ }
+ this.skipSpaces();
+ if (this.accept('=')) {
+ node.val = this.list();
+ // @block support
+ if (node.val.isEmpty) this.assignAtblock(node.val);
+ }
+ }
+ return node;
+ },
+
+ /**
+ * '{' '}'
+ * | '{' pair (ws pair)* '}'
+ */
+
+ object: function(){
+ var obj = new nodes.Object
+ , id, val, comma;
+ this.expect('{');
+ this.skipWhitespace();
+
+ while (!this.accept('}')) {
+ if (this.accept('comment')
+ || this.accept('newline')) continue;
+
+ if (!comma) this.accept(',');
+ id = this.accept('ident') || this.accept('string');
+ if (!id) this.error('expected "ident" or "string", got {peek}');
+ id = id.val.hash;
+ this.skipSpacesAndComments();
+ this.expect(':');
+ val = this.expression();
+ obj.set(id, val);
+ comma = this.accept(',');
+ this.skipWhitespace();
+ }
+
+ return obj;
+ },
+
+ /**
+ * unit
+ * | null
+ * | color
+ * | string
+ * | ident
+ * | boolean
+ * | literal
+ * | object
+ * | atblock
+ * | atrule
+ * | '(' expression ')' '%'?
+ */
+
+ primary: function() {
+ var tok;
+ this.skipSpaces();
+
+ // Parenthesis
+ if (this.accept('(')) {
+ ++this.parens;
+ var expr = this.expression()
+ , paren = this.expect(')');
+ --this.parens;
+ if (this.accept('%')) expr.push(new nodes.Ident('%'));
+ tok = this.peek();
+ // (1 + 2)px, (1 + 2)em, etc.
+ if (!paren.space
+ && 'ident' == tok.type
+ && ~units.indexOf(tok.val.string)) {
+ expr.push(new nodes.Ident(tok.val.string));
+ this.next();
+ }
+ return expr;
+ }
+
+ tok = this.peek();
+
+ // Primitive
+ switch (tok.type) {
+ case 'null':
+ case 'unit':
+ case 'color':
+ case 'string':
+ case 'literal':
+ case 'boolean':
+ case 'comment':
+ return this.next().val;
+ case !this.cond && '{':
+ return this.object();
+ case 'atblock':
+ return this.atblock();
+ // property lookup
+ case 'atrule':
+ var id = new nodes.Ident(this.next().val);
+ id.property = true;
+ return id;
+ case 'ident':
+ return this.ident();
+ case 'function':
+ return tok.anonymous
+ ? this.functionDefinition()
+ : this.functionCall();
+ }
+ }
+};
diff --git a/node_modules/stylus/lib/renderer.js b/node_modules/stylus/lib/renderer.js
new file mode 100644
index 00000000..46f48584
--- /dev/null
+++ b/node_modules/stylus/lib/renderer.js
@@ -0,0 +1,246 @@
+
+/*!
+ * Stylus - Renderer
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Parser = require('./parser')
+ , EventEmitter = require('events').EventEmitter
+ , Evaluator = require('./visitor/evaluator')
+ , Normalizer = require('./visitor/normalizer')
+ , events = new EventEmitter
+ , utils = require('./utils')
+ , nodes = require('./nodes')
+ , join = require('path').join;
+
+/**
+ * Expose `Renderer`.
+ */
+
+module.exports = Renderer;
+
+/**
+ * Initialize a new `Renderer` with the given `str` and `options`.
+ *
+ * @param {String} str
+ * @param {Object} options
+ * @api public
+ */
+
+function Renderer(str, options) {
+ options = options || {};
+ options.globals = options.globals || {};
+ options.functions = options.functions || {};
+ options.use = options.use || [];
+ options.use = Array.isArray(options.use) ? options.use : [options.use];
+ options.imports = [join(__dirname, 'functions')];
+ options.paths = options.paths || [];
+ options.filename = options.filename || 'stylus';
+ options.Evaluator = options.Evaluator || Evaluator;
+ this.options = options;
+ this.str = str;
+ this.events = events;
+};
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+
+Renderer.prototype.__proto__ = EventEmitter.prototype;
+
+/**
+ * Expose events explicitly.
+ */
+
+module.exports.events = events;
+
+/**
+ * Parse and evaluate AST, then callback `fn(err, css, js)`.
+ *
+ * @param {Function} fn
+ * @api public
+ */
+
+Renderer.prototype.render = function(fn){
+ var parser = this.parser = new Parser(this.str, this.options);
+
+ // use plugin(s)
+ for (var i = 0, len = this.options.use.length; i < len; i++) {
+ this.use(this.options.use[i]);
+ }
+
+ try {
+ nodes.filename = this.options.filename;
+ // parse
+ var ast = parser.parse();
+
+ // evaluate
+ this.evaluator = new this.options.Evaluator(ast, this.options);
+ this.nodes = nodes;
+ this.evaluator.renderer = this;
+ ast = this.evaluator.evaluate();
+
+ // normalize
+ var normalizer = new Normalizer(ast, this.options);
+ ast = normalizer.normalize();
+
+ // compile
+ var compiler = this.options.sourcemap
+ ? new (require('./visitor/sourcemapper'))(ast, this.options)
+ : new (require('./visitor/compiler'))(ast, this.options)
+ , css = compiler.compile();
+
+ // expose sourcemap
+ if (this.options.sourcemap) this.sourcemap = compiler.map.toJSON();
+ } catch (err) {
+ var options = {};
+ options.input = err.input || this.str;
+ options.filename = err.filename || this.options.filename;
+ options.lineno = err.lineno || parser.lexer.lineno;
+ options.column = err.column || parser.lexer.column;
+ if (!fn) throw utils.formatException(err, options);
+ return fn(utils.formatException(err, options));
+ }
+
+ // fire `end` event
+ var listeners = this.listeners('end');
+ if (fn) listeners.push(fn);
+ for (var i = 0, len = listeners.length; i < len; i++) {
+ var ret = listeners[i](null, css);
+ if (ret) css = ret;
+ }
+ if (!fn) return css;
+};
+
+/**
+ * Get dependencies of the compiled file.
+ *
+ * @param {String} [filename]
+ * @return {Array}
+ * @api public
+ */
+
+Renderer.prototype.deps = function(filename){
+ var opts = utils.merge({ cache: false }, this.options);
+ if (filename) opts.filename = filename;
+
+ var DepsResolver = require('./visitor/deps-resolver')
+ , parser = new Parser(this.str, opts);
+
+ try {
+ nodes.filename = opts.filename;
+ // parse
+ var ast = parser.parse()
+ , resolver = new DepsResolver(ast, opts);
+
+ // resolve dependencies
+ return resolver.resolve();
+ } catch (err) {
+ var options = {};
+ options.input = err.input || this.str;
+ options.filename = err.filename || opts.filename;
+ options.lineno = err.lineno || parser.lexer.lineno;
+ options.column = err.column || parser.lexer.column;
+ throw utils.formatException(err, options);
+ }
+};
+
+/**
+ * Set option `key` to `val`.
+ *
+ * @param {String} key
+ * @param {Mixed} val
+ * @return {Renderer} for chaining
+ * @api public
+ */
+
+Renderer.prototype.set = function(key, val){
+ this.options[key] = val;
+ return this;
+};
+
+/**
+ * Get option `key`.
+ *
+ * @param {String} key
+ * @return {Mixed} val
+ * @api public
+ */
+
+Renderer.prototype.get = function(key){
+ return this.options[key];
+};
+
+/**
+ * Include the given `path` to the lookup paths array.
+ *
+ * @param {String} path
+ * @return {Renderer} for chaining
+ * @api public
+ */
+
+Renderer.prototype.include = function(path){
+ this.options.paths.push(path);
+ return this;
+};
+
+/**
+ * Use the given `fn`.
+ *
+ * This allows for plugins to alter the renderer in
+ * any way they wish, exposing paths etc.
+ *
+ * @param {Function}
+ * @return {Renderer} for chaining
+ * @api public
+ */
+
+Renderer.prototype.use = function(fn){
+ fn.call(this, this);
+ return this;
+};
+
+/**
+ * Define function or global var with the given `name`. Optionally
+ * the function may accept full expressions, by setting `raw`
+ * to `true`.
+ *
+ * @param {String} name
+ * @param {Function|Node} fn
+ * @return {Renderer} for chaining
+ * @api public
+ */
+
+Renderer.prototype.define = function(name, fn, raw){
+ fn = utils.coerce(fn, raw);
+
+ if (fn.nodeName) {
+ this.options.globals[name] = fn;
+ return this;
+ }
+
+ // function
+ this.options.functions[name] = fn;
+ if (undefined != raw) fn.raw = raw;
+ return this;
+};
+
+/**
+ * Import the given `file`.
+ *
+ * @param {String} file
+ * @return {Renderer} for chaining
+ * @api public
+ */
+
+Renderer.prototype.import = function(file){
+ this.options.imports.push(file);
+ return this;
+};
+
+
diff --git a/node_modules/stylus/lib/selector-parser.js b/node_modules/stylus/lib/selector-parser.js
new file mode 100644
index 00000000..f5a64ff9
--- /dev/null
+++ b/node_modules/stylus/lib/selector-parser.js
@@ -0,0 +1,258 @@
+/*!
+ * Stylus - Selector Parser
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+var COMBINATORS = ['>', '+', '~'];
+
+/**
+ * Initialize a new `SelectorParser`
+ * with the given `str` and selectors `stack`.
+ *
+ * @param {String} str
+ * @param {Array} stack
+ * @param {Array} parts
+ * @api private
+ */
+
+var SelectorParser = module.exports = function SelectorParser(str, stack, parts) {
+ this.str = str;
+ this.stack = stack || [];
+ this.parts = parts || [];
+ this.pos = 0;
+ this.level = 2;
+ this.nested = true;
+ this.ignore = false;
+};
+
+/**
+ * Consume the given `len` and move current position.
+ *
+ * @param {Number} len
+ * @api private
+ */
+
+SelectorParser.prototype.skip = function(len) {
+ this.str = this.str.substr(len);
+ this.pos += len;
+};
+
+/**
+ * Consume spaces.
+ */
+
+SelectorParser.prototype.skipSpaces = function() {
+ while (' ' == this.str[0]) this.skip(1);
+};
+
+/**
+ * Fetch next token.
+ *
+ * @return {String}
+ * @api private
+ */
+
+SelectorParser.prototype.advance = function() {
+ return this.root()
+ || this.relative()
+ || this.initial()
+ || this.escaped()
+ || this.parent()
+ || this.partial()
+ || this.char();
+};
+
+/**
+ * '/'
+ */
+
+SelectorParser.prototype.root = function() {
+ if (!this.pos && '/' == this.str[0]
+ && 'deep' != this.str.slice(1, 5)) {
+ this.nested = false;
+ this.skip(1);
+ }
+};
+
+/**
+ * '../'
+ */
+
+SelectorParser.prototype.relative = function(multi) {
+ if ((!this.pos || multi) && '../' == this.str.slice(0, 3)) {
+ this.nested = false;
+ this.skip(3);
+ while (this.relative(true)) this.level++;
+ if (!this.raw) {
+ var ret = this.stack[this.stack.length - this.level];
+ if (ret) {
+ return ret;
+ } else {
+ this.ignore = true;
+ }
+ }
+ }
+};
+
+/**
+ * '~/'
+ */
+
+SelectorParser.prototype.initial = function() {
+ if (!this.pos && '~' == this.str[0] && '/' == this.str[1]) {
+ this.nested = false;
+ this.skip(2);
+ return this.stack[0];
+ }
+};
+
+/**
+ * '\' ('&' | '^')
+ */
+
+SelectorParser.prototype.escaped = function() {
+ if ('\\' == this.str[0]) {
+ var char = this.str[1];
+ if ('&' == char || '^' == char) {
+ this.skip(2);
+ return char;
+ }
+ }
+};
+
+/**
+ * '&'
+ */
+
+SelectorParser.prototype.parent = function() {
+ if ('&' == this.str[0]) {
+ this.nested = false;
+
+ if (!this.pos && (!this.stack.length || this.raw)) {
+ var i = 0;
+ while (' ' == this.str[++i]) ;
+ if (~COMBINATORS.indexOf(this.str[i])) {
+ this.skip(i + 1);
+ return;
+ }
+ }
+
+ this.skip(1);
+ if (!this.raw)
+ return this.stack[this.stack.length - 1];
+ }
+};
+
+/**
+ * '^[' range ']'
+ */
+
+SelectorParser.prototype.partial = function() {
+ if ('^' == this.str[0] && '[' == this.str[1]) {
+ this.skip(2);
+ this.skipSpaces();
+ var ret = this.range();
+ this.skipSpaces();
+ if (']' != this.str[0]) return '^[';
+ this.nested = false;
+ this.skip(1);
+ if (ret) {
+ return ret;
+ } else {
+ this.ignore = true;
+ }
+ }
+};
+
+/**
+ * '-'? 0-9+
+ */
+
+SelectorParser.prototype.number = function() {
+ var i = 0, ret = '';
+ if ('-' == this.str[i])
+ ret += this.str[i++];
+
+ while (this.str.charCodeAt(i) >= 48
+ && this.str.charCodeAt(i) <= 57)
+ ret += this.str[i++];
+
+ if (ret) {
+ this.skip(i);
+ return Number(ret);
+ }
+};
+
+/**
+ * number ('..' number)?
+ */
+
+SelectorParser.prototype.range = function() {
+ var start = this.number()
+ , ret;
+
+ if ('..' == this.str.slice(0, 2)) {
+ this.skip(2);
+ var end = this.number()
+ , len = this.parts.length;
+
+ if (start < 0) start = len + start - 1;
+ if (end < 0) end = len + end - 1;
+
+ if (start > end) {
+ var tmp = start;
+ start = end;
+ end = tmp;
+ }
+
+ if (end < len - 1) {
+ ret = this.parts.slice(start, end + 1).map(function(part) {
+ var selector = new SelectorParser(part, this.stack, this.parts);
+ selector.raw = true;
+ return selector.parse();
+ }, this).map(function(selector) {
+ return (selector.nested ? ' ' : '') + selector.val;
+ }).join('').trim();
+ }
+ } else {
+ ret = this.stack[
+ start < 0 ? this.stack.length + start - 1 : start
+ ];
+ }
+
+ if (ret) {
+ return ret;
+ } else {
+ this.ignore = true;
+ }
+};
+
+/**
+ * .+
+ */
+
+SelectorParser.prototype.char = function() {
+ var char = this.str[0];
+ this.skip(1);
+ return char;
+};
+
+/**
+ * Parses the selector.
+ *
+ * @return {Object}
+ * @api private
+ */
+
+SelectorParser.prototype.parse = function() {
+ var val = '';
+ while (this.str.length) {
+ val += this.advance() || '';
+ if (this.ignore) {
+ val = '';
+ break;
+ }
+ }
+ return { val: val.trimRight(), nested: this.nested };
+};
diff --git a/node_modules/stylus/lib/stack/frame.js b/node_modules/stylus/lib/stack/frame.js
new file mode 100644
index 00000000..ce3117d5
--- /dev/null
+++ b/node_modules/stylus/lib/stack/frame.js
@@ -0,0 +1,65 @@
+
+/*!
+ * Stylus - stack - Frame
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Scope = require('./scope');
+
+/**
+ * Initialize a new `Frame` with the given `block`.
+ *
+ * @param {Block} block
+ * @api private
+ */
+
+var Frame = module.exports = function Frame(block) {
+ this._scope = false === block.scope
+ ? null
+ : new Scope;
+ this.block = block;
+};
+
+/**
+ * Return this frame's scope or the parent scope
+ * for scope-less blocks.
+ *
+ * @return {Scope}
+ * @api public
+ */
+
+Frame.prototype.__defineGetter__('scope', function(){
+ return this._scope || this.parent.scope;
+});
+
+/**
+ * Lookup the given local variable `name`.
+ *
+ * @param {String} name
+ * @return {Node}
+ * @api private
+ */
+
+Frame.prototype.lookup = function(name){
+ return this.scope.lookup(name)
+};
+
+/**
+ * Custom inspect.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Frame.prototype.inspect = function(){
+ return '[Frame '
+ + (false === this.block.scope
+ ? 'scope-less'
+ : this.scope.inspect())
+ + ']';
+};
diff --git a/node_modules/stylus/lib/stack/index.js b/node_modules/stylus/lib/stack/index.js
new file mode 100644
index 00000000..9e288c62
--- /dev/null
+++ b/node_modules/stylus/lib/stack/index.js
@@ -0,0 +1,135 @@
+
+/*!
+ * Stylus - Stack
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Initialize a new `Stack`.
+ *
+ * @api private
+ */
+
+var Stack = module.exports = function Stack() {
+ Array.apply(this, arguments);
+};
+
+/**
+ * Inherit from `Array.prototype`.
+ */
+
+Stack.prototype.__proto__ = Array.prototype;
+
+/**
+ * Push the given `frame`.
+ *
+ * @param {Frame} frame
+ * @api public
+ */
+
+Stack.prototype.push = function(frame){
+ frame.stack = this;
+ frame.parent = this.currentFrame;
+ return [].push.apply(this, arguments);
+};
+
+/**
+ * Return the current stack `Frame`.
+ *
+ * @return {Frame}
+ * @api private
+ */
+
+Stack.prototype.__defineGetter__('currentFrame', function(){
+ return this[this.length - 1];
+});
+
+/**
+ * Lookup stack frame for the given `block`.
+ *
+ * @param {Block} block
+ * @return {Frame}
+ * @api private
+ */
+
+Stack.prototype.getBlockFrame = function(block){
+ for (var i = 0; i < this.length; ++i) {
+ if (block == this[i].block) {
+ return this[i];
+ }
+ }
+};
+
+/**
+ * Lookup the given local variable `name`, relative
+ * to the lexical scope of the current frame's `Block`.
+ *
+ * When the result of a lookup is an identifier
+ * a recursive lookup is performed, defaulting to
+ * returning the identifier itself.
+ *
+ * @param {String} name
+ * @return {Node}
+ * @api private
+ */
+
+Stack.prototype.lookup = function(name){
+ var block = this.currentFrame.block
+ , val
+ , ret;
+
+ do {
+ var frame = this.getBlockFrame(block);
+ if (frame && (val = frame.lookup(name))) {
+ return val;
+ }
+ } while (block = block.parent);
+};
+
+/**
+ * Custom inspect.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Stack.prototype.inspect = function(){
+ return this.reverse().map(function(frame){
+ return frame.inspect();
+ }).join('\n');
+};
+
+/**
+ * Return stack string formatted as:
+ *
+ * at <context> (<filename>:<lineno>:<column>)
+ *
+ * @return {String}
+ * @api private
+ */
+
+Stack.prototype.toString = function(){
+ var block
+ , node
+ , buf = []
+ , location
+ , len = this.length;
+
+ while (len--) {
+ block = this[len].block;
+ if (node = block.node) {
+ location = '(' + node.filename + ':' + (node.lineno + 1) + ':' + node.column + ')';
+ switch (node.nodeName) {
+ case 'function':
+ buf.push(' at ' + node.name + '() ' + location);
+ break;
+ case 'group':
+ buf.push(' at "' + node.nodes[0].val + '" ' + location);
+ break;
+ }
+ }
+ }
+
+ return buf.join('\n');
+};
diff --git a/node_modules/stylus/lib/stack/scope.js b/node_modules/stylus/lib/stack/scope.js
new file mode 100644
index 00000000..aeda4cf0
--- /dev/null
+++ b/node_modules/stylus/lib/stack/scope.js
@@ -0,0 +1,53 @@
+
+/*!
+ * Stylus - stack - Scope
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Initialize a new `Scope`.
+ *
+ * @api private
+ */
+
+var Scope = module.exports = function Scope() {
+ this.locals = {};
+};
+
+/**
+ * Add `ident` node to the current scope.
+ *
+ * @param {Ident} ident
+ * @api private
+ */
+
+Scope.prototype.add = function(ident){
+ this.locals[ident.name] = ident.val;
+};
+
+/**
+ * Lookup the given local variable `name`.
+ *
+ * @param {String} name
+ * @return {Node}
+ * @api private
+ */
+
+Scope.prototype.lookup = function(name){
+ return this.locals[name];
+};
+
+/**
+ * Custom inspect.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Scope.prototype.inspect = function(){
+ var keys = Object.keys(this.locals).map(function(key){ return '@' + key; });
+ return '[Scope'
+ + (keys.length ? ' ' + keys.join(', ') : '')
+ + ']';
+};
diff --git a/node_modules/stylus/lib/stylus.js b/node_modules/stylus/lib/stylus.js
new file mode 100644
index 00000000..6c064a2d
--- /dev/null
+++ b/node_modules/stylus/lib/stylus.js
@@ -0,0 +1,103 @@
+/*!
+ * Stylus
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Renderer = require('./renderer')
+ , nodes = require('./nodes')
+ , utils = require('./utils');
+
+/**
+ * Export render as the module.
+ */
+
+exports = module.exports = render;
+
+/**
+ * Library version.
+ */
+
+exports.version = require('../package').version;
+
+/**
+ * Expose nodes.
+ */
+
+exports.nodes = nodes;
+
+/**
+ * Expose BIFs.
+ */
+
+exports.functions = require('./functions');
+
+/**
+ * Expose utils.
+ */
+
+exports.utils = require('./utils');
+
+/**
+ * Expose middleware.
+ */
+
+exports.middleware = require('./middleware');
+
+/**
+ * Expose constructors.
+ */
+
+exports.Visitor = require('./visitor');
+exports.Parser = require('./parser');
+exports.Evaluator = require('./visitor/evaluator');
+exports.Normalizer = require('./visitor/normalizer');
+exports.Compiler = require('./visitor/compiler');
+
+/**
+ * Convert the given `css` to `stylus` source.
+ *
+ * @param {String} css
+ * @return {String}
+ * @api public
+ */
+
+exports.convertCSS = require('./convert/css');
+
+/**
+ * Render the given `str` with `options` and callback `fn(err, css)`.
+ *
+ * @param {String} str
+ * @param {Object|Function} options
+ * @param {Function} fn
+ * @api public
+ */
+
+exports.render = function(str, options, fn){
+ if ('function' == typeof options) fn = options, options = {};
+ return new Renderer(str, options).render(fn);
+};
+
+/**
+ * Return a new `Renderer` for the given `str` and `options`.
+ *
+ * @param {String} str
+ * @param {Object} options
+ * @return {Renderer}
+ * @api public
+ */
+
+function render(str, options) {
+ return new Renderer(str, options);
+}
+
+/**
+ * Expose optional functions.
+ */
+
+exports.url = require('./functions/url');
+exports.resolver = require('./functions/resolver');
diff --git a/node_modules/stylus/lib/token.js b/node_modules/stylus/lib/token.js
new file mode 100644
index 00000000..5b8e49bc
--- /dev/null
+++ b/node_modules/stylus/lib/token.js
@@ -0,0 +1,53 @@
+
+/*!
+ * Stylus - Token
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var inspect = require('util').inspect;
+
+/**
+ * Initialize a new `Token` with the given `type` and `val`.
+ *
+ * @param {String} type
+ * @param {Mixed} val
+ * @api private
+ */
+
+var Token = exports = module.exports = function Token(type, val) {
+ this.type = type;
+ this.val = val;
+};
+
+/**
+ * Custom inspect.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Token.prototype.inspect = function(){
+ var val = ' ' + inspect(this.val);
+ return '[Token:' + this.lineno + ':' + this.column + ' '
+ + '\x1b[32m' + this.type + '\x1b[0m'
+ + '\x1b[33m' + (this.val ? val : '') + '\x1b[0m'
+ + ']';
+};
+
+/**
+ * Return type or val.
+ *
+ * @return {String}
+ * @api public
+ */
+
+Token.prototype.toString = function(){
+ return (undefined === this.val
+ ? this.type
+ : this.val).toString();
+};
diff --git a/node_modules/stylus/lib/units.js b/node_modules/stylus/lib/units.js
new file mode 100644
index 00000000..b26bb984
--- /dev/null
+++ b/node_modules/stylus/lib/units.js
@@ -0,0 +1,20 @@
+
+/*!
+ * Stylus - units
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+// units found in http://www.w3.org/TR/css3-values
+
+module.exports = [
+ 'em', 'ex', 'ch', 'rem' // relative lengths
+ , 'vw', 'vh', 'vmin', 'vmax' // relative viewport-percentage lengths
+ , 'cm', 'mm', 'in', 'pt', 'pc', 'px' // absolute lengths
+ , 'deg', 'grad', 'rad', 'turn' // angles
+ , 's', 'ms' // times
+ , 'Hz', 'kHz' // frequencies
+ , 'dpi', 'dpcm', 'dppx', 'x' // resolutions
+ , '%' // percentage type
+ , 'fr' // grid-layout (http://www.w3.org/TR/css3-grid-layout/)
+];
diff --git a/node_modules/stylus/lib/utils.js b/node_modules/stylus/lib/utils.js
new file mode 100644
index 00000000..e53910ac
--- /dev/null
+++ b/node_modules/stylus/lib/utils.js
@@ -0,0 +1,526 @@
+
+/*!
+ * Stylus - utils
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var nodes = require('./nodes')
+ , basename = require('path').basename
+ , relative = require('path').relative
+ , join = require('path').join
+ , isAbsolute = require('path').isAbsolute
+ , glob = require('glob')
+ , fs = require('fs');
+
+/**
+ * Check if `path` looks absolute.
+ *
+ * @param {String} path
+ * @return {Boolean}
+ * @api private
+ */
+
+exports.absolute = isAbsolute || function(path){
+ // On Windows the path could start with a drive letter, i.e. a:\\ or two leading backslashes.
+ // Also on Windows, the path may have been normalized to forward slashes, so check for this too.
+ return path.substr(0, 2) == '\\\\' || '/' === path.charAt(0) || /^[a-z]:[\\\/]/i.test(path);
+};
+
+/**
+ * Attempt to lookup `path` within `paths` from tail to head.
+ * Optionally a path to `ignore` may be passed.
+ *
+ * @param {String} path
+ * @param {String} paths
+ * @param {String} ignore
+ * @return {String}
+ * @api private
+ */
+
+exports.lookup = function(path, paths, ignore){
+ var lookup
+ , i = paths.length;
+
+ // Absolute
+ if (exports.absolute(path)) {
+ try {
+ fs.statSync(path);
+ return path;
+ } catch (err) {
+ // Ignore, continue on
+ // to trying relative lookup.
+ // Needed for url(/images/foo.png)
+ // for example
+ }
+ }
+
+ // Relative
+ while (i--) {
+ try {
+ lookup = join(paths[i], path);
+ if (ignore == lookup) continue;
+ fs.statSync(lookup);
+ return lookup;
+ } catch (err) {
+ // Ignore
+ }
+ }
+};
+
+/**
+ * Like `utils.lookup` but uses `glob` to find files.
+ *
+ * @param {String} path
+ * @param {String} paths
+ * @param {String} ignore
+ * @return {Array}
+ * @api private
+ */
+exports.find = function(path, paths, ignore) {
+ var lookup
+ , found
+ , i = paths.length;
+
+ // Absolute
+ if (exports.absolute(path)) {
+ if ((found = glob.sync(path)).length) {
+ return found;
+ }
+ }
+
+ // Relative
+ while (i--) {
+ lookup = join(paths[i], path);
+ if (ignore == lookup) continue;
+ if ((found = glob.sync(lookup)).length) {
+ return found;
+ }
+ }
+};
+
+/**
+ * Lookup index file inside dir with given `name`.
+ *
+ * @param {String} name
+ * @return {Array}
+ * @api private
+ */
+
+exports.lookupIndex = function(name, paths, filename){
+ // foo/index.styl
+ var found = exports.find(join(name, 'index.styl'), paths, filename);
+ if (!found) {
+ // foo/foo.styl
+ found = exports.find(join(name, basename(name).replace(/\.styl/i, '') + '.styl'), paths, filename);
+ }
+ if (!found && !~name.indexOf('node_modules')) {
+ // node_modules/foo/.. or node_modules/foo.styl/..
+ found = lookupPackage(join('node_modules', name));
+ }
+ return found;
+
+ function lookupPackage(dir) {
+ var pkg = exports.lookup(join(dir, 'package.json'), paths, filename);
+ if (!pkg) {
+ return /\.styl$/i.test(dir) ? exports.lookupIndex(dir, paths, filename) : lookupPackage(dir + '.styl');
+ }
+ var main = require(relative(__dirname, pkg)).main;
+ if (main) {
+ found = exports.find(join(dir, main), paths, filename);
+ } else {
+ found = exports.lookupIndex(dir, paths, filename);
+ }
+ return found;
+ }
+};
+
+/**
+ * Format the given `err` with the given `options`.
+ *
+ * Options:
+ *
+ * - `filename` context filename
+ * - `context` context line count [8]
+ * - `lineno` context line number
+ * - `column` context column number
+ * - `input` input string
+ *
+ * @param {Error} err
+ * @param {Object} options
+ * @return {Error}
+ * @api private
+ */
+
+exports.formatException = function(err, options){
+ var lineno = options.lineno
+ , column = options.column
+ , filename = options.filename
+ , str = options.input
+ , context = options.context || 8
+ , context = context / 2
+ , lines = ('\n' + str).split('\n')
+ , start = Math.max(lineno - context, 1)
+ , end = Math.min(lines.length, lineno + context)
+ , pad = end.toString().length;
+
+ var context = lines.slice(start, end).map(function(line, i){
+ var curr = i + start;
+ return ' '
+ + Array(pad - curr.toString().length + 1).join(' ')
+ + curr
+ + '| '
+ + line
+ + (curr == lineno
+ ? '\n' + Array(curr.toString().length + 5 + column).join('-') + '^'
+ : '');
+ }).join('\n');
+
+ err.message = filename
+ + ':' + lineno
+ + ':' + column
+ + '\n' + context
+ + '\n\n' + err.message + '\n'
+ + (err.stylusStack ? err.stylusStack + '\n' : '');
+
+ // Don't show JS stack trace for Stylus errors
+ if (err.fromStylus) err.stack = 'Error: ' + err.message;
+
+ return err;
+};
+
+/**
+ * Assert that `node` is of the given `type`, or throw.
+ *
+ * @param {Node} node
+ * @param {Function} type
+ * @param {String} param
+ * @api public
+ */
+
+exports.assertType = function(node, type, param){
+ exports.assertPresent(node, param);
+ if (node.nodeName == type) return;
+ var actual = node.nodeName
+ , msg = 'expected '
+ + (param ? '"' + param + '" to be a ' : '')
+ + type + ', but got '
+ + actual + ':' + node;
+ throw new Error('TypeError: ' + msg);
+};
+
+/**
+ * Assert that `node` is a `String` or `Ident`.
+ *
+ * @param {Node} node
+ * @param {String} param
+ * @api public
+ */
+
+exports.assertString = function(node, param){
+ exports.assertPresent(node, param);
+ switch (node.nodeName) {
+ case 'string':
+ case 'ident':
+ case 'literal':
+ return;
+ default:
+ var actual = node.nodeName
+ , msg = 'expected string, ident or literal, but got ' + actual + ':' + node;
+ throw new Error('TypeError: ' + msg);
+ }
+};
+
+/**
+ * Assert that `node` is a `RGBA` or `HSLA`.
+ *
+ * @param {Node} node
+ * @param {String} param
+ * @api public
+ */
+
+exports.assertColor = function(node, param){
+ exports.assertPresent(node, param);
+ switch (node.nodeName) {
+ case 'rgba':
+ case 'hsla':
+ return;
+ default:
+ var actual = node.nodeName
+ , msg = 'expected rgba or hsla, but got ' + actual + ':' + node;
+ throw new Error('TypeError: ' + msg);
+ }
+};
+
+/**
+ * Assert that param `name` is given, aka the `node` is passed.
+ *
+ * @param {Node} node
+ * @param {String} name
+ * @api public
+ */
+
+exports.assertPresent = function(node, name){
+ if (node) return;
+ if (name) throw new Error('"' + name + '" argument required');
+ throw new Error('argument missing');
+};
+
+/**
+ * Unwrap `expr`.
+ *
+ * Takes an expressions with length of 1
+ * such as `((1 2 3))` and unwraps it to `(1 2 3)`.
+ *
+ * @param {Expression} expr
+ * @return {Node}
+ * @api public
+ */
+
+exports.unwrap = function(expr){
+ // explicitly preserve the expression
+ if (expr.preserve) return expr;
+ if ('arguments' != expr.nodeName && 'expression' != expr.nodeName) return expr;
+ if (1 != expr.nodes.length) return expr;
+ if ('arguments' != expr.nodes[0].nodeName && 'expression' != expr.nodes[0].nodeName) return expr;
+ return exports.unwrap(expr.nodes[0]);
+};
+
+/**
+ * Coerce JavaScript values to their Stylus equivalents.
+ *
+ * @param {Mixed} val
+ * @param {Boolean} [raw]
+ * @return {Node}
+ * @api public
+ */
+
+exports.coerce = function(val, raw){
+ switch (typeof val) {
+ case 'function':
+ return val;
+ case 'string':
+ return new nodes.String(val);
+ case 'boolean':
+ return new nodes.Boolean(val);
+ case 'number':
+ return new nodes.Unit(val);
+ default:
+ if (null == val) return nodes.null;
+ if (Array.isArray(val)) return exports.coerceArray(val, raw);
+ if (val.nodeName) return val;
+ return exports.coerceObject(val, raw);
+ }
+};
+
+/**
+ * Coerce a javascript `Array` to a Stylus `Expression`.
+ *
+ * @param {Array} val
+ * @param {Boolean} [raw]
+ * @return {Expression}
+ * @api private
+ */
+
+exports.coerceArray = function(val, raw){
+ var expr = new nodes.Expression;
+ val.forEach(function(val){
+ expr.push(exports.coerce(val, raw));
+ });
+ return expr;
+};
+
+/**
+ * Coerce a javascript object to a Stylus `Expression` or `Object`.
+ *
+ * For example `{ foo: 'bar', bar: 'baz' }` would become
+ * the expression `(foo 'bar') (bar 'baz')`. If `raw` is true
+ * given `obj` would become a Stylus hash object.
+ *
+ * @param {Object} obj
+ * @param {Boolean} [raw]
+ * @return {Expression|Object}
+ * @api public
+ */
+
+exports.coerceObject = function(obj, raw){
+ var node = raw ? new nodes.Object : new nodes.Expression
+ , val;
+
+ for (var key in obj) {
+ val = exports.coerce(obj[key], raw);
+ key = new nodes.Ident(key);
+ if (raw) {
+ node.set(key, val);
+ } else {
+ node.push(exports.coerceArray([key, val]));
+ }
+ }
+
+ return node;
+};
+
+/**
+ * Return param names for `fn`.
+ *
+ * @param {Function} fn
+ * @return {Array}
+ * @api private
+ */
+
+exports.params = function(fn){
+ return fn
+ .toString()
+ .match(/\(([^)]*)\)/)[1].split(/ *, */);
+};
+
+/**
+ * Merge object `b` with `a`.
+ *
+ * @param {Object} a
+ * @param {Object} b
+ * @param {Boolean} [deep]
+ * @return {Object} a
+ * @api private
+ */
+exports.merge = function(a, b, deep) {
+ for (var k in b) {
+ if (deep && a[k]) {
+ var nodeA = exports.unwrap(a[k]).first
+ , nodeB = exports.unwrap(b[k]).first;
+
+ if ('object' == nodeA.nodeName && 'object' == nodeB.nodeName) {
+ a[k].first.vals = exports.merge(nodeA.vals, nodeB.vals, deep);
+ } else {
+ a[k] = b[k];
+ }
+ } else {
+ a[k] = b[k];
+ }
+ }
+ return a;
+};
+
+/**
+ * Returns an array with unique values.
+ *
+ * @param {Array} arr
+ * @return {Array}
+ * @api private
+ */
+
+exports.uniq = function(arr){
+ var obj = {}
+ , ret = [];
+
+ for (var i = 0, len = arr.length; i < len; ++i) {
+ if (arr[i] in obj) continue;
+
+ obj[arr[i]] = true;
+ ret.push(arr[i]);
+ }
+ return ret;
+};
+
+/**
+ * Compile selector strings in `arr` from the bottom-up
+ * to produce the selector combinations. For example
+ * the following Stylus:
+ *
+ * ul
+ * li
+ * p
+ * a
+ * color: red
+ *
+ * Would return:
+ *
+ * [ 'ul li a', 'ul p a' ]
+ *
+ * @param {Array} arr
+ * @param {Boolean} leaveHidden
+ * @return {Array}
+ * @api private
+ */
+
+exports.compileSelectors = function(arr, leaveHidden){
+ var selectors = []
+ , Parser = require('./selector-parser')
+ , indent = (this.indent || '')
+ , buf = [];
+
+ function parse(selector, buf) {
+ var parts = [selector.val]
+ , str = new Parser(parts[0], parents, parts).parse().val
+ , parents = [];
+
+ if (buf.length) {
+ for (var i = 0, len = buf.length; i < len; ++i) {
+ parts.push(buf[i]);
+ parents.push(str);
+ var child = new Parser(buf[i], parents, parts).parse();
+
+ if (child.nested) {
+ str += ' ' + child.val;
+ } else {
+ str = child.val;
+ }
+ }
+ }
+ return str.trim();
+ }
+
+ function compile(arr, i) {
+ if (i) {
+ arr[i].forEach(function(selector){
+ if (!leaveHidden && selector.isPlaceholder) return;
+ if (selector.inherits) {
+ buf.unshift(selector.val);
+ compile(arr, i - 1);
+ buf.shift();
+ } else {
+ selectors.push(indent + parse(selector, buf));
+ }
+ });
+ } else {
+ arr[0].forEach(function(selector){
+ if (!leaveHidden && selector.isPlaceholder) return;
+ var str = parse(selector, buf);
+ if (str) selectors.push(indent + str);
+ });
+ }
+ }
+
+ compile(arr, arr.length - 1);
+
+ // Return the list with unique selectors only
+ return exports.uniq(selectors);
+};
+
+/**
+ * Attempt to parse string.
+ *
+ * @param {String} str
+ * @return {Node}
+ * @api private
+ */
+
+exports.parseString = function(str){
+ var Parser = require('./parser')
+ , parser
+ , ret;
+
+ try {
+ parser = new Parser(str);
+ parser.state.push('expression');
+ ret = new nodes.Expression();
+ ret.nodes = parser.parse().nodes;
+ } catch (e) {
+ ret = new nodes.Literal(str);
+ }
+ return ret;
+};
diff --git a/node_modules/stylus/lib/visitor/compiler.js b/node_modules/stylus/lib/visitor/compiler.js
new file mode 100644
index 00000000..47bb9ae6
--- /dev/null
+++ b/node_modules/stylus/lib/visitor/compiler.js
@@ -0,0 +1,567 @@
+/*!
+ * Stylus - Compiler
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Visitor = require('./')
+ , utils = require('../utils')
+ , fs = require('fs');
+
+/**
+ * Initialize a new `Compiler` with the given `root` Node
+ * and the following `options`.
+ *
+ * Options:
+ *
+ * - `compress` Compress the CSS output (default: false)
+ *
+ * @param {Node} root
+ * @api public
+ */
+
+var Compiler = module.exports = function Compiler(root, options) {
+ options = options || {};
+ this.compress = options.compress;
+ this.firebug = options.firebug;
+ this.linenos = options.linenos;
+ this.spaces = options['indent spaces'] || 2;
+ this.indents = 1;
+ Visitor.call(this, root);
+ this.stack = [];
+};
+
+/**
+ * Inherit from `Visitor.prototype`.
+ */
+
+Compiler.prototype.__proto__ = Visitor.prototype;
+
+/**
+ * Compile to css, and return a string of CSS.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Compiler.prototype.compile = function(){
+ return this.visit(this.root);
+};
+
+/**
+ * Output `str`
+ *
+ * @param {String} str
+ * @param {Node} node
+ * @return {String}
+ * @api private
+ */
+
+Compiler.prototype.out = function(str, node){
+ return str;
+};
+
+/**
+ * Return indentation string.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Compiler.prototype.__defineGetter__('indent', function(){
+ if (this.compress) return '';
+ return new Array(this.indents).join(Array(this.spaces + 1).join(' '));
+});
+
+/**
+ * Check if given `node` needs brackets.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ * @api private
+ */
+
+Compiler.prototype.needBrackets = function(node){
+ return 1 == this.indents
+ || 'atrule' != node.nodeName
+ || node.hasOnlyProperties;
+};
+
+/**
+ * Visit Root.
+ */
+
+Compiler.prototype.visitRoot = function(block){
+ this.buf = '';
+ for (var i = 0, len = block.nodes.length; i < len; ++i) {
+ var node = block.nodes[i];
+ if (this.linenos || this.firebug) this.debugInfo(node);
+ var ret = this.visit(node);
+ if (ret) this.buf += this.out(ret + '\n', node);
+ }
+ return this.buf;
+};
+
+/**
+ * Visit Block.
+ */
+
+Compiler.prototype.visitBlock = function(block){
+ var node
+ , separator = this.compress ? '' : '\n'
+ , needBrackets;
+
+ if (block.hasProperties && !block.lacksRenderedSelectors) {
+ needBrackets = this.needBrackets(block.node);
+
+ if (needBrackets) {
+ this.buf += this.out(this.compress ? '{' : ' {\n');
+ ++this.indents;
+ }
+ for (var i = 0, len = block.nodes.length; i < len; ++i) {
+ this.last = len - 1 == i;
+ node = block.nodes[i];
+ switch (node.nodeName) {
+ case 'null':
+ case 'expression':
+ case 'function':
+ case 'group':
+ case 'block':
+ case 'unit':
+ case 'media':
+ case 'keyframes':
+ case 'atrule':
+ case 'supports':
+ continue;
+ // inline comments
+ case !this.compress && node.inline && 'comment':
+ this.buf = this.buf.slice(0, -1);
+ this.buf += this.out(' ' + this.visit(node) + '\n', node);
+ break;
+ case 'property':
+ var ret = this.visit(node) + separator;
+ this.buf += this.compress ? ret : this.out(ret, node);
+ break;
+ default:
+ this.buf += this.out(this.visit(node) + separator, node);
+ }
+ }
+ if (needBrackets) {
+ --this.indents;
+ this.buf += this.out(this.indent + '}' + separator);
+ }
+ }
+
+ // Nesting
+ for (var i = 0, len = block.nodes.length; i < len; ++i) {
+ node = block.nodes[i];
+ switch (node.nodeName) {
+ case 'group':
+ case 'block':
+ case 'keyframes':
+ if (this.linenos || this.firebug) this.debugInfo(node);
+ this.visit(node);
+ break;
+ case 'media':
+ case 'import':
+ case 'atrule':
+ case 'supports':
+ this.visit(node);
+ break;
+ case 'comment':
+ // only show unsuppressed comments
+ if (!node.suppress) {
+ this.buf += this.out(this.indent + this.visit(node) + '\n', node);
+ }
+ break;
+ case 'charset':
+ case 'literal':
+ case 'namespace':
+ this.buf += this.out(this.visit(node) + '\n', node);
+ break;
+ }
+ }
+};
+
+/**
+ * Visit Keyframes.
+ */
+
+Compiler.prototype.visitKeyframes = function(node){
+ if (!node.frames) return;
+
+ var prefix = 'official' == node.prefix
+ ? ''
+ : '-' + node.prefix + '-';
+
+ this.buf += this.out('@' + prefix + 'keyframes '
+ + this.visit(node.val)
+ + (this.compress ? '{' : ' {\n'), node);
+
+ this.keyframe = true;
+ ++this.indents;
+ this.visit(node.block);
+ --this.indents;
+ this.keyframe = false;
+
+ this.buf += this.out('}' + (this.compress ? '' : '\n'));
+};
+
+/**
+ * Visit Media.
+ */
+
+Compiler.prototype.visitMedia = function(media){
+ var val = media.val;
+ if (!media.hasOutput || !val.nodes.length) return;
+
+ this.buf += this.out('@media ', media);
+ this.visit(val);
+ this.buf += this.out(this.compress ? '{' : ' {\n');
+ ++this.indents;
+ this.visit(media.block);
+ --this.indents;
+ this.buf += this.out('}' + (this.compress ? '' : '\n'));
+};
+
+/**
+ * Visit QueryList.
+ */
+
+Compiler.prototype.visitQueryList = function(queries){
+ for (var i = 0, len = queries.nodes.length; i < len; ++i) {
+ this.visit(queries.nodes[i]);
+ if (len - 1 != i) this.buf += this.out(',' + (this.compress ? '' : ' '));
+ }
+};
+
+/**
+ * Visit Query.
+ */
+
+Compiler.prototype.visitQuery = function(node){
+ var len = node.nodes.length;
+ if (node.predicate) this.buf += this.out(node.predicate + ' ');
+ if (node.type) this.buf += this.out(node.type + (len ? ' and ' : ''));
+ for (var i = 0; i < len; ++i) {
+ this.buf += this.out(this.visit(node.nodes[i]));
+ if (len - 1 != i) this.buf += this.out(' and ');
+ }
+};
+
+/**
+ * Visit Feature.
+ */
+
+Compiler.prototype.visitFeature = function(node){
+ if (!node.expr) {
+ return node.name;
+ } else if (node.expr.isEmpty) {
+ return '(' + node.name + ')';
+ } else {
+ return '(' + node.name + ':' + (this.compress ? '' : ' ') + this.visit(node.expr) + ')';
+ }
+};
+
+/**
+ * Visit Import.
+ */
+
+Compiler.prototype.visitImport = function(imported){
+ this.buf += this.out('@import ' + this.visit(imported.path) + ';\n', imported);
+};
+
+/**
+ * Visit Atrule.
+ */
+
+Compiler.prototype.visitAtrule = function(atrule){
+ var newline = this.compress ? '' : '\n';
+
+ this.buf += this.out(this.indent + '@' + atrule.type, atrule);
+
+ if (atrule.val) this.buf += this.out(' ' + atrule.val.trim());
+
+ if (atrule.block) {
+ if (atrule.hasOnlyProperties) {
+ this.visit(atrule.block);
+ } else {
+ this.buf += this.out(this.compress ? '{' : ' {\n');
+ ++this.indents;
+ this.visit(atrule.block);
+ --this.indents;
+ this.buf += this.out(this.indent + '}' + newline);
+ }
+ } else {
+ this.buf += this.out(';' + newline);
+ }
+};
+
+/**
+ * Visit Supports.
+ */
+
+Compiler.prototype.visitSupports = function(node){
+ if (!node.hasOutput) return;
+
+ this.buf += this.out(this.indent + '@supports ', node);
+ this.isCondition = true;
+ this.buf += this.out(this.visit(node.condition));
+ this.isCondition = false;
+ this.buf += this.out(this.compress ? '{' : ' {\n');
+ ++this.indents;
+ this.visit(node.block);
+ --this.indents;
+ this.buf += this.out(this.indent + '}' + (this.compress ? '' : '\n'));
+},
+
+/**
+ * Visit Comment.
+ */
+
+Compiler.prototype.visitComment = function(comment){
+ return this.compress
+ ? comment.suppress
+ ? ''
+ : comment.str
+ : comment.str;
+};
+
+/**
+ * Visit Function.
+ */
+
+Compiler.prototype.visitFunction = function(fn){
+ return fn.name;
+};
+
+/**
+ * Visit Charset.
+ */
+
+Compiler.prototype.visitCharset = function(charset){
+ return '@charset ' + this.visit(charset.val) + ';';
+};
+
+/**
+ * Visit Namespace.
+ */
+
+Compiler.prototype.visitNamespace = function(namespace){
+ return '@namespace '
+ + (namespace.prefix ? this.visit(namespace.prefix) + ' ' : '')
+ + this.visit(namespace.val) + ';';
+};
+
+/**
+ * Visit Literal.
+ */
+
+Compiler.prototype.visitLiteral = function(lit){
+ var val = lit.val;
+ if (lit.css) val = val.replace(/^ /gm, '');
+ return val;
+};
+
+/**
+ * Visit Boolean.
+ */
+
+Compiler.prototype.visitBoolean = function(bool){
+ return bool.toString();
+};
+
+/**
+ * Visit RGBA.
+ */
+
+Compiler.prototype.visitRGBA = function(rgba){
+ return rgba.toString();
+};
+
+/**
+ * Visit HSLA.
+ */
+
+Compiler.prototype.visitHSLA = function(hsla){
+ return hsla.rgba.toString();
+};
+
+/**
+ * Visit Unit.
+ */
+
+Compiler.prototype.visitUnit = function(unit){
+ var type = unit.type || ''
+ , n = unit.val
+ , float = n != (n | 0);
+
+ // Compress
+ if (this.compress) {
+ // Always return '0' unless the unit is a percentage or time
+ if ('%' != type && 's' != type && 'ms' != type && 0 == n) return '0';
+ // Omit leading '0' on floats
+ if (float && n < 1 && n > -1) {
+ return n.toString().replace('0.', '.') + type;
+ }
+ }
+
+ return (float ? parseFloat(n.toFixed(15)) : n).toString() + type;
+};
+
+/**
+ * Visit Group.
+ */
+
+Compiler.prototype.visitGroup = function(group){
+ var stack = this.keyframe ? [] : this.stack
+ , comma = this.compress ? ',' : ',\n';
+
+ stack.push(group.nodes);
+
+ // selectors
+ if (group.block.hasProperties) {
+ var selectors = utils.compileSelectors.call(this, stack)
+ , len = selectors.length;
+
+ if (len) {
+ if (this.keyframe) comma = this.compress ? ',' : ', ';
+
+ for (var i = 0; i < len; ++i) {
+ var selector = selectors[i]
+ , last = (i == len - 1);
+
+ // keyframe blocks (10%, 20% { ... })
+ if (this.keyframe) selector = i ? selector.trim() : selector;
+
+ this.buf += this.out(selector + (last ? '' : comma), group.nodes[i]);
+ }
+ } else {
+ group.block.lacksRenderedSelectors = true;
+ }
+ }
+
+ // output block
+ this.visit(group.block);
+ stack.pop();
+};
+
+/**
+ * Visit Ident.
+ */
+
+Compiler.prototype.visitIdent = function(ident){
+ return ident.name;
+};
+
+/**
+ * Visit String.
+ */
+
+Compiler.prototype.visitString = function(string){
+ return this.isURL
+ ? string.val
+ : string.toString();
+};
+
+/**
+ * Visit Null.
+ */
+
+Compiler.prototype.visitNull = function(node){
+ return '';
+};
+
+/**
+ * Visit Call.
+ */
+
+Compiler.prototype.visitCall = function(call){
+ this.isURL = 'url' == call.name;
+ var args = call.args.nodes.map(function(arg){
+ return this.visit(arg);
+ }, this).join(this.compress ? ',' : ', ');
+ if (this.isURL) args = '"' + args + '"';
+ this.isURL = false;
+ return call.name + '(' + args + ')';
+};
+
+/**
+ * Visit Expression.
+ */
+
+Compiler.prototype.visitExpression = function(expr){
+ var buf = []
+ , self = this
+ , len = expr.nodes.length
+ , nodes = expr.nodes.map(function(node){ return self.visit(node); });
+
+ nodes.forEach(function(node, i){
+ var last = i == len - 1;
+ buf.push(node);
+ if ('/' == nodes[i + 1] || '/' == node) return;
+ if (last) return;
+
+ var space = self.isURL || (self.isCondition
+ && (')' == nodes[i + 1] || '(' == node))
+ ? '' : ' ';
+
+ buf.push(expr.isList
+ ? (self.compress ? ',' : ', ')
+ : space);
+ });
+
+ return buf.join('');
+};
+
+/**
+ * Visit Arguments.
+ */
+
+Compiler.prototype.visitArguments = Compiler.prototype.visitExpression;
+
+/**
+ * Visit Property.
+ */
+
+Compiler.prototype.visitProperty = function(prop){
+ var val = this.visit(prop.expr).trim()
+ , name = (prop.name || prop.segments.join(''))
+ , arr = [];
+ arr.push(
+ this.out(this.indent),
+ this.out(name + (this.compress ? ':' : ': '), prop),
+ this.out(val, prop.expr),
+ this.out(this.compress ? (this.last ? '' : ';') : ';')
+ );
+ return arr.join('');
+};
+
+/**
+ * Debug info.
+ */
+
+Compiler.prototype.debugInfo = function(node){
+
+ var path = node.filename == 'stdin' ? 'stdin' : fs.realpathSync(node.filename)
+ , line = (node.nodes && node.nodes.length ? node.nodes[0].lineno : node.lineno) || 1;
+
+ if (this.linenos){
+ this.buf += '\n/* ' + 'line ' + line + ' : ' + path + ' */\n';
+ }
+
+ if (this.firebug){
+ // debug info for firebug, the crazy formatting is needed
+ path = 'file\\\:\\\/\\\/' + path.replace(/([.:/\\])/g, function(m) {
+ return '\\' + (m === '\\' ? '\/' : m)
+ });
+ line = '\\00003' + line;
+ this.buf += '\n@media -stylus-debug-info'
+ + '{filename{font-family:' + path
+ + '}line{font-family:' + line + '}}\n';
+ }
+}
diff --git a/node_modules/stylus/lib/visitor/deps-resolver.js b/node_modules/stylus/lib/visitor/deps-resolver.js
new file mode 100644
index 00000000..b5597cad
--- /dev/null
+++ b/node_modules/stylus/lib/visitor/deps-resolver.js
@@ -0,0 +1,169 @@
+
+/**
+ * Module dependencies.
+ */
+
+var Visitor = require('./')
+ , Parser = require('../parser')
+ , nodes = require('../nodes')
+ , utils = require('../utils')
+ , dirname = require('path').dirname
+ , fs = require('fs');
+
+/**
+ * Initialize a new `DepsResolver` with the given `root` Node
+ * and the `options`.
+ *
+ * @param {Node} root
+ * @param {Object} options
+ * @api private
+ */
+
+var DepsResolver = module.exports = function DepsResolver(root, options) {
+ this.root = root;
+ this.filename = options.filename;
+ this.paths = options.paths || [];
+ this.paths.push(dirname(options.filename || '.'));
+ this.options = options;
+ this.functions = {};
+ this.deps = [];
+};
+
+/**
+ * Inherit from `Visitor.prototype`.
+ */
+
+DepsResolver.prototype.__proto__ = Visitor.prototype;
+
+var visit = DepsResolver.prototype.visit;
+
+DepsResolver.prototype.visit = function(node) {
+ switch (node.nodeName) {
+ case 'root':
+ case 'block':
+ case 'expression':
+ this.visitRoot(node);
+ break;
+ case 'group':
+ case 'media':
+ case 'atblock':
+ case 'atrule':
+ case 'keyframes':
+ case 'each':
+ case 'supports':
+ this.visit(node.block);
+ break;
+ default:
+ visit.call(this, node);
+ }
+};
+
+/**
+ * Visit Root.
+ */
+
+DepsResolver.prototype.visitRoot = function(block) {
+ for (var i = 0, len = block.nodes.length; i < len; ++i) {
+ this.visit(block.nodes[i]);
+ }
+};
+
+/**
+ * Visit Ident.
+ */
+
+DepsResolver.prototype.visitIdent = function(ident) {
+ this.visit(ident.val);
+};
+
+/**
+ * Visit If.
+ */
+
+DepsResolver.prototype.visitIf = function(node) {
+ this.visit(node.block);
+ this.visit(node.cond);
+ for (var i = 0, len = node.elses.length; i < len; ++i) {
+ this.visit(node.elses[i]);
+ }
+};
+
+/**
+ * Visit Function.
+ */
+
+DepsResolver.prototype.visitFunction = function(fn) {
+ this.functions[fn.name] = fn.block;
+};
+
+/**
+ * Visit Call.
+ */
+
+DepsResolver.prototype.visitCall = function(call) {
+ if (call.name in this.functions) this.visit(this.functions[call.name]);
+ if (call.block) this.visit(call.block);
+};
+
+/**
+ * Visit Import.
+ */
+
+DepsResolver.prototype.visitImport = function(node) {
+ var path = node.path.first.val
+ , literal, found, oldPath;
+
+ if (!path) return;
+
+ literal = /\.css(?:"|$)/.test(path);
+
+ // support optional .styl
+ if (!literal && !/\.styl$/i.test(path)) {
+ oldPath = path;
+ path += '.styl';
+ }
+
+ // Lookup
+ found = utils.find(path, this.paths, this.filename);
+
+ // support optional index
+ if (!found && oldPath) found = utils.lookupIndex(oldPath, this.paths, this.filename);
+
+ if (!found) return;
+
+ this.deps = this.deps.concat(found);
+
+ if (literal) return;
+
+ // nested imports
+ for (var i = 0, len = found.length; i < len; ++i) {
+ var file = found[i]
+ , dir = dirname(file)
+ , str = fs.readFileSync(file, 'utf-8')
+ , block = new nodes.Block
+ , parser = new Parser(str, utils.merge({ root: block }, this.options));
+
+ if (!~this.paths.indexOf(dir)) this.paths.push(dir);
+
+ try {
+ block = parser.parse();
+ } catch (err) {
+ err.filename = file;
+ err.lineno = parser.lexer.lineno;
+ err.column = parser.lexer.column;
+ err.input = str;
+ throw err;
+ }
+
+ this.visit(block);
+ }
+};
+
+/**
+ * Get dependencies.
+ */
+
+DepsResolver.prototype.resolve = function() {
+ this.visit(this.root);
+ return utils.uniq(this.deps);
+};
diff --git a/node_modules/stylus/lib/visitor/evaluator.js b/node_modules/stylus/lib/visitor/evaluator.js
new file mode 100644
index 00000000..b5ddc636
--- /dev/null
+++ b/node_modules/stylus/lib/visitor/evaluator.js
@@ -0,0 +1,1610 @@
+
+/*!
+ * Stylus - Evaluator
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Visitor = require('./')
+ , units = require('../units')
+ , nodes = require('../nodes')
+ , Stack = require('../stack')
+ , Frame = require('../stack/frame')
+ , utils = require('../utils')
+ , bifs = require('../functions')
+ , dirname = require('path').dirname
+ , colors = require('../colors')
+ , debug = require('debug')('stylus:evaluator')
+ , fs = require('fs');
+
+/**
+ * Import `file` and return Block node.
+ *
+ * @api private
+ */
+function importFile(node, file, literal) {
+ var importStack = this.importStack
+ , Parser = require('../parser')
+ , stat;
+
+ // Handling the `require`
+ if (node.once) {
+ if (this.requireHistory[file]) return nodes.null;
+ this.requireHistory[file] = true;
+
+ if (literal && !this.includeCSS) {
+ return node;
+ }
+ }
+
+ // Avoid overflows from importing the same file over again
+ if (~importStack.indexOf(file))
+ throw new Error('import loop has been found');
+
+ var str = fs.readFileSync(file, 'utf8');
+
+ // shortcut for empty files
+ if (!str.trim()) return nodes.null;
+
+ // Expose imports
+ node.path = file;
+ node.dirname = dirname(file);
+ // Store the modified time
+ stat = fs.statSync(file);
+ node.mtime = stat.mtime;
+ this.paths.push(node.dirname);
+
+ if (this.options._imports) this.options._imports.push(node.clone());
+
+ // Parse the file
+ importStack.push(file);
+ nodes.filename = file;
+
+ if (literal) {
+ literal = new nodes.Literal(str.replace(/\r\n?/g, '\n'));
+ literal.lineno = literal.column = 1;
+ if (!this.resolveURL) return literal;
+ }
+
+ // parse
+ var block = new nodes.Block
+ , parser = new Parser(str, utils.merge({ root: block }, this.options));
+
+ try {
+ block = parser.parse();
+ } catch (err) {
+ var line = parser.lexer.lineno
+ , column = parser.lexer.column;
+
+ if (literal && this.includeCSS && this.resolveURL) {
+ this.warn('ParseError: ' + file + ':' + line + ':' + column + '. This file included as-is');
+ return literal;
+ } else {
+ err.filename = file;
+ err.lineno = line;
+ err.column = column;
+ err.input = str;
+ throw err;
+ }
+ }
+
+ // Evaluate imported "root"
+ block = block.clone(this.currentBlock);
+ block.parent = this.currentBlock;
+ block.scope = false;
+ var ret = this.visit(block);
+ importStack.pop();
+ if (!this.resolveURL || this.resolveURL.nocheck) this.paths.pop();
+
+ return ret;
+}
+
+/**
+ * Initialize a new `Evaluator` with the given `root` Node
+ * and the following `options`.
+ *
+ * Options:
+ *
+ * - `compress` Compress the css output, defaults to false
+ * - `warn` Warn the user of duplicate function definitions etc
+ *
+ * @param {Node} root
+ * @api private
+ */
+
+var Evaluator = module.exports = function Evaluator(root, options) {
+ options = options || {};
+ Visitor.call(this, root);
+ var functions = this.functions = options.functions || {};
+ this.stack = new Stack;
+ this.imports = options.imports || [];
+ this.globals = options.globals || {};
+ this.paths = options.paths || [];
+ this.prefix = options.prefix || '';
+ this.filename = options.filename;
+ this.includeCSS = options['include css'];
+ this.resolveURL = functions.url
+ && 'resolver' == functions.url.name
+ && functions.url.options;
+ this.paths.push(dirname(options.filename || '.'));
+ this.stack.push(this.global = new Frame(root));
+ this.warnings = options.warn;
+ this.options = options;
+ this.calling = []; // TODO: remove, use stack
+ this.importStack = [];
+ this.requireHistory = {};
+ this.return = 0;
+};
+
+/**
+ * Inherit from `Visitor.prototype`.
+ */
+
+Evaluator.prototype.__proto__ = Visitor.prototype;
+
+/**
+ * Proxy visit to expose node line numbers.
+ *
+ * @param {Node} node
+ * @return {Node}
+ * @api private
+ */
+
+var visit = Visitor.prototype.visit;
+Evaluator.prototype.visit = function(node){
+ try {
+ return visit.call(this, node);
+ } catch (err) {
+ if (err.filename) throw err;
+ err.lineno = node.lineno;
+ err.column = node.column;
+ err.filename = node.filename;
+ err.stylusStack = this.stack.toString();
+ try {
+ err.input = fs.readFileSync(err.filename, 'utf8');
+ } catch (err) {
+ // ignore
+ }
+ throw err;
+ }
+};
+
+/**
+ * Perform evaluation setup:
+ *
+ * - populate global scope
+ * - iterate imports
+ *
+ * @api private
+ */
+
+Evaluator.prototype.setup = function(){
+ var root = this.root;
+ var imports = [];
+
+ this.populateGlobalScope();
+ this.imports.forEach(function(file){
+ var expr = new nodes.Expression;
+ expr.push(new nodes.String(file));
+ imports.push(new nodes.Import(expr));
+ }, this);
+
+ root.nodes = imports.concat(root.nodes);
+};
+
+/**
+ * Populate the global scope with:
+ *
+ * - css colors
+ * - user-defined globals
+ *
+ * @api private
+ */
+
+Evaluator.prototype.populateGlobalScope = function(){
+ var scope = this.global.scope;
+
+ // colors
+ Object.keys(colors).forEach(function(name){
+ var color = colors[name]
+ , rgba = new nodes.RGBA(color[0], color[1], color[2], color[3])
+ , node = new nodes.Ident(name, rgba);
+ rgba.name = name;
+ scope.add(node);
+ });
+
+ // expose url function
+ scope.add(new nodes.Ident(
+ 'embedurl',
+ new nodes.Function('embedurl', require('../functions/url')({
+ limit: false
+ }))
+ ));
+
+ // user-defined globals
+ var globals = this.globals;
+ Object.keys(globals).forEach(function(name){
+ var val = globals[name];
+ if (!val.nodeName) val = new nodes.Literal(val);
+ scope.add(new nodes.Ident(name, val));
+ });
+};
+
+/**
+ * Evaluate the tree.
+ *
+ * @return {Node}
+ * @api private
+ */
+
+Evaluator.prototype.evaluate = function(){
+ debug('eval %s', this.filename);
+ this.setup();
+ return this.visit(this.root);
+};
+
+/**
+ * Visit Group.
+ */
+
+Evaluator.prototype.visitGroup = function(group){
+ group.nodes = group.nodes.map(function(selector){
+ selector.val = this.interpolate(selector);
+ debug('ruleset %s', selector.val);
+ return selector;
+ }, this);
+
+ group.block = this.visit(group.block);
+ return group;
+};
+
+/**
+ * Visit Return.
+ */
+
+Evaluator.prototype.visitReturn = function(ret){
+ ret.expr = this.visit(ret.expr);
+ throw ret;
+};
+
+/**
+ * Visit Media.
+ */
+
+Evaluator.prototype.visitMedia = function(media){
+ media.block = this.visit(media.block);
+ media.val = this.visit(media.val);
+ return media;
+};
+
+/**
+ * Visit QueryList.
+ */
+
+Evaluator.prototype.visitQueryList = function(queries){
+ var val, query;
+ queries.nodes.forEach(this.visit, this);
+
+ if (1 == queries.nodes.length) {
+ query = queries.nodes[0];
+ if (val = this.lookup(query.type)) {
+ val = val.first.string;
+ if (!val) return queries;
+ var Parser = require('../parser')
+ , parser = new Parser(val, this.options);
+ queries = this.visit(parser.queries());
+ }
+ }
+ return queries;
+};
+
+/**
+ * Visit Query.
+ */
+
+Evaluator.prototype.visitQuery = function(node){
+ node.predicate = this.visit(node.predicate);
+ node.type = this.visit(node.type);
+ node.nodes.forEach(this.visit, this);
+ return node;
+};
+
+/**
+ * Visit Feature.
+ */
+
+Evaluator.prototype.visitFeature = function(node){
+ node.name = this.interpolate(node);
+ if (node.expr) {
+ this.return++;
+ node.expr = this.visit(node.expr);
+ this.return--;
+ }
+ return node;
+};
+
+/**
+ * Visit Object.
+ */
+
+Evaluator.prototype.visitObject = function(obj){
+ for (var key in obj.vals) {
+ obj.vals[key] = this.visit(obj.vals[key]);
+ }
+ return obj;
+};
+
+/**
+ * Visit Member.
+ */
+
+Evaluator.prototype.visitMember = function(node){
+ var left = node.left
+ , right = node.right
+ , obj = this.visit(left).first;
+
+ if ('object' != obj.nodeName) {
+ throw new Error(left.toString() + ' has no property .' + right);
+ }
+ if (node.val) {
+ this.return++;
+ obj.set(right.name, this.visit(node.val));
+ this.return--;
+ }
+ return obj.get(right.name);
+};
+
+/**
+ * Visit Keyframes.
+ */
+
+Evaluator.prototype.visitKeyframes = function(keyframes){
+ var val;
+ if (keyframes.fabricated) return keyframes;
+ keyframes.val = this.interpolate(keyframes).trim();
+ if (val = this.lookup(keyframes.val)) {
+ keyframes.val = val.first.string || val.first.name;
+ }
+ keyframes.block = this.visit(keyframes.block);
+
+ if ('official' != keyframes.prefix) return keyframes;
+
+ this.vendors.forEach(function(prefix){
+ // IE never had prefixes for keyframes
+ if ('ms' == prefix) return;
+ var node = keyframes.clone();
+ node.val = keyframes.val;
+ node.prefix = prefix;
+ node.block = keyframes.block;
+ node.fabricated = true;
+ this.currentBlock.push(node);
+ }, this);
+
+ return nodes.null;
+};
+
+/**
+ * Visit Function.
+ */
+
+Evaluator.prototype.visitFunction = function(fn){
+ // check local
+ var local = this.stack.currentFrame.scope.lookup(fn.name);
+ if (local) this.warn('local ' + local.nodeName + ' "' + fn.name + '" previously defined in this scope');
+
+ // user-defined
+ var user = this.functions[fn.name];
+ if (user) this.warn('user-defined function "' + fn.name + '" is already defined');
+
+ // BIF
+ var bif = bifs[fn.name];
+ if (bif) this.warn('built-in function "' + fn.name + '" is already defined');
+
+ return fn;
+};
+
+/**
+ * Visit Each.
+ */
+
+Evaluator.prototype.visitEach = function(each){
+ this.return++;
+ var expr = utils.unwrap(this.visit(each.expr))
+ , len = expr.nodes.length
+ , val = new nodes.Ident(each.val)
+ , key = new nodes.Ident(each.key || '__index__')
+ , scope = this.currentScope
+ , block = this.currentBlock
+ , vals = []
+ , self = this
+ , body
+ , obj;
+ this.return--;
+
+ each.block.scope = false;
+
+ function visitBody(key, val) {
+ scope.add(val);
+ scope.add(key);
+ body = self.visit(each.block.clone());
+ vals = vals.concat(body.nodes);
+ }
+
+ // for prop in obj
+ if (1 == len && 'object' == expr.nodes[0].nodeName) {
+ obj = expr.nodes[0];
+ for (var prop in obj.vals) {
+ val.val = new nodes.String(prop);
+ key.val = obj.get(prop);
+ visitBody(key, val);
+ }
+ } else {
+ for (var i = 0; i < len; ++i) {
+ val.val = expr.nodes[i];
+ key.val = new nodes.Unit(i);
+ visitBody(key, val);
+ }
+ }
+
+ this.mixin(vals, block);
+ return vals[vals.length - 1] || nodes.null;
+};
+
+/**
+ * Visit Call.
+ */
+
+Evaluator.prototype.visitCall = function(call){
+ debug('call %s', call);
+ var fn = this.lookup(call.name)
+ , literal
+ , ret;
+
+ // url()
+ this.ignoreColors = 'url' == call.name;
+
+ // Variable function
+ if (fn && 'expression' == fn.nodeName) {
+ fn = fn.nodes[0];
+ }
+
+ // Not a function? try user-defined or built-ins
+ if (fn && 'function' != fn.nodeName) {
+ fn = this.lookupFunction(call.name);
+ }
+
+ // Undefined function? render literal CSS
+ if (!fn || fn.nodeName != 'function') {
+ debug('%s is undefined', call);
+ // Special case for `calc`
+ if ('calc' == this.unvendorize(call.name)) {
+ literal = call.args.nodes && call.args.nodes[0];
+ if (literal) ret = new nodes.Literal(call.name + literal);
+ } else {
+ ret = this.literalCall(call);
+ }
+ this.ignoreColors = false;
+ return ret;
+ }
+
+ this.calling.push(call.name);
+
+ // Massive stack
+ if (this.calling.length > 200) {
+ throw new RangeError('Maximum stylus call stack size exceeded');
+ }
+
+ // First node in expression
+ if ('expression' == fn.nodeName) fn = fn.first;
+
+ // Evaluate arguments
+ this.return++;
+ var args = this.visit(call.args);
+
+ for (var key in args.map) {
+ args.map[key] = this.visit(args.map[key].clone());
+ }
+ this.return--;
+
+ // Built-in
+ if (fn.fn) {
+ debug('%s is built-in', call);
+ ret = this.invokeBuiltin(fn.fn, args);
+ // User-defined
+ } else if ('function' == fn.nodeName) {
+ debug('%s is user-defined', call);
+ // Evaluate mixin block
+ if (call.block) call.block = this.visit(call.block);
+ ret = this.invokeFunction(fn, args, call.block);
+ }
+
+ this.calling.pop();
+ this.ignoreColors = false;
+ return ret;
+};
+
+/**
+ * Visit Ident.
+ */
+
+Evaluator.prototype.visitIdent = function(ident){
+ var prop;
+ // Property lookup
+ if (ident.property) {
+ if (prop = this.lookupProperty(ident.name)) {
+ return this.visit(prop.expr.clone());
+ }
+ return nodes.null;
+ // Lookup
+ } else if (ident.val.isNull) {
+ var val = this.lookup(ident.name);
+ // Object or Block mixin
+ if (val && ident.mixin) this.mixinNode(val);
+ return val ? this.visit(val) : ident;
+ // Assign
+ } else {
+ this.return++;
+ ident.val = this.visit(ident.val);
+ this.return--;
+ this.currentScope.add(ident);
+ return ident.val;
+ }
+};
+
+/**
+ * Visit BinOp.
+ */
+
+Evaluator.prototype.visitBinOp = function(binop){
+ // Special-case "is defined" pseudo binop
+ if ('is defined' == binop.op) return this.isDefined(binop.left);
+
+ this.return++;
+ // Visit operands
+ var op = binop.op
+ , left = this.visit(binop.left)
+ , right = ('||' == op || '&&' == op)
+ ? binop.right : this.visit(binop.right);
+
+ // HACK: ternary
+ var val = binop.val
+ ? this.visit(binop.val)
+ : null;
+ this.return--;
+
+ // Operate
+ try {
+ return this.visit(left.operate(op, right, val));
+ } catch (err) {
+ // disregard coercion issues in equality
+ // checks, and simply return false
+ if ('CoercionError' == err.name) {
+ switch (op) {
+ case '==':
+ return nodes.false;
+ case '!=':
+ return nodes.true;
+ }
+ }
+ throw err;
+ }
+};
+
+/**
+ * Visit UnaryOp.
+ */
+
+Evaluator.prototype.visitUnaryOp = function(unary){
+ var op = unary.op
+ , node = this.visit(unary.expr);
+
+ if ('!' != op) {
+ node = node.first.clone();
+ utils.assertType(node, 'unit');
+ }
+
+ switch (op) {
+ case '-':
+ node.val = -node.val;
+ break;
+ case '+':
+ node.val = +node.val;
+ break;
+ case '~':
+ node.val = ~node.val;
+ break;
+ case '!':
+ return node.toBoolean().negate();
+ }
+
+ return node;
+};
+
+/**
+ * Visit TernaryOp.
+ */
+
+Evaluator.prototype.visitTernary = function(ternary){
+ var ok = this.visit(ternary.cond).toBoolean();
+ return ok.isTrue
+ ? this.visit(ternary.trueExpr)
+ : this.visit(ternary.falseExpr);
+};
+
+/**
+ * Visit Expression.
+ */
+
+Evaluator.prototype.visitExpression = function(expr){
+ for (var i = 0, len = expr.nodes.length; i < len; ++i) {
+ expr.nodes[i] = this.visit(expr.nodes[i]);
+ }
+
+ // support (n * 5)px etc
+ if (this.castable(expr)) expr = this.cast(expr);
+
+ return expr;
+};
+
+/**
+ * Visit Arguments.
+ */
+
+Evaluator.prototype.visitArguments = Evaluator.prototype.visitExpression;
+
+/**
+ * Visit Property.
+ */
+
+Evaluator.prototype.visitProperty = function(prop){
+ var name = this.interpolate(prop)
+ , fn = this.lookup(name)
+ , call = fn && 'function' == fn.first.nodeName
+ , literal = ~this.calling.indexOf(name)
+ , _prop = this.property;
+
+ // Function of the same name
+ if (call && !literal && !prop.literal) {
+ var args = nodes.Arguments.fromExpression(utils.unwrap(prop.expr.clone()));
+ prop.name = name;
+ this.property = prop;
+ this.return++;
+ this.property.expr = this.visit(prop.expr);
+ this.return--;
+ var ret = this.visit(new nodes.Call(name, args));
+ this.property = _prop;
+ return ret;
+ // Regular property
+ } else {
+ this.return++;
+ prop.name = name;
+ prop.literal = true;
+ this.property = prop;
+ prop.expr = this.visit(prop.expr);
+ this.property = _prop;
+ this.return--;
+ return prop;
+ }
+};
+
+/**
+ * Visit Root.
+ */
+
+Evaluator.prototype.visitRoot = function(block){
+ // normalize cached imports
+ if (block != this.root) {
+ block.constructor = nodes.Block;
+ return this.visit(block);
+ }
+
+ for (var i = 0; i < block.nodes.length; ++i) {
+ block.index = i;
+ block.nodes[i] = this.visit(block.nodes[i]);
+ }
+ return block;
+};
+
+/**
+ * Visit Block.
+ */
+
+Evaluator.prototype.visitBlock = function(block){
+ this.stack.push(new Frame(block));
+ for (block.index = 0; block.index < block.nodes.length; ++block.index) {
+ try {
+ block.nodes[block.index] = this.visit(block.nodes[block.index]);
+ } catch (err) {
+ if ('return' == err.nodeName) {
+ if (this.return) {
+ this.stack.pop();
+ throw err;
+ } else {
+ block.nodes[block.index] = err;
+ break;
+ }
+ } else {
+ throw err;
+ }
+ }
+ }
+ this.stack.pop();
+ return block;
+};
+
+/**
+ * Visit Atblock.
+ */
+
+Evaluator.prototype.visitAtblock = function(atblock){
+ atblock.block = this.visit(atblock.block);
+ return atblock;
+};
+
+/**
+ * Visit Atrule.
+ */
+
+Evaluator.prototype.visitAtrule = function(atrule){
+ atrule.val = this.interpolate(atrule);
+ if (atrule.block) atrule.block = this.visit(atrule.block);
+ return atrule;
+};
+
+/**
+ * Visit Supports.
+ */
+
+Evaluator.prototype.visitSupports = function(node){
+ var condition = node.condition
+ , val;
+
+ this.return++;
+ node.condition = this.visit(condition);
+ this.return--;
+
+ val = condition.first;
+ if (1 == condition.nodes.length
+ && 'string' == val.nodeName) {
+ node.condition = val.string;
+ }
+ node.block = this.visit(node.block);
+ return node;
+};
+
+/**
+ * Visit If.
+ */
+
+Evaluator.prototype.visitIf = function(node){
+ var ret
+ , block = this.currentBlock
+ , negate = node.negate;
+
+ this.return++;
+ var ok = this.visit(node.cond).first.toBoolean();
+ this.return--;
+
+ node.block.scope = node.block.hasMedia;
+
+ // Evaluate body
+ if (negate) {
+ // unless
+ if (ok.isFalse) {
+ ret = this.visit(node.block);
+ }
+ } else {
+ // if
+ if (ok.isTrue) {
+ ret = this.visit(node.block);
+ // else
+ } else if (node.elses.length) {
+ var elses = node.elses
+ , len = elses.length
+ , cond;
+ for (var i = 0; i < len; ++i) {
+ // else if
+ if (elses[i].cond) {
+ elses[i].block.scope = elses[i].block.hasMedia;
+ this.return++;
+ cond = this.visit(elses[i].cond).first.toBoolean();
+ this.return--;
+ if (cond.isTrue) {
+ ret = this.visit(elses[i].block);
+ break;
+ }
+ // else
+ } else {
+ elses[i].scope = elses[i].hasMedia;
+ ret = this.visit(elses[i]);
+ }
+ }
+ }
+ }
+
+ // mixin conditional statements within
+ // a selector group or at-rule
+ if (ret && !node.postfix && block.node
+ && ~['group'
+ , 'atrule'
+ , 'media'
+ , 'supports'
+ , 'keyframes'].indexOf(block.node.nodeName)) {
+ this.mixin(ret.nodes, block);
+ return nodes.null;
+ }
+
+ return ret || nodes.null;
+};
+
+/**
+ * Visit Extend.
+ */
+
+Evaluator.prototype.visitExtend = function(extend){
+ var block = this.currentBlock;
+ if ('group' != block.node.nodeName) block = this.closestGroup;
+ extend.selectors.forEach(function(selector){
+ block.node.extends.push({
+ // Cloning the selector for when we are in a loop and don't want it to affect
+ // the selector nodes and cause the values to be different to expected
+ selector: this.interpolate(selector.clone()).trim(),
+ optional: selector.optional,
+ lineno: selector.lineno,
+ column: selector.column
+ });
+ }, this);
+ return nodes.null;
+};
+
+/**
+ * Visit Import.
+ */
+
+Evaluator.prototype.visitImport = function(imported){
+ this.return++;
+
+ var path = this.visit(imported.path).first
+ , nodeName = imported.once ? 'require' : 'import'
+ , found
+ , literal;
+
+ this.return--;
+ debug('import %s', path);
+
+ // url() passed
+ if ('url' == path.name) {
+ if (imported.once) throw new Error('You cannot @require a url');
+
+ return imported;
+ }
+
+ // Ensure string
+ if (!path.string) throw new Error('@' + nodeName + ' string expected');
+
+ var name = path = path.string;
+
+ // Absolute URL or hash
+ if (/(?:url\s*\(\s*)?['"]?(?:#|(?:https?:)?\/\/)/i.test(path)) {
+ if (imported.once) throw new Error('You cannot @require a url');
+ return imported;
+ }
+
+ // Literal
+ if (/\.css(?:"|$)/.test(path)) {
+ literal = true;
+ if (!imported.once && !this.includeCSS) {
+ return imported;
+ }
+ }
+
+ // support optional .styl
+ if (!literal && !/\.styl$/i.test(path)) path += '.styl';
+
+ // Lookup
+ found = utils.find(path, this.paths, this.filename);
+ if (!found) {
+ found = utils.lookupIndex(name, this.paths, this.filename);
+ }
+
+ // Throw if import failed
+ if (!found) throw new Error('failed to locate @' + nodeName + ' file ' + path);
+
+ var block = new nodes.Block;
+
+ for (var i = 0, len = found.length; i < len; ++i) {
+ block.push(importFile.call(this, imported, found[i], literal));
+ }
+
+ return block;
+};
+
+/**
+ * Invoke `fn` with `args`.
+ *
+ * @param {Function} fn
+ * @param {Array} args
+ * @return {Node}
+ * @api private
+ */
+
+Evaluator.prototype.invokeFunction = function(fn, args, content){
+ var block = new nodes.Block(fn.block.parent);
+
+ // Clone the function body
+ // to prevent mutation of subsequent calls
+ var body = fn.block.clone(block);
+
+ // mixin block
+ var mixinBlock = this.stack.currentFrame.block;
+
+ // new block scope
+ this.stack.push(new Frame(block));
+ var scope = this.currentScope;
+
+ // normalize arguments
+ if ('arguments' != args.nodeName) {
+ var expr = new nodes.Expression;
+ expr.push(args);
+ args = nodes.Arguments.fromExpression(expr);
+ }
+
+ // arguments local
+ scope.add(new nodes.Ident('arguments', args));
+
+ // mixin scope introspection
+ scope.add(new nodes.Ident('mixin', this.return
+ ? nodes.false
+ : new nodes.String(mixinBlock.nodeName)));
+
+ // current property
+ if (this.property) {
+ var prop = this.propertyExpression(this.property, fn.name);
+ scope.add(new nodes.Ident('current-property', prop));
+ } else {
+ scope.add(new nodes.Ident('current-property', nodes.null));
+ }
+
+ // current call stack
+ var expr = new nodes.Expression;
+ for (var i = this.calling.length - 1; i-- ; ) {
+ expr.push(new nodes.Literal(this.calling[i]));
+ };
+ scope.add(new nodes.Ident('called-from', expr));
+
+ // inject arguments as locals
+ var i = 0
+ , len = args.nodes.length;
+ fn.params.nodes.forEach(function(node){
+ // rest param support
+ if (node.rest) {
+ node.val = new nodes.Expression;
+ for (; i < len; ++i) node.val.push(args.nodes[i]);
+ node.val.preserve = true;
+ node.val.isList = args.isList;
+ // argument default support
+ } else {
+ var arg = args.map[node.name] || args.nodes[i++];
+ node = node.clone();
+ if (arg) {
+ arg.isEmpty ? args.nodes[i - 1] = this.visit(node) : node.val = arg;
+ } else {
+ args.push(node.val);
+ }
+
+ // required argument not satisfied
+ if (node.val.isNull) {
+ throw new Error('argument "' + node + '" required for ' + fn);
+ }
+ }
+
+ scope.add(node);
+ }, this);
+
+ // mixin block
+ if (content) scope.add(new nodes.Ident('block', content, true));
+
+ // invoke
+ return this.invoke(body, true, fn.filename);
+};
+
+/**
+ * Invoke built-in `fn` with `args`.
+ *
+ * @param {Function} fn
+ * @param {Array} args
+ * @return {Node}
+ * @api private
+ */
+
+Evaluator.prototype.invokeBuiltin = function(fn, args){
+ // Map arguments to first node
+ // providing a nicer js api for
+ // BIFs. Functions may specify that
+ // they wish to accept full expressions
+ // via .raw
+ if (fn.raw) {
+ args = args.nodes;
+ } else {
+ args = utils.params(fn).reduce(function(ret, param){
+ var arg = args.map[param] || args.nodes.shift()
+ if (arg) {
+ arg = utils.unwrap(arg);
+ var len = arg.nodes.length;
+ if (len > 1) {
+ for (var i = 0; i < len; ++i) {
+ ret.push(utils.unwrap(arg.nodes[i].first));
+ }
+ } else {
+ ret.push(arg.first);
+ }
+ }
+ return ret;
+ }, []);
+ }
+
+ // Invoke the BIF
+ var body = utils.coerce(fn.apply(this, args));
+
+ // Always wrapping allows js functions
+ // to return several values with a single
+ // Expression node
+ var expr = new nodes.Expression;
+ expr.push(body);
+ body = expr;
+
+ // Invoke
+ return this.invoke(body);
+};
+
+/**
+ * Invoke the given function `body`.
+ *
+ * @param {Block} body
+ * @return {Node}
+ * @api private
+ */
+
+Evaluator.prototype.invoke = function(body, stack, filename){
+ var self = this
+ , ret;
+
+ if (filename) this.paths.push(dirname(filename));
+
+ // Return
+ if (this.return) {
+ ret = this.eval(body.nodes);
+ if (stack) this.stack.pop();
+ // Mixin
+ } else {
+ body = this.visit(body);
+ if (stack) this.stack.pop();
+ this.mixin(body.nodes, this.currentBlock);
+ ret = nodes.null;
+ }
+
+ if (filename) this.paths.pop();
+
+ return ret;
+};
+
+/**
+ * Mixin the given `nodes` to the given `block`.
+ *
+ * @param {Array} nodes
+ * @param {Block} block
+ * @api private
+ */
+
+Evaluator.prototype.mixin = function(nodes, block){
+ if (!nodes.length) return;
+ var len = block.nodes.length
+ , head = block.nodes.slice(0, block.index)
+ , tail = block.nodes.slice(block.index + 1, len);
+ this._mixin(nodes, head, block);
+ block.index = 0;
+ block.nodes = head.concat(tail);
+};
+
+/**
+ * Mixin the given `items` to the `dest` array.
+ *
+ * @param {Array} items
+ * @param {Array} dest
+ * @param {Block} block
+ * @api private
+ */
+
+Evaluator.prototype._mixin = function(items, dest, block){
+ var node
+ , len = items.length;
+ for (var i = 0; i < len; ++i) {
+ switch ((node = items[i]).nodeName) {
+ case 'return':
+ return;
+ case 'block':
+ this._mixin(node.nodes, dest, block);
+ break;
+ case 'media':
+ // fix link to the parent block
+ var parentNode = node.block.parent.node;
+ if (parentNode && 'call' != parentNode.nodeName) {
+ node.block.parent = block;
+ }
+ case 'property':
+ var val = node.expr;
+ // prevent `block` mixin recursion
+ if (node.literal && 'block' == val.first.name) {
+ val = utils.unwrap(val);
+ val.nodes[0] = new nodes.Literal('block');
+ }
+ default:
+ dest.push(node);
+ }
+ }
+};
+
+/**
+ * Mixin the given `node` to the current block.
+ *
+ * @param {Node} node
+ * @api private
+ */
+
+Evaluator.prototype.mixinNode = function(node){
+ node = this.visit(node.first);
+ switch (node.nodeName) {
+ case 'object':
+ this.mixinObject(node);
+ return nodes.null;
+ case 'block':
+ case 'atblock':
+ this.mixin(node.nodes, this.currentBlock);
+ return nodes.null;
+ }
+};
+
+/**
+ * Mixin the given `object` to the current block.
+ *
+ * @param {Object} object
+ * @api private
+ */
+
+Evaluator.prototype.mixinObject = function(object){
+ var Parser = require('../parser')
+ , root = this.root
+ , str = '$block ' + object.toBlock()
+ , parser = new Parser(str, utils.merge({ root: block }, this.options))
+ , block;
+
+ try {
+ block = parser.parse();
+ } catch (err) {
+ err.filename = this.filename;
+ err.lineno = parser.lexer.lineno;
+ err.column = parser.lexer.column;
+ err.input = str;
+ throw err;
+ }
+
+ block.parent = root;
+ block.scope = false;
+ var ret = this.visit(block)
+ , vals = ret.first.nodes;
+ for (var i = 0, len = vals.length; i < len; ++i) {
+ if (vals[i].block) {
+ this.mixin(vals[i].block.nodes, this.currentBlock);
+ break;
+ }
+ }
+};
+
+/**
+ * Evaluate the given `vals`.
+ *
+ * @param {Array} vals
+ * @return {Node}
+ * @api private
+ */
+
+Evaluator.prototype.eval = function(vals){
+ if (!vals) return nodes.null;
+ var len = vals.length
+ , node = nodes.null;
+
+ try {
+ for (var i = 0; i < len; ++i) {
+ node = vals[i];
+ switch (node.nodeName) {
+ case 'if':
+ if ('block' != node.block.nodeName) {
+ node = this.visit(node);
+ break;
+ }
+ case 'each':
+ case 'block':
+ node = this.visit(node);
+ if (node.nodes) node = this.eval(node.nodes);
+ break;
+ default:
+ node = this.visit(node);
+ }
+ }
+ } catch (err) {
+ if ('return' == err.nodeName) {
+ return err.expr;
+ } else {
+ throw err;
+ }
+ }
+
+ return node;
+};
+
+/**
+ * Literal function `call`.
+ *
+ * @param {Call} call
+ * @return {call}
+ * @api private
+ */
+
+Evaluator.prototype.literalCall = function(call){
+ call.args = this.visit(call.args);
+ return call;
+};
+
+/**
+ * Lookup property `name`.
+ *
+ * @param {String} name
+ * @return {Property}
+ * @api private
+ */
+
+Evaluator.prototype.lookupProperty = function(name){
+ var i = this.stack.length
+ , index = this.currentBlock.index
+ , top = i
+ , nodes
+ , block
+ , len
+ , other;
+
+ while (i--) {
+ block = this.stack[i].block;
+ if (!block.node) continue;
+ switch (block.node.nodeName) {
+ case 'group':
+ case 'function':
+ case 'if':
+ case 'each':
+ case 'atrule':
+ case 'media':
+ case 'atblock':
+ case 'call':
+ nodes = block.nodes;
+ // scan siblings from the property index up
+ if (i + 1 == top) {
+ while (index--) {
+ // ignore current property
+ if (this.property == nodes[index]) continue;
+ other = this.interpolate(nodes[index]);
+ if (name == other) return nodes[index].clone();
+ }
+ // sequential lookup for non-siblings (for now)
+ } else {
+ len = nodes.length;
+ while (len--) {
+ if ('property' != nodes[len].nodeName
+ || this.property == nodes[len]) continue;
+ other = this.interpolate(nodes[len]);
+ if (name == other) return nodes[len].clone();
+ }
+ }
+ break;
+ }
+ }
+
+ return nodes.null;
+};
+
+/**
+ * Return the closest mixin-able `Block`.
+ *
+ * @return {Block}
+ * @api private
+ */
+
+Evaluator.prototype.__defineGetter__('closestBlock', function(){
+ var i = this.stack.length
+ , block;
+ while (i--) {
+ block = this.stack[i].block;
+ if (block.node) {
+ switch (block.node.nodeName) {
+ case 'group':
+ case 'keyframes':
+ case 'atrule':
+ case 'atblock':
+ case 'media':
+ case 'call':
+ return block;
+ }
+ }
+ }
+});
+
+/**
+ * Return the closest group block.
+ *
+ * @return {Block}
+ * @api private
+ */
+
+Evaluator.prototype.__defineGetter__('closestGroup', function(){
+ var i = this.stack.length
+ , block;
+ while (i--) {
+ block = this.stack[i].block;
+ if (block.node && 'group' == block.node.nodeName) {
+ return block;
+ }
+ }
+});
+
+/**
+ * Return the current selectors stack.
+ *
+ * @return {Array}
+ * @api private
+ */
+
+Evaluator.prototype.__defineGetter__('selectorStack', function(){
+ var block
+ , stack = [];
+ for (var i = 0, len = this.stack.length; i < len; ++i) {
+ block = this.stack[i].block;
+ if (block.node && 'group' == block.node.nodeName) {
+ block.node.nodes.forEach(function(selector) {
+ if (!selector.val) selector.val = this.interpolate(selector);
+ }, this);
+ stack.push(block.node.nodes);
+ }
+ }
+ return stack;
+});
+
+/**
+ * Lookup `name`, with support for JavaScript
+ * functions, and BIFs.
+ *
+ * @param {String} name
+ * @return {Node}
+ * @api private
+ */
+
+Evaluator.prototype.lookup = function(name){
+ var val;
+ if (this.ignoreColors && name in colors) return;
+ if (val = this.stack.lookup(name)) {
+ return utils.unwrap(val);
+ } else {
+ return this.lookupFunction(name);
+ }
+};
+
+/**
+ * Map segments in `node` returning a string.
+ *
+ * @param {Node} node
+ * @return {String}
+ * @api private
+ */
+
+Evaluator.prototype.interpolate = function(node){
+ var self = this
+ , isSelector = ('selector' == node.nodeName);
+ function toString(node) {
+ switch (node.nodeName) {
+ case 'function':
+ case 'ident':
+ return node.name;
+ case 'literal':
+ case 'string':
+ if (self.prefix && !node.prefixed && !node.val.nodeName) {
+ node.val = node.val.replace(/\./g, '.' + self.prefix);
+ node.prefixed = true;
+ }
+ return node.val;
+ case 'unit':
+ // Interpolation inside keyframes
+ return '%' == node.type ? node.val + '%' : node.val;
+ case 'member':
+ return toString(self.visit(node));
+ case 'expression':
+ // Prevent cyclic `selector()` calls.
+ if (self.calling && ~self.calling.indexOf('selector') && self._selector) return self._selector;
+ self.return++;
+ var ret = toString(self.visit(node).first);
+ self.return--;
+ if (isSelector) self._selector = ret;
+ return ret;
+ }
+ }
+
+ if (node.segments) {
+ return node.segments.map(toString).join('');
+ } else {
+ return toString(node);
+ }
+};
+
+/**
+ * Lookup JavaScript user-defined or built-in function.
+ *
+ * @param {String} name
+ * @return {Function}
+ * @api private
+ */
+
+Evaluator.prototype.lookupFunction = function(name){
+ var fn = this.functions[name] || bifs[name];
+ if (fn) return new nodes.Function(name, fn);
+};
+
+/**
+ * Check if the given `node` is an ident, and if it is defined.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ * @api private
+ */
+
+Evaluator.prototype.isDefined = function(node){
+ if ('ident' == node.nodeName) {
+ return nodes.Boolean(this.lookup(node.name));
+ } else {
+ throw new Error('invalid "is defined" check on non-variable ' + node);
+ }
+};
+
+/**
+ * Return `Expression` based on the given `prop`,
+ * replacing cyclic calls to the given function `name`
+ * with "__CALL__".
+ *
+ * @param {Property} prop
+ * @param {String} name
+ * @return {Expression}
+ * @api private
+ */
+
+Evaluator.prototype.propertyExpression = function(prop, name){
+ var expr = new nodes.Expression
+ , val = prop.expr.clone();
+
+ // name
+ expr.push(new nodes.String(prop.name));
+
+ // replace cyclic call with __CALL__
+ function replace(node) {
+ if ('call' == node.nodeName && name == node.name) {
+ return new nodes.Literal('__CALL__');
+ }
+
+ if (node.nodes) node.nodes = node.nodes.map(replace);
+ return node;
+ }
+
+ replace(val);
+ expr.push(val);
+ return expr;
+};
+
+/**
+ * Cast `expr` to the trailing ident.
+ *
+ * @param {Expression} expr
+ * @return {Unit}
+ * @api private
+ */
+
+Evaluator.prototype.cast = function(expr){
+ return new nodes.Unit(expr.first.val, expr.nodes[1].name);
+};
+
+/**
+ * Check if `expr` is castable.
+ *
+ * @param {Expression} expr
+ * @return {Boolean}
+ * @api private
+ */
+
+Evaluator.prototype.castable = function(expr){
+ return 2 == expr.nodes.length
+ && 'unit' == expr.first.nodeName
+ && ~units.indexOf(expr.nodes[1].name);
+};
+
+/**
+ * Warn with the given `msg`.
+ *
+ * @param {String} msg
+ * @api private
+ */
+
+Evaluator.prototype.warn = function(msg){
+ if (!this.warnings) return;
+ console.warn('\u001b[33mWarning:\u001b[0m ' + msg);
+};
+
+/**
+ * Return the current `Block`.
+ *
+ * @return {Block}
+ * @api private
+ */
+
+Evaluator.prototype.__defineGetter__('currentBlock', function(){
+ return this.stack.currentFrame.block;
+});
+
+/**
+ * Return an array of vendor names.
+ *
+ * @return {Array}
+ * @api private
+ */
+
+Evaluator.prototype.__defineGetter__('vendors', function(){
+ return this.lookup('vendors').nodes.map(function(node){
+ return node.string;
+ });
+});
+
+/**
+ * Return the property name without vendor prefix.
+ *
+ * @param {String} prop
+ * @return {String}
+ * @api public
+ */
+
+Evaluator.prototype.unvendorize = function(prop){
+ for (var i = 0, len = this.vendors.length; i < len; i++) {
+ if ('official' != this.vendors[i]) {
+ var vendor = '-' + this.vendors[i] + '-';
+ if (~prop.indexOf(vendor)) return prop.replace(vendor, '');
+ }
+ }
+ return prop;
+};
+
+/**
+ * Return the current frame `Scope`.
+ *
+ * @return {Scope}
+ * @api private
+ */
+
+Evaluator.prototype.__defineGetter__('currentScope', function(){
+ return this.stack.currentFrame.scope;
+});
+
+/**
+ * Return the current `Frame`.
+ *
+ * @return {Frame}
+ * @api private
+ */
+
+Evaluator.prototype.__defineGetter__('currentFrame', function(){
+ return this.stack.currentFrame;
+});
diff --git a/node_modules/stylus/lib/visitor/index.js b/node_modules/stylus/lib/visitor/index.js
new file mode 100644
index 00000000..b7f3ce3f
--- /dev/null
+++ b/node_modules/stylus/lib/visitor/index.js
@@ -0,0 +1,31 @@
+
+/*!
+ * Stylus - Visitor
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Initialize a new `Visitor` with the given `root` Node.
+ *
+ * @param {Node} root
+ * @api private
+ */
+
+var Visitor = module.exports = function Visitor(root) {
+ this.root = root;
+};
+
+/**
+ * Visit the given `node`.
+ *
+ * @param {Node|Array} node
+ * @api public
+ */
+
+Visitor.prototype.visit = function(node, fn){
+ var method = 'visit' + node.constructor.name;
+ if (this[method]) return this[method](node);
+ return node;
+};
+
diff --git a/node_modules/stylus/lib/visitor/normalizer.js b/node_modules/stylus/lib/visitor/normalizer.js
new file mode 100644
index 00000000..2d67ddfb
--- /dev/null
+++ b/node_modules/stylus/lib/visitor/normalizer.js
@@ -0,0 +1,424 @@
+
+/*!
+ * Stylus - Normalizer
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Visitor = require('./')
+ , nodes = require('../nodes')
+ , utils = require('../utils');
+
+/**
+ * Initialize a new `Normalizer` with the given `root` Node.
+ *
+ * This visitor implements the first stage of the duel-stage
+ * compiler, tasked with stripping the "garbage" from
+ * the evaluated nodes, ditching null rules, resolving
+ * ruleset selectors etc. This step performs the logic
+ * necessary to facilitate the "@extend" functionality,
+ * as these must be resolved _before_ buffering output.
+ *
+ * @param {Node} root
+ * @api public
+ */
+
+var Normalizer = module.exports = function Normalizer(root, options) {
+ options = options || {};
+ Visitor.call(this, root);
+ this.hoist = options['hoist atrules'];
+ this.stack = [];
+ this.map = {};
+ this.imports = [];
+};
+
+/**
+ * Inherit from `Visitor.prototype`.
+ */
+
+Normalizer.prototype.__proto__ = Visitor.prototype;
+
+/**
+ * Normalize the node tree.
+ *
+ * @return {Node}
+ * @api private
+ */
+
+Normalizer.prototype.normalize = function(){
+ var ret = this.visit(this.root);
+
+ if (this.hoist) {
+ // hoist @import
+ if (this.imports.length) ret.nodes = this.imports.concat(ret.nodes);
+
+ // hoist @charset
+ if (this.charset) ret.nodes = [this.charset].concat(ret.nodes);
+ }
+
+ return ret;
+};
+
+/**
+ * Bubble up the given `node`.
+ *
+ * @param {Node} node
+ * @api private
+ */
+
+Normalizer.prototype.bubble = function(node){
+ var props = []
+ , other = []
+ , self = this;
+
+ function filterProps(block) {
+ block.nodes.forEach(function(node) {
+ node = self.visit(node);
+
+ switch (node.nodeName) {
+ case 'property':
+ props.push(node);
+ break;
+ case 'block':
+ filterProps(node);
+ break;
+ default:
+ other.push(node);
+ }
+ });
+ }
+
+ filterProps(node.block);
+
+ if (props.length) {
+ var selector = new nodes.Selector([new nodes.Literal('&')]);
+ selector.lineno = node.lineno;
+ selector.column = node.column;
+ selector.filename = node.filename;
+ selector.val = '&';
+
+ var group = new nodes.Group;
+ group.lineno = node.lineno;
+ group.column = node.column;
+ group.filename = node.filename;
+
+ var block = new nodes.Block(node.block, group);
+ block.lineno = node.lineno;
+ block.column = node.column;
+ block.filename = node.filename;
+
+ props.forEach(function(prop){
+ block.push(prop);
+ });
+
+ group.push(selector);
+ group.block = block;
+
+ node.block.nodes = [];
+ node.block.push(group);
+ other.forEach(function(n){
+ node.block.push(n);
+ });
+
+ var group = this.closestGroup(node.block);
+ if (group) node.group = group.clone();
+
+ node.bubbled = true;
+ }
+};
+
+/**
+ * Return group closest to the given `block`.
+ *
+ * @param {Block} block
+ * @return {Group}
+ * @api private
+ */
+
+Normalizer.prototype.closestGroup = function(block){
+ var parent = block.parent
+ , node;
+ while (parent && (node = parent.node)) {
+ if ('group' == node.nodeName) return node;
+ parent = node.block && node.block.parent;
+ }
+};
+
+/**
+ * Visit Root.
+ */
+
+Normalizer.prototype.visitRoot = function(block){
+ var ret = new nodes.Root
+ , node;
+
+ for (var i = 0; i < block.nodes.length; ++i) {
+ node = block.nodes[i];
+ switch (node.nodeName) {
+ case 'null':
+ case 'expression':
+ case 'function':
+ case 'unit':
+ case 'atblock':
+ continue;
+ default:
+ this.rootIndex = i;
+ ret.push(this.visit(node));
+ }
+ }
+
+ return ret;
+};
+
+/**
+ * Visit Property.
+ */
+
+Normalizer.prototype.visitProperty = function(prop){
+ this.visit(prop.expr);
+ return prop;
+};
+
+/**
+ * Visit Expression.
+ */
+
+Normalizer.prototype.visitExpression = function(expr){
+ expr.nodes = expr.nodes.map(function(node){
+ // returns `block` literal if mixin's block
+ // is used as part of a property value
+ if ('block' == node.nodeName) {
+ var literal = new nodes.Literal('block');
+ literal.lineno = expr.lineno;
+ literal.column = expr.column;
+ return literal;
+ }
+ return node;
+ });
+ return expr;
+};
+
+/**
+ * Visit Block.
+ */
+
+Normalizer.prototype.visitBlock = function(block){
+ var node;
+
+ if (block.hasProperties) {
+ for (var i = 0, len = block.nodes.length; i < len; ++i) {
+ node = block.nodes[i];
+ switch (node.nodeName) {
+ case 'null':
+ case 'expression':
+ case 'function':
+ case 'group':
+ case 'unit':
+ case 'atblock':
+ continue;
+ default:
+ block.nodes[i] = this.visit(node);
+ }
+ }
+ }
+
+ // nesting
+ for (var i = 0, len = block.nodes.length; i < len; ++i) {
+ node = block.nodes[i];
+ block.nodes[i] = this.visit(node);
+ }
+
+ return block;
+};
+
+/**
+ * Visit Group.
+ */
+
+Normalizer.prototype.visitGroup = function(group){
+ var stack = this.stack
+ , map = this.map
+ , parts;
+
+ // normalize interpolated selectors with comma
+ group.nodes.forEach(function(selector, i){
+ if (!~selector.val.indexOf(',')) return;
+ if (~selector.val.indexOf('\\,')) {
+ selector.val = selector.val.replace(/\\,/g, ',');
+ return;
+ }
+ parts = selector.val.split(',');
+ var root = '/' == selector.val.charAt(0)
+ , part, s;
+ for (var k = 0, len = parts.length; k < len; ++k){
+ part = parts[k].trim();
+ if (root && k > 0 && !~part.indexOf('&')) {
+ part = '/' + part;
+ }
+ s = new nodes.Selector([new nodes.Literal(part)]);
+ s.val = part;
+ s.block = group.block;
+ group.nodes[i++] = s;
+ }
+ });
+ stack.push(group.nodes);
+
+ var selectors = utils.compileSelectors(stack, true);
+
+ // map for extension lookup
+ selectors.forEach(function(selector){
+ map[selector] = map[selector] || [];
+ map[selector].push(group);
+ });
+
+ // extensions
+ this.extend(group, selectors);
+
+ stack.pop();
+ return group;
+};
+
+/**
+ * Visit Function.
+ */
+
+Normalizer.prototype.visitFunction = function(){
+ return nodes.null;
+};
+
+/**
+ * Visit Media.
+ */
+
+Normalizer.prototype.visitMedia = function(media){
+ var medias = []
+ , group = this.closestGroup(media.block)
+ , parent;
+
+ function mergeQueries(block) {
+ block.nodes.forEach(function(node, i){
+ switch (node.nodeName) {
+ case 'media':
+ node.val = media.val.merge(node.val);
+ medias.push(node);
+ block.nodes[i] = nodes.null;
+ break;
+ case 'block':
+ mergeQueries(node);
+ break;
+ default:
+ if (node.block && node.block.nodes)
+ mergeQueries(node.block);
+ }
+ });
+ }
+
+ mergeQueries(media.block);
+ this.bubble(media);
+
+ if (medias.length) {
+ medias.forEach(function(node){
+ if (group) {
+ group.block.push(node);
+ } else {
+ this.root.nodes.splice(++this.rootIndex, 0, node);
+ }
+ node = this.visit(node);
+ parent = node.block.parent;
+ if (node.bubbled && (!group || 'group' == parent.node.nodeName)) {
+ node.group.block = node.block.nodes[0].block;
+ node.block.nodes[0] = node.group;
+ }
+ }, this);
+ }
+ return media;
+};
+
+/**
+ * Visit Supports.
+ */
+
+Normalizer.prototype.visitSupports = function(node){
+ this.bubble(node);
+ return node;
+};
+
+/**
+ * Visit Atrule.
+ */
+
+Normalizer.prototype.visitAtrule = function(node){
+ if (node.block) node.block = this.visit(node.block);
+ return node;
+};
+
+/**
+ * Visit Keyframes.
+ */
+
+Normalizer.prototype.visitKeyframes = function(node){
+ var frames = node.block.nodes.filter(function(frame){
+ return frame.block && frame.block.hasProperties;
+ });
+ node.frames = frames.length;
+ return node;
+};
+
+/**
+ * Visit Import.
+ */
+
+Normalizer.prototype.visitImport = function(node){
+ this.imports.push(node);
+ return this.hoist ? nodes.null : node;
+};
+
+/**
+ * Visit Charset.
+ */
+
+Normalizer.prototype.visitCharset = function(node){
+ this.charset = node;
+ return this.hoist ? nodes.null : node;
+};
+
+/**
+ * Apply `group` extensions.
+ *
+ * @param {Group} group
+ * @param {Array} selectors
+ * @api private
+ */
+
+Normalizer.prototype.extend = function(group, selectors){
+ var map = this.map
+ , self = this
+ , parent = this.closestGroup(group.block);
+
+ group.extends.forEach(function(extend){
+ var groups = map[extend.selector];
+ if (!groups) {
+ if (extend.optional) return;
+ var err = new Error('Failed to @extend "' + extend.selector + '"');
+ err.lineno = extend.lineno;
+ err.column = extend.column;
+ throw err;
+ }
+ selectors.forEach(function(selector){
+ var node = new nodes.Selector;
+ node.val = selector;
+ node.inherits = false;
+ groups.forEach(function(group){
+ // prevent recursive extend
+ if (!parent || (parent != group)) self.extend(group, selectors);
+ group.push(node);
+ });
+ });
+ });
+
+ group.block = this.visit(group.block);
+};
diff --git a/node_modules/stylus/lib/visitor/sourcemapper.js b/node_modules/stylus/lib/visitor/sourcemapper.js
new file mode 100644
index 00000000..dcb85bba
--- /dev/null
+++ b/node_modules/stylus/lib/visitor/sourcemapper.js
@@ -0,0 +1,203 @@
+/*!
+ * Stylus - SourceMapper
+ * Copyright (c) Automattic <developer.wordpress.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var Compiler = require('./compiler')
+ , SourceMapGenerator = require('source-map').SourceMapGenerator
+ , basename = require('path').basename
+ , extname = require('path').extname
+ , dirname = require('path').dirname
+ , join = require('path').join
+ , relative = require('path').relative
+ , sep = require('path').sep
+ , fs = require('fs');
+
+/**
+ * Initialize a new `SourceMapper` generator with the given `root` Node
+ * and the following `options`.
+ *
+ * @param {Node} root
+ * @api public
+ */
+
+var SourceMapper = module.exports = function SourceMapper(root, options){
+ options = options || {};
+ this.column = 1;
+ this.lineno = 1;
+ this.contents = {};
+ this.filename = options.filename;
+ this.dest = options.dest;
+
+ var sourcemap = options.sourcemap;
+ this.basePath = sourcemap.basePath || '.';
+ this.inline = sourcemap.inline;
+ this.comment = sourcemap.comment;
+ if (this.dest && extname(this.dest) === '.css') {
+ this.basename = basename(this.dest);
+ this.dest = dirname(this.dest);
+ } else {
+ this.basename = basename(this.filename, extname(this.filename)) + '.css';
+ }
+ this.utf8 = false;
+
+ this.map = new SourceMapGenerator({
+ file: this.basename,
+ sourceRoot: sourcemap.sourceRoot || null
+ });
+ Compiler.call(this, root, options);
+};
+
+/**
+ * Inherit from `Compiler.prototype`.
+ */
+
+SourceMapper.prototype.__proto__ = Compiler.prototype;
+
+/**
+ * Generate and write source map.
+ *
+ * @return {String}
+ * @api private
+ */
+
+var compile = Compiler.prototype.compile;
+SourceMapper.prototype.compile = function(){
+ var css = compile.call(this)
+ , out = this.basename + '.map'
+ , url = this.normalizePath(this.dest
+ ? join(this.dest, out)
+ : join(dirname(this.filename), out))
+ , map;
+
+ if (this.inline) {
+ map = this.map.toString();
+ url = 'data:application/json;'
+ + (this.utf8 ? 'charset=utf-8;' : '') + 'base64,'
+ + new Buffer(map).toString('base64');
+ }
+ if (this.inline || false !== this.comment)
+ css += '/*# sourceMappingURL=' + url + ' */';
+ return css;
+};
+
+/**
+ * Add mapping information.
+ *
+ * @param {String} str
+ * @param {Node} node
+ * @return {String}
+ * @api private
+ */
+
+SourceMapper.prototype.out = function(str, node){
+ if (node && node.lineno) {
+ var filename = this.normalizePath(node.filename);
+
+ this.map.addMapping({
+ original: {
+ line: node.lineno,
+ column: node.column - 1
+ },
+ generated: {
+ line: this.lineno,
+ column: this.column - 1
+ },
+ source: filename
+ });
+
+ if (this.inline && !this.contents[filename]) {
+ this.map.setSourceContent(filename, fs.readFileSync(node.filename, 'utf-8'));
+ this.contents[filename] = true;
+ }
+ }
+
+ this.move(str);
+ return str;
+};
+
+/**
+ * Move current line and column position.
+ *
+ * @param {String} str
+ * @api private
+ */
+
+SourceMapper.prototype.move = function(str){
+ var lines = str.match(/\n/g)
+ , idx = str.lastIndexOf('\n');
+
+ if (lines) this.lineno += lines.length;
+ this.column = ~idx
+ ? str.length - idx
+ : this.column + str.length;
+};
+
+/**
+ * Normalize the given `path`.
+ *
+ * @param {String} path
+ * @return {String}
+ * @api private
+ */
+
+SourceMapper.prototype.normalizePath = function(path){
+ path = relative(this.dest || this.basePath, path);
+ if ('\\' == sep) {
+ path = path.replace(/^[a-z]:\\/i, '/')
+ .replace(/\\/g, '/');
+ }
+ return path;
+};
+
+/**
+ * Visit Literal.
+ */
+
+var literal = Compiler.prototype.visitLiteral;
+SourceMapper.prototype.visitLiteral = function(lit){
+ var val = literal.call(this, lit)
+ , filename = this.normalizePath(lit.filename)
+ , indentsRe = /^\s+/
+ , lines = val.split('\n');
+
+ // add mappings for multiline literals
+ if (lines.length > 1) {
+ lines.forEach(function(line, i) {
+ var indents = line.match(indentsRe)
+ , column = indents && indents[0]
+ ? indents[0].length
+ : 0;
+
+ if (lit.css) column += 2;
+
+ this.map.addMapping({
+ original: {
+ line: lit.lineno + i,
+ column: column
+ },
+ generated: {
+ line: this.lineno + i,
+ column: 0
+ },
+ source: filename
+ });
+ }, this);
+ }
+ return val;
+};
+
+/**
+ * Visit Charset.
+ */
+
+var charset = Compiler.prototype.visitCharset;
+SourceMapper.prototype.visitCharset = function(node){
+ this.utf8 = ('utf-8' == node.val.string.toLowerCase());
+ return charset.call(this, node);
+};
diff --git a/node_modules/stylus/node_modules/.bin/mkdirp b/node_modules/stylus/node_modules/.bin/mkdirp
new file mode 120000
index 00000000..91a5f623
--- /dev/null
+++ b/node_modules/stylus/node_modules/.bin/mkdirp
@@ -0,0 +1 @@
+../../../mkdirp/bin/cmd.js \ No newline at end of file
diff --git a/node_modules/stylus/node_modules/debug/CHANGELOG.md b/node_modules/stylus/node_modules/debug/CHANGELOG.md
new file mode 100644
index 00000000..820d21e3
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/CHANGELOG.md
@@ -0,0 +1,395 @@
+
+3.1.0 / 2017-09-26
+==================
+
+ * Add `DEBUG_HIDE_DATE` env var (#486)
+ * Remove ReDoS regexp in %o formatter (#504)
+ * Remove "component" from package.json
+ * Remove `component.json`
+ * Ignore package-lock.json
+ * Examples: fix colors printout
+ * Fix: browser detection
+ * Fix: spelling mistake (#496, @EdwardBetts)
+
+3.0.1 / 2017-08-24
+==================
+
+ * Fix: Disable colors in Edge and Internet Explorer (#489)
+
+3.0.0 / 2017-08-08
+==================
+
+ * Breaking: Remove DEBUG_FD (#406)
+ * Breaking: Use `Date#toISOString()` instead to `Date#toUTCString()` when output is not a TTY (#418)
+ * Breaking: Make millisecond timer namespace specific and allow 'always enabled' output (#408)
+ * Addition: document `enabled` flag (#465)
+ * Addition: add 256 colors mode (#481)
+ * Addition: `enabled()` updates existing debug instances, add `destroy()` function (#440)
+ * Update: component: update "ms" to v2.0.0
+ * Update: separate the Node and Browser tests in Travis-CI
+ * Update: refactor Readme, fixed documentation, added "Namespace Colors" section, redid screenshots
+ * Update: separate Node.js and web browser examples for organization
+ * Update: update "browserify" to v14.4.0
+ * Fix: fix Readme typo (#473)
+
+2.6.9 / 2017-09-22
+==================
+
+ * remove ReDoS regexp in %o formatter (#504)
+
+2.6.8 / 2017-05-18
+==================
+
+ * Fix: Check for undefined on browser globals (#462, @marbemac)
+
+2.6.7 / 2017-05-16
+==================
+
+ * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)
+ * Fix: Inline extend function in node implementation (#452, @dougwilson)
+ * Docs: Fix typo (#455, @msasad)
+
+2.6.5 / 2017-04-27
+==================
+
+ * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)
+ * Misc: clean up browser reference checks (#447, @thebigredgeek)
+ * Misc: add npm-debug.log to .gitignore (@thebigredgeek)
+
+
+2.6.4 / 2017-04-20
+==================
+
+ * Fix: bug that would occur if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)
+ * Chore: ignore bower.json in npm installations. (#437, @joaovieira)
+ * Misc: update "ms" to v0.7.3 (@tootallnate)
+
+2.6.3 / 2017-03-13
+==================
+
+ * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts)
+ * Docs: Changelog fix (@thebigredgeek)
+
+2.6.2 / 2017-03-10
+==================
+
+ * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)
+ * Docs: Add backers and sponsors from Open Collective (#422, @piamancini)
+ * Docs: Add Slackin invite badge (@tootallnate)
+
+2.6.1 / 2017-02-10
+==================
+
+ * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error
+ * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)
+ * Fix: IE8 "Expected identifier" error (#414, @vgoma)
+ * Fix: Namespaces would not disable once enabled (#409, @musikov)
+
+2.6.0 / 2016-12-28
+==================
+
+ * Fix: added better null pointer checks for browser useColors (@thebigredgeek)
+ * Improvement: removed explicit `window.debug` export (#404, @tootallnate)
+ * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate)
+
+2.5.2 / 2016-12-25
+==================
+
+ * Fix: reference error on window within webworkers (#393, @KlausTrainer)
+ * Docs: fixed README typo (#391, @lurch)
+ * Docs: added notice about v3 api discussion (@thebigredgeek)
+
+2.5.1 / 2016-12-20
+==================
+
+ * Fix: babel-core compatibility
+
+2.5.0 / 2016-12-20
+==================
+
+ * Fix: wrong reference in bower file (@thebigredgeek)
+ * Fix: webworker compatibility (@thebigredgeek)
+ * Fix: output formatting issue (#388, @kribblo)
+ * Fix: babel-loader compatibility (#383, @escwald)
+ * Misc: removed built asset from repo and publications (@thebigredgeek)
+ * Misc: moved source files to /src (#378, @yamikuronue)
+ * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)
+ * Test: coveralls integration (#378, @yamikuronue)
+ * Docs: simplified language in the opening paragraph (#373, @yamikuronue)
+
+2.4.5 / 2016-12-17
+==================
+
+ * Fix: `navigator` undefined in Rhino (#376, @jochenberger)
+ * Fix: custom log function (#379, @hsiliev)
+ * Improvement: bit of cleanup + linting fixes (@thebigredgeek)
+ * Improvement: rm non-maintainted `dist/` dir (#375, @freewil)
+ * Docs: simplified language in the opening paragraph. (#373, @yamikuronue)
+
+2.4.4 / 2016-12-14
+==================
+
+ * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)
+
+2.4.3 / 2016-12-14
+==================
+
+ * Fix: navigation.userAgent error for react native (#364, @escwald)
+
+2.4.2 / 2016-12-14
+==================
+
+ * Fix: browser colors (#367, @tootallnate)
+ * Misc: travis ci integration (@thebigredgeek)
+ * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)
+
+2.4.1 / 2016-12-13
+==================
+
+ * Fix: typo that broke the package (#356)
+
+2.4.0 / 2016-12-13
+==================
+
+ * Fix: bower.json references unbuilt src entry point (#342, @justmatt)
+ * Fix: revert "handle regex special characters" (@tootallnate)
+ * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)
+ * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)
+ * Improvement: allow colors in workers (#335, @botverse)
+ * Improvement: use same color for same namespace. (#338, @lchenay)
+
+2.3.3 / 2016-11-09
+==================
+
+ * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne)
+ * Fix: Returning `localStorage` saved values (#331, Levi Thomason)
+ * Improvement: Don't create an empty object when no `process` (Nathan Rajlich)
+
+2.3.2 / 2016-11-09
+==================
+
+ * Fix: be super-safe in index.js as well (@TooTallNate)
+ * Fix: should check whether process exists (Tom Newby)
+
+2.3.1 / 2016-11-09
+==================
+
+ * Fix: Added electron compatibility (#324, @paulcbetts)
+ * Improvement: Added performance optimizations (@tootallnate)
+ * Readme: Corrected PowerShell environment variable example (#252, @gimre)
+ * Misc: Removed yarn lock file from source control (#321, @fengmk2)
+
+2.3.0 / 2016-11-07
+==================
+
+ * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)
+ * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)
+ * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)
+ * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)
+ * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom)
+ * Package: Update "ms" to 0.7.2 (#315, @DevSide)
+ * Package: removed superfluous version property from bower.json (#207 @kkirsche)
+ * Readme: fix USE_COLORS to DEBUG_COLORS
+ * Readme: Doc fixes for format string sugar (#269, @mlucool)
+ * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)
+ * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)
+ * Readme: better docs for browser support (#224, @matthewmueller)
+ * Tooling: Added yarn integration for development (#317, @thebigredgeek)
+ * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)
+ * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)
+ * Misc: Updated contributors (@thebigredgeek)
+
+2.2.0 / 2015-05-09
+==================
+
+ * package: update "ms" to v0.7.1 (#202, @dougwilson)
+ * README: add logging to file example (#193, @DanielOchoa)
+ * README: fixed a typo (#191, @amir-s)
+ * browser: expose `storage` (#190, @stephenmathieson)
+ * Makefile: add a `distclean` target (#189, @stephenmathieson)
+
+2.1.3 / 2015-03-13
+==================
+
+ * Updated stdout/stderr example (#186)
+ * Updated example/stdout.js to match debug current behaviour
+ * Renamed example/stderr.js to stdout.js
+ * Update Readme.md (#184)
+ * replace high intensity foreground color for bold (#182, #183)
+
+2.1.2 / 2015-03-01
+==================
+
+ * dist: recompile
+ * update "ms" to v0.7.0
+ * package: update "browserify" to v9.0.3
+ * component: fix "ms.js" repo location
+ * changed bower package name
+ * updated documentation about using debug in a browser
+ * fix: security error on safari (#167, #168, @yields)
+
+2.1.1 / 2014-12-29
+==================
+
+ * browser: use `typeof` to check for `console` existence
+ * browser: check for `console.log` truthiness (fix IE 8/9)
+ * browser: add support for Chrome apps
+ * Readme: added Windows usage remarks
+ * Add `bower.json` to properly support bower install
+
+2.1.0 / 2014-10-15
+==================
+
+ * node: implement `DEBUG_FD` env variable support
+ * package: update "browserify" to v6.1.0
+ * package: add "license" field to package.json (#135, @panuhorsmalahti)
+
+2.0.0 / 2014-09-01
+==================
+
+ * package: update "browserify" to v5.11.0
+ * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
+
+1.0.4 / 2014-07-15
+==================
+
+ * dist: recompile
+ * example: remove `console.info()` log usage
+ * example: add "Content-Type" UTF-8 header to browser example
+ * browser: place %c marker after the space character
+ * browser: reset the "content" color via `color: inherit`
+ * browser: add colors support for Firefox >= v31
+ * debug: prefer an instance `log()` function over the global one (#119)
+ * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
+
+1.0.3 / 2014-07-09
+==================
+
+ * Add support for multiple wildcards in namespaces (#122, @seegno)
+ * browser: fix lint
+
+1.0.2 / 2014-06-10
+==================
+
+ * browser: update color palette (#113, @gscottolson)
+ * common: make console logging function configurable (#108, @timoxley)
+ * node: fix %o colors on old node <= 0.8.x
+ * Makefile: find node path using shell/which (#109, @timoxley)
+
+1.0.1 / 2014-06-06
+==================
+
+ * browser: use `removeItem()` to clear localStorage
+ * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
+ * package: add "contributors" section
+ * node: fix comment typo
+ * README: list authors
+
+1.0.0 / 2014-06-04
+==================
+
+ * make ms diff be global, not be scope
+ * debug: ignore empty strings in enable()
+ * node: make DEBUG_COLORS able to disable coloring
+ * *: export the `colors` array
+ * npmignore: don't publish the `dist` dir
+ * Makefile: refactor to use browserify
+ * package: add "browserify" as a dev dependency
+ * Readme: add Web Inspector Colors section
+ * node: reset terminal color for the debug content
+ * node: map "%o" to `util.inspect()`
+ * browser: map "%j" to `JSON.stringify()`
+ * debug: add custom "formatters"
+ * debug: use "ms" module for humanizing the diff
+ * Readme: add "bash" syntax highlighting
+ * browser: add Firebug color support
+ * browser: add colors for WebKit browsers
+ * node: apply log to `console`
+ * rewrite: abstract common logic for Node & browsers
+ * add .jshintrc file
+
+0.8.1 / 2014-04-14
+==================
+
+ * package: re-add the "component" section
+
+0.8.0 / 2014-03-30
+==================
+
+ * add `enable()` method for nodejs. Closes #27
+ * change from stderr to stdout
+ * remove unnecessary index.js file
+
+0.7.4 / 2013-11-13
+==================
+
+ * remove "browserify" key from package.json (fixes something in browserify)
+
+0.7.3 / 2013-10-30
+==================
+
+ * fix: catch localStorage security error when cookies are blocked (Chrome)
+ * add debug(err) support. Closes #46
+ * add .browser prop to package.json. Closes #42
+
+0.7.2 / 2013-02-06
+==================
+
+ * fix package.json
+ * fix: Mobile Safari (private mode) is broken with debug
+ * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
+
+0.7.1 / 2013-02-05
+==================
+
+ * add repository URL to package.json
+ * add DEBUG_COLORED to force colored output
+ * add browserify support
+ * fix component. Closes #24
+
+0.7.0 / 2012-05-04
+==================
+
+ * Added .component to package.json
+ * Added debug.component.js build
+
+0.6.0 / 2012-03-16
+==================
+
+ * Added support for "-" prefix in DEBUG [Vinay Pulim]
+ * Added `.enabled` flag to the node version [TooTallNate]
+
+0.5.0 / 2012-02-02
+==================
+
+ * Added: humanize diffs. Closes #8
+ * Added `debug.disable()` to the CS variant
+ * Removed padding. Closes #10
+ * Fixed: persist client-side variant again. Closes #9
+
+0.4.0 / 2012-02-01
+==================
+
+ * Added browser variant support for older browsers [TooTallNate]
+ * Added `debug.enable('project:*')` to browser variant [TooTallNate]
+ * Added padding to diff (moved it to the right)
+
+0.3.0 / 2012-01-26
+==================
+
+ * Added millisecond diff when isatty, otherwise UTC string
+
+0.2.0 / 2012-01-22
+==================
+
+ * Added wildcard support
+
+0.1.0 / 2011-12-02
+==================
+
+ * Added: remove colors unless stderr isatty [TooTallNate]
+
+0.0.1 / 2010-01-03
+==================
+
+ * Initial release
diff --git a/node_modules/stylus/node_modules/debug/LICENSE b/node_modules/stylus/node_modules/debug/LICENSE
new file mode 100644
index 00000000..658c933d
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/LICENSE
@@ -0,0 +1,19 @@
+(The MIT License)
+
+Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the 'Software'), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/node_modules/stylus/node_modules/debug/README.md b/node_modules/stylus/node_modules/debug/README.md
new file mode 100644
index 00000000..88dae35d
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/README.md
@@ -0,0 +1,455 @@
+# debug
+[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)
+[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
+
+A tiny JavaScript debugging utility modelled after Node.js core's debugging
+technique. Works in Node.js and web browsers.
+
+## Installation
+
+```bash
+$ npm install debug
+```
+
+## Usage
+
+`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
+
+Example [_app.js_](./examples/node/app.js):
+
+```js
+var debug = require('debug')('http')
+ , http = require('http')
+ , name = 'My App';
+
+// fake app
+
+debug('booting %o', name);
+
+http.createServer(function(req, res){
+ debug(req.method + ' ' + req.url);
+ res.end('hello\n');
+}).listen(3000, function(){
+ debug('listening');
+});
+
+// fake worker of some kind
+
+require('./worker');
+```
+
+Example [_worker.js_](./examples/node/worker.js):
+
+```js
+var a = require('debug')('worker:a')
+ , b = require('debug')('worker:b');
+
+function work() {
+ a('doing lots of uninteresting work');
+ setTimeout(work, Math.random() * 1000);
+}
+
+work();
+
+function workb() {
+ b('doing some work');
+ setTimeout(workb, Math.random() * 2000);
+}
+
+workb();
+```
+
+The `DEBUG` environment variable is then used to enable these based on space or
+comma-delimited names.
+
+Here are some examples:
+
+<img width="647" alt="screen shot 2017-08-08 at 12 53 04 pm" src="https://user-images.githubusercontent.com/71256/29091703-a6302cdc-7c38-11e7-8304-7c0b3bc600cd.png">
+<img width="647" alt="screen shot 2017-08-08 at 12 53 38 pm" src="https://user-images.githubusercontent.com/71256/29091700-a62a6888-7c38-11e7-800b-db911291ca2b.png">
+<img width="647" alt="screen shot 2017-08-08 at 12 53 25 pm" src="https://user-images.githubusercontent.com/71256/29091701-a62ea114-7c38-11e7-826a-2692bedca740.png">
+
+#### Windows command prompt notes
+
+##### CMD
+
+On Windows the environment variable is set using the `set` command.
+
+```cmd
+set DEBUG=*,-not_this
+```
+
+Example:
+
+```cmd
+set DEBUG=* & node app.js
+```
+
+##### PowerShell (VS Code default)
+
+PowerShell uses different syntax to set environment variables.
+
+```cmd
+$env:DEBUG = "*,-not_this"
+```
+
+Example:
+
+```cmd
+$env:DEBUG='app';node app.js
+```
+
+Then, run the program to be debugged as usual.
+
+npm script example:
+```js
+ "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js",
+```
+
+## Namespace Colors
+
+Every debug instance has a color generated for it based on its namespace name.
+This helps when visually parsing the debug output to identify which debug instance
+a debug line belongs to.
+
+#### Node.js
+
+In Node.js, colors are enabled when stderr is a TTY. You also _should_ install
+the [`supports-color`](https://npmjs.org/supports-color) module alongside debug,
+otherwise debug will only use a small handful of basic colors.
+
+<img width="521" src="https://user-images.githubusercontent.com/71256/29092181-47f6a9e6-7c3a-11e7-9a14-1928d8a711cd.png">
+
+#### Web Browser
+
+Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
+option. These are WebKit web inspectors, Firefox ([since version
+31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
+and the Firebug plugin for Firefox (any version).
+
+<img width="524" src="https://user-images.githubusercontent.com/71256/29092033-b65f9f2e-7c39-11e7-8e32-f6f0d8e865c1.png">
+
+
+## Millisecond diff
+
+When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
+
+When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below:
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091956-6bd78372-7c39-11e7-8c55-c948396d6edd.png">
+
+
+## Conventions
+
+If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output.
+
+## Wildcards
+
+The `*` character may be used as a wildcard. Suppose for example your library has
+debuggers named "connect:bodyParser", "connect:compress", "connect:session",
+instead of listing all three with
+`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do
+`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
+
+You can also exclude specific debuggers by prefixing them with a "-" character.
+For example, `DEBUG=*,-connect:*` would include all debuggers except those
+starting with "connect:".
+
+## Environment Variables
+
+When running through Node.js, you can set a few environment variables that will
+change the behavior of the debug logging:
+
+| Name | Purpose |
+|-----------|-------------------------------------------------|
+| `DEBUG` | Enables/disables specific debugging namespaces. |
+| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). |
+| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
+| `DEBUG_DEPTH` | Object inspection depth. |
+| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
+
+
+__Note:__ The environment variables beginning with `DEBUG_` end up being
+converted into an Options object that gets used with `%o`/`%O` formatters.
+See the Node.js documentation for
+[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
+for the complete list.
+
+## Formatters
+
+Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting.
+Below are the officially supported formatters:
+
+| Formatter | Representation |
+|-----------|----------------|
+| `%O` | Pretty-print an Object on multiple lines. |
+| `%o` | Pretty-print an Object all on a single line. |
+| `%s` | String. |
+| `%d` | Number (both integer and float). |
+| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
+| `%%` | Single percent sign ('%'). This does not consume an argument. |
+
+
+### Custom formatters
+
+You can add custom formatters by extending the `debug.formatters` object.
+For example, if you wanted to add support for rendering a Buffer as hex with
+`%h`, you could do something like:
+
+```js
+const createDebug = require('debug')
+createDebug.formatters.h = (v) => {
+ return v.toString('hex')
+}
+
+// …elsewhere
+const debug = createDebug('foo')
+debug('this is hex: %h', new Buffer('hello world'))
+// foo this is hex: 68656c6c6f20776f726c6421 +0ms
+```
+
+
+## Browser Support
+
+You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
+or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
+if you don't want to build it yourself.
+
+Debug's enable state is currently persisted by `localStorage`.
+Consider the situation shown below where you have `worker:a` and `worker:b`,
+and wish to debug both. You can enable this using `localStorage.debug`:
+
+```js
+localStorage.debug = 'worker:*'
+```
+
+And then refresh the page.
+
+```js
+a = debug('worker:a');
+b = debug('worker:b');
+
+setInterval(function(){
+ a('doing some work');
+}, 1000);
+
+setInterval(function(){
+ b('doing some work');
+}, 1200);
+```
+
+
+## Output streams
+
+ By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
+
+Example [_stdout.js_](./examples/node/stdout.js):
+
+```js
+var debug = require('debug');
+var error = debug('app:error');
+
+// by default stderr is used
+error('goes to stderr!');
+
+var log = debug('app:log');
+// set this namespace to log via console.log
+log.log = console.log.bind(console); // don't forget to bind to console!
+log('goes to stdout');
+error('still goes to stderr!');
+
+// set all output to go via console.info
+// overrides all per-namespace log settings
+debug.log = console.info.bind(console);
+error('now goes to stdout via console.info');
+log('still goes to stdout, but via console.info now');
+```
+
+## Extend
+You can simply extend debugger
+```js
+const log = require('debug')('auth');
+
+//creates new debug instance with extended namespace
+const logSign = log.extend('sign');
+const logLogin = log.extend('login');
+
+log('hello'); // auth hello
+logSign('hello'); //auth:sign hello
+logLogin('hello'); //auth:login hello
+```
+
+## Set dynamically
+
+You can also enable debug dynamically by calling the `enable()` method :
+
+```js
+let debug = require('debug');
+
+console.log(1, debug.enabled('test'));
+
+debug.enable('test');
+console.log(2, debug.enabled('test'));
+
+debug.disable();
+console.log(3, debug.enabled('test'));
+
+```
+
+print :
+```
+1 false
+2 true
+3 false
+```
+
+Usage :
+`enable(namespaces)`
+`namespaces` can include modes separated by a colon and wildcards.
+
+Note that calling `enable()` completely overrides previously set DEBUG variable :
+
+```
+$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))'
+=> false
+```
+
+`disable()`
+
+Will disable all namespaces. The functions returns the namespaces currently
+enabled (and skipped). This can be useful if you want to disable debugging
+temporarily without knowing what was enabled to begin with.
+
+For example:
+
+```js
+let debug = require('debug');
+debug.enable('foo:*,-foo:bar');
+let namespaces = debug.disable();
+debug.enable(namespaces);
+```
+
+Note: There is no guarantee that the string will be identical to the initial
+enable string, but semantically they will be identical.
+
+## Checking whether a debug target is enabled
+
+After you've created a debug instance, you can determine whether or not it is
+enabled by checking the `enabled` property:
+
+```javascript
+const debug = require('debug')('http');
+
+if (debug.enabled) {
+ // do stuff...
+}
+```
+
+You can also manually toggle this property to force the debug instance to be
+enabled or disabled.
+
+
+## Authors
+
+ - TJ Holowaychuk
+ - Nathan Rajlich
+ - Andrew Rhyne
+
+## Backers
+
+Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
+
+<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
+
+
+## Sponsors
+
+Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
+
+<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2014-2017 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/stylus/node_modules/debug/dist/debug.js b/node_modules/stylus/node_modules/debug/dist/debug.js
new file mode 100644
index 00000000..f271e01c
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/dist/debug.js
@@ -0,0 +1,886 @@
+"use strict";
+
+function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+(function (f) {
+ if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined") {
+ module.exports = f();
+ } else if (typeof define === "function" && define.amd) {
+ define([], f);
+ } else {
+ var g;
+
+ if (typeof window !== "undefined") {
+ g = window;
+ } else if (typeof global !== "undefined") {
+ g = global;
+ } else if (typeof self !== "undefined") {
+ g = self;
+ } else {
+ g = this;
+ }
+
+ g.debug = f();
+ }
+})(function () {
+ var define, module, exports;
+ return function () {
+ function r(e, n, t) {
+ function o(i, f) {
+ if (!n[i]) {
+ if (!e[i]) {
+ var c = "function" == typeof require && require;
+ if (!f && c) return c(i, !0);
+ if (u) return u(i, !0);
+ var a = new Error("Cannot find module '" + i + "'");
+ throw a.code = "MODULE_NOT_FOUND", a;
+ }
+
+ var p = n[i] = {
+ exports: {}
+ };
+ e[i][0].call(p.exports, function (r) {
+ var n = e[i][1][r];
+ return o(n || r);
+ }, p, p.exports, r, e, n, t);
+ }
+
+ return n[i].exports;
+ }
+
+ for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) {
+ o(t[i]);
+ }
+
+ return o;
+ }
+
+ return r;
+ }()({
+ 1: [function (require, module, exports) {
+ /**
+ * Helpers.
+ */
+ var s = 1000;
+ var m = s * 60;
+ var h = m * 60;
+ var d = h * 24;
+ var w = d * 7;
+ var y = d * 365.25;
+ /**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
+
+ module.exports = function (val, options) {
+ options = options || {};
+
+ var type = _typeof(val);
+
+ if (type === 'string' && val.length > 0) {
+ return parse(val);
+ } else if (type === 'number' && isNaN(val) === false) {
+ return options.long ? fmtLong(val) : fmtShort(val);
+ }
+
+ throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val));
+ };
+ /**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+
+ function parse(str) {
+ str = String(str);
+
+ if (str.length > 100) {
+ return;
+ }
+
+ var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
+
+ if (!match) {
+ return;
+ }
+
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y;
+
+ case 'weeks':
+ case 'week':
+ case 'w':
+ return n * w;
+
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d;
+
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h;
+
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m;
+
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s;
+
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n;
+
+ default:
+ return undefined;
+ }
+ }
+ /**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+
+ function fmtShort(ms) {
+ var msAbs = Math.abs(ms);
+
+ if (msAbs >= d) {
+ return Math.round(ms / d) + 'd';
+ }
+
+ if (msAbs >= h) {
+ return Math.round(ms / h) + 'h';
+ }
+
+ if (msAbs >= m) {
+ return Math.round(ms / m) + 'm';
+ }
+
+ if (msAbs >= s) {
+ return Math.round(ms / s) + 's';
+ }
+
+ return ms + 'ms';
+ }
+ /**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+
+ function fmtLong(ms) {
+ var msAbs = Math.abs(ms);
+
+ if (msAbs >= d) {
+ return plural(ms, msAbs, d, 'day');
+ }
+
+ if (msAbs >= h) {
+ return plural(ms, msAbs, h, 'hour');
+ }
+
+ if (msAbs >= m) {
+ return plural(ms, msAbs, m, 'minute');
+ }
+
+ if (msAbs >= s) {
+ return plural(ms, msAbs, s, 'second');
+ }
+
+ return ms + ' ms';
+ }
+ /**
+ * Pluralization helper.
+ */
+
+
+ function plural(ms, msAbs, n, name) {
+ var isPlural = msAbs >= n * 1.5;
+ return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+ }
+ }, {}],
+ 2: [function (require, module, exports) {
+ // shim for using process in browser
+ var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it
+ // don't break things. But we need to wrap it in a try catch in case it is
+ // wrapped in strict mode code which doesn't define any globals. It's inside a
+ // function because try/catches deoptimize in certain engines.
+
+ var cachedSetTimeout;
+ var cachedClearTimeout;
+
+ function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+ }
+
+ function defaultClearTimeout() {
+ throw new Error('clearTimeout has not been defined');
+ }
+
+ (function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ })();
+
+ function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ } // if setTimeout wasn't available but was latter defined
+
+
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+ }
+
+ function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ } // if clearTimeout wasn't available but was latter defined
+
+
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+ }
+
+ var queue = [];
+ var draining = false;
+ var currentQueue;
+ var queueIndex = -1;
+
+ function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+
+ draining = false;
+
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+
+ if (queue.length) {
+ drainQueue();
+ }
+ }
+
+ function drainQueue() {
+ if (draining) {
+ return;
+ }
+
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+ var len = queue.length;
+
+ while (len) {
+ currentQueue = queue;
+ queue = [];
+
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+
+ queueIndex = -1;
+ len = queue.length;
+ }
+
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+ }
+
+ process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+
+ queue.push(new Item(fun, args));
+
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+ }; // v8 likes predictible objects
+
+
+ function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+ }
+
+ Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+ };
+
+ process.title = 'browser';
+ process.browser = true;
+ process.env = {};
+ process.argv = [];
+ process.version = ''; // empty string to avoid regexp issues
+
+ process.versions = {};
+
+ function noop() {}
+
+ process.on = noop;
+ process.addListener = noop;
+ process.once = noop;
+ process.off = noop;
+ process.removeListener = noop;
+ process.removeAllListeners = noop;
+ process.emit = noop;
+ process.prependListener = noop;
+ process.prependOnceListener = noop;
+
+ process.listeners = function (name) {
+ return [];
+ };
+
+ process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+ };
+
+ process.cwd = function () {
+ return '/';
+ };
+
+ process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+ };
+
+ process.umask = function () {
+ return 0;
+ };
+ }, {}],
+ 3: [function (require, module, exports) {
+ /**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ */
+ function setup(env) {
+ createDebug.debug = createDebug;
+ createDebug.default = createDebug;
+ createDebug.coerce = coerce;
+ createDebug.disable = disable;
+ createDebug.enable = enable;
+ createDebug.enabled = enabled;
+ createDebug.humanize = require('ms');
+ Object.keys(env).forEach(function (key) {
+ createDebug[key] = env[key];
+ });
+ /**
+ * Active `debug` instances.
+ */
+
+ createDebug.instances = [];
+ /**
+ * The currently active debug mode names, and names to skip.
+ */
+
+ createDebug.names = [];
+ createDebug.skips = [];
+ /**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+ */
+
+ createDebug.formatters = {};
+ /**
+ * Selects a color for a debug namespace
+ * @param {String} namespace The namespace string for the for the debug instance to be colored
+ * @return {Number|String} An ANSI color code for the given namespace
+ * @api private
+ */
+
+ function selectColor(namespace) {
+ var hash = 0;
+
+ for (var i = 0; i < namespace.length; i++) {
+ hash = (hash << 5) - hash + namespace.charCodeAt(i);
+ hash |= 0; // Convert to 32bit integer
+ }
+
+ return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
+ }
+
+ createDebug.selectColor = selectColor;
+ /**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
+
+ function createDebug(namespace) {
+ var prevTime;
+
+ function debug() {
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ // Disabled?
+ if (!debug.enabled) {
+ return;
+ }
+
+ var self = debug; // Set `diff` timestamp
+
+ var curr = Number(new Date());
+ var ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+ args[0] = createDebug.coerce(args[0]);
+
+ if (typeof args[0] !== 'string') {
+ // Anything else let's inspect with %O
+ args.unshift('%O');
+ } // Apply any `formatters` transformations
+
+
+ var index = 0;
+ args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
+ // If we encounter an escaped % then don't increase the array index
+ if (match === '%%') {
+ return match;
+ }
+
+ index++;
+ var formatter = createDebug.formatters[format];
+
+ if (typeof formatter === 'function') {
+ var val = args[index];
+ match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`
+
+ args.splice(index, 1);
+ index--;
+ }
+
+ return match;
+ }); // Apply env-specific formatting (colors, etc.)
+
+ createDebug.formatArgs.call(self, args);
+ var logFn = self.log || createDebug.log;
+ logFn.apply(self, args);
+ }
+
+ debug.namespace = namespace;
+ debug.enabled = createDebug.enabled(namespace);
+ debug.useColors = createDebug.useColors();
+ debug.color = selectColor(namespace);
+ debug.destroy = destroy;
+ debug.extend = extend; // Debug.formatArgs = formatArgs;
+ // debug.rawLog = rawLog;
+ // env-specific initialization logic for debug instances
+
+ if (typeof createDebug.init === 'function') {
+ createDebug.init(debug);
+ }
+
+ createDebug.instances.push(debug);
+ return debug;
+ }
+
+ function destroy() {
+ var index = createDebug.instances.indexOf(this);
+
+ if (index !== -1) {
+ createDebug.instances.splice(index, 1);
+ return true;
+ }
+
+ return false;
+ }
+
+ function extend(namespace, delimiter) {
+ return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+ }
+ /**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
+
+
+ function enable(namespaces) {
+ createDebug.save(namespaces);
+ createDebug.names = [];
+ createDebug.skips = [];
+ var i;
+ var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
+ var len = split.length;
+
+ for (i = 0; i < len; i++) {
+ if (!split[i]) {
+ // ignore empty strings
+ continue;
+ }
+
+ namespaces = split[i].replace(/\*/g, '.*?');
+
+ if (namespaces[0] === '-') {
+ createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
+ } else {
+ createDebug.names.push(new RegExp('^' + namespaces + '$'));
+ }
+ }
+
+ for (i = 0; i < createDebug.instances.length; i++) {
+ var instance = createDebug.instances[i];
+ instance.enabled = createDebug.enabled(instance.namespace);
+ }
+ }
+ /**
+ * Disable debug output.
+ *
+ * @api public
+ */
+
+
+ function disable() {
+ createDebug.enable('');
+ }
+ /**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
+
+
+ function enabled(name) {
+ if (name[name.length - 1] === '*') {
+ return true;
+ }
+
+ var i;
+ var len;
+
+ for (i = 0, len = createDebug.skips.length; i < len; i++) {
+ if (createDebug.skips[i].test(name)) {
+ return false;
+ }
+ }
+
+ for (i = 0, len = createDebug.names.length; i < len; i++) {
+ if (createDebug.names[i].test(name)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ /**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
+
+
+ function coerce(val) {
+ if (val instanceof Error) {
+ return val.stack || val.message;
+ }
+
+ return val;
+ }
+
+ createDebug.enable(createDebug.load());
+ return createDebug;
+ }
+
+ module.exports = setup;
+ }, {
+ "ms": 1
+ }],
+ 4: [function (require, module, exports) {
+ (function (process) {
+ /* eslint-env browser */
+
+ /**
+ * This is the web browser implementation of `debug()`.
+ */
+ exports.log = log;
+ exports.formatArgs = formatArgs;
+ exports.save = save;
+ exports.load = load;
+ exports.useColors = useColors;
+ exports.storage = localstorage();
+ /**
+ * Colors.
+ */
+
+ exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
+ /**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+ // eslint-disable-next-line complexity
+
+ function useColors() {
+ // NB: In an Electron preload script, document will be defined but not fully
+ // initialized. Since we know we're in Chrome, we'll just detect this case
+ // explicitly
+ if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+ return true;
+ } // Internet Explorer and Edge do not support colors.
+
+
+ if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+ return false;
+ } // Is webkit? http://stackoverflow.com/a/16459606/376773
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+
+
+ return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
+ typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+ typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
+ typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
+ }
+ /**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+
+ function formatArgs(args) {
+ args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);
+
+ if (!this.useColors) {
+ return;
+ }
+
+ var c = 'color: ' + this.color;
+ args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
+
+ var index = 0;
+ var lastC = 0;
+ args[0].replace(/%[a-zA-Z%]/g, function (match) {
+ if (match === '%%') {
+ return;
+ }
+
+ index++;
+
+ if (match === '%c') {
+ // We only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+ args.splice(lastC, 0, c);
+ }
+ /**
+ * Invokes `console.log()` when available.
+ * No-op when `console.log` is not a "function".
+ *
+ * @api public
+ */
+
+
+ function log() {
+ var _console;
+
+ // This hackery is required for IE8/9, where
+ // the `console.log` function doesn't have 'apply'
+ return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);
+ }
+ /**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+
+
+ function save(namespaces) {
+ try {
+ if (namespaces) {
+ exports.storage.setItem('debug', namespaces);
+ } else {
+ exports.storage.removeItem('debug');
+ }
+ } catch (error) {// Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+ }
+ /**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+
+ function load() {
+ var r;
+
+ try {
+ r = exports.storage.getItem('debug');
+ } catch (error) {} // Swallow
+ // XXX (@Qix-) should we be logging these?
+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+
+
+ if (!r && typeof process !== 'undefined' && 'env' in process) {
+ r = process.env.DEBUG;
+ }
+
+ return r;
+ }
+ /**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+
+ function localstorage() {
+ try {
+ // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+ // The Browser also has localStorage in the global context.
+ return localStorage;
+ } catch (error) {// Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+ }
+
+ module.exports = require('./common')(exports);
+ var formatters = module.exports.formatters;
+ /**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+ formatters.j = function (v) {
+ try {
+ return JSON.stringify(v);
+ } catch (error) {
+ return '[UnexpectedJSONParseError]: ' + error.message;
+ }
+ };
+ }).call(this, require('_process'));
+ }, {
+ "./common": 3,
+ "_process": 2
+ }]
+ }, {}, [4])(4);
+});
+
diff --git a/node_modules/stylus/node_modules/debug/package.json b/node_modules/stylus/node_modules/debug/package.json
new file mode 100644
index 00000000..0477a691
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "debug",
+ "version": "4.1.0",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/visionmedia/debug.git"
+ },
+ "description": "small debugging utility",
+ "keywords": [
+ "debug",
+ "log",
+ "debugger"
+ ],
+ "files": [
+ "src",
+ "dist/debug.js",
+ "LICENSE",
+ "README.md"
+ ],
+ "author": "TJ Holowaychuk <tj@vision-media.ca>",
+ "contributors": [
+ "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)",
+ "Andrew Rhyne <rhyneandrew@gmail.com>"
+ ],
+ "license": "MIT",
+ "scripts": {
+ "lint": "xo",
+ "test": "npm run test:node && npm run test:browser",
+ "test:node": "istanbul cover _mocha -- test.js",
+ "posttest:node": "cat ./coverage/lcov.info | coveralls",
+ "pretest:browser": "npm run build",
+ "test:browser": "karma start --single-run",
+ "prebuild:debug": "mkdir -p dist && browserify --standalone debug -o dist/debug.es6.js .",
+ "build:debug": "babel -o dist/debug.js dist/debug.es6.js > dist/debug.js",
+ "build:test": "babel -d dist test.js",
+ "build": "npm run build:debug && npm run build:test",
+ "clean": "rimraf dist coverage"
+ },
+ "dependencies": {
+ "ms": "^2.1.1"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.0.0",
+ "@babel/core": "^7.0.0",
+ "@babel/preset-env": "^7.0.0",
+ "browserify": "14.4.0",
+ "chai": "^3.5.0",
+ "concurrently": "^3.1.0",
+ "coveralls": "^3.0.2",
+ "istanbul": "^0.4.5",
+ "karma": "^3.0.0",
+ "karma-chai": "^0.1.0",
+ "karma-mocha": "^1.3.0",
+ "karma-phantomjs-launcher": "^1.0.2",
+ "mocha": "^5.2.0",
+ "mocha-lcov-reporter": "^1.2.0",
+ "rimraf": "^2.5.4",
+ "xo": "^0.23.0"
+ },
+ "main": "./src/index.js",
+ "browser": "./src/browser.js",
+ "unpkg": "./dist/debug.js"
+}
diff --git a/node_modules/stylus/node_modules/debug/src/browser.js b/node_modules/stylus/node_modules/debug/src/browser.js
new file mode 100644
index 00000000..5f34c0d0
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/src/browser.js
@@ -0,0 +1,264 @@
+/* eslint-env browser */
+
+/**
+ * This is the web browser implementation of `debug()`.
+ */
+
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = localstorage();
+
+/**
+ * Colors.
+ */
+
+exports.colors = [
+ '#0000CC',
+ '#0000FF',
+ '#0033CC',
+ '#0033FF',
+ '#0066CC',
+ '#0066FF',
+ '#0099CC',
+ '#0099FF',
+ '#00CC00',
+ '#00CC33',
+ '#00CC66',
+ '#00CC99',
+ '#00CCCC',
+ '#00CCFF',
+ '#3300CC',
+ '#3300FF',
+ '#3333CC',
+ '#3333FF',
+ '#3366CC',
+ '#3366FF',
+ '#3399CC',
+ '#3399FF',
+ '#33CC00',
+ '#33CC33',
+ '#33CC66',
+ '#33CC99',
+ '#33CCCC',
+ '#33CCFF',
+ '#6600CC',
+ '#6600FF',
+ '#6633CC',
+ '#6633FF',
+ '#66CC00',
+ '#66CC33',
+ '#9900CC',
+ '#9900FF',
+ '#9933CC',
+ '#9933FF',
+ '#99CC00',
+ '#99CC33',
+ '#CC0000',
+ '#CC0033',
+ '#CC0066',
+ '#CC0099',
+ '#CC00CC',
+ '#CC00FF',
+ '#CC3300',
+ '#CC3333',
+ '#CC3366',
+ '#CC3399',
+ '#CC33CC',
+ '#CC33FF',
+ '#CC6600',
+ '#CC6633',
+ '#CC9900',
+ '#CC9933',
+ '#CCCC00',
+ '#CCCC33',
+ '#FF0000',
+ '#FF0033',
+ '#FF0066',
+ '#FF0099',
+ '#FF00CC',
+ '#FF00FF',
+ '#FF3300',
+ '#FF3333',
+ '#FF3366',
+ '#FF3399',
+ '#FF33CC',
+ '#FF33FF',
+ '#FF6600',
+ '#FF6633',
+ '#FF9900',
+ '#FF9933',
+ '#FFCC00',
+ '#FFCC33'
+];
+
+/**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+
+// eslint-disable-next-line complexity
+function useColors() {
+ // NB: In an Electron preload script, document will be defined but not fully
+ // initialized. Since we know we're in Chrome, we'll just detect this case
+ // explicitly
+ if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+ return true;
+ }
+
+ // Internet Explorer and Edge do not support colors.
+ if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+ return false;
+ }
+
+ // Is webkit? http://stackoverflow.com/a/16459606/376773
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+ return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
+ // Is firebug? http://stackoverflow.com/a/398120/376773
+ (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
+ // Is firefox >= v31?
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+ (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
+ // Double check webkit in userAgent just in case we are in a worker
+ (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
+}
+
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+ args[0] = (this.useColors ? '%c' : '') +
+ this.namespace +
+ (this.useColors ? ' %c' : ' ') +
+ args[0] +
+ (this.useColors ? '%c ' : ' ') +
+ '+' + module.exports.humanize(this.diff);
+
+ if (!this.useColors) {
+ return;
+ }
+
+ const c = 'color: ' + this.color;
+ args.splice(1, 0, c, 'color: inherit');
+
+ // The final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
+ let index = 0;
+ let lastC = 0;
+ args[0].replace(/%[a-zA-Z%]/g, match => {
+ if (match === '%%') {
+ return;
+ }
+ index++;
+ if (match === '%c') {
+ // We only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+
+ args.splice(lastC, 0, c);
+}
+
+/**
+ * Invokes `console.log()` when available.
+ * No-op when `console.log` is not a "function".
+ *
+ * @api public
+ */
+function log(...args) {
+ // This hackery is required for IE8/9, where
+ // the `console.log` function doesn't have 'apply'
+ return typeof console === 'object' &&
+ console.log &&
+ console.log(...args);
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+ try {
+ if (namespaces) {
+ exports.storage.setItem('debug', namespaces);
+ } else {
+ exports.storage.removeItem('debug');
+ }
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+function load() {
+ let r;
+ try {
+ r = exports.storage.getItem('debug');
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+
+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+ if (!r && typeof process !== 'undefined' && 'env' in process) {
+ r = process.env.DEBUG;
+ }
+
+ return r;
+}
+
+/**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+function localstorage() {
+ try {
+ // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+ // The Browser also has localStorage in the global context.
+ return localStorage;
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+}
+
+module.exports = require('./common')(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+formatters.j = function (v) {
+ try {
+ return JSON.stringify(v);
+ } catch (error) {
+ return '[UnexpectedJSONParseError]: ' + error.message;
+ }
+};
diff --git a/node_modules/stylus/node_modules/debug/src/common.js b/node_modules/stylus/node_modules/debug/src/common.js
new file mode 100644
index 00000000..0b6d0b64
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/src/common.js
@@ -0,0 +1,264 @@
+
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ */
+
+function setup(env) {
+ createDebug.debug = createDebug;
+ createDebug.default = createDebug;
+ createDebug.coerce = coerce;
+ createDebug.disable = disable;
+ createDebug.enable = enable;
+ createDebug.enabled = enabled;
+ createDebug.humanize = require('ms');
+
+ Object.keys(env).forEach(key => {
+ createDebug[key] = env[key];
+ });
+
+ /**
+ * Active `debug` instances.
+ */
+ createDebug.instances = [];
+
+ /**
+ * The currently active debug mode names, and names to skip.
+ */
+
+ createDebug.names = [];
+ createDebug.skips = [];
+
+ /**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+ */
+ createDebug.formatters = {};
+
+ /**
+ * Selects a color for a debug namespace
+ * @param {String} namespace The namespace string for the for the debug instance to be colored
+ * @return {Number|String} An ANSI color code for the given namespace
+ * @api private
+ */
+ function selectColor(namespace) {
+ let hash = 0;
+
+ for (let i = 0; i < namespace.length; i++) {
+ hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
+ hash |= 0; // Convert to 32bit integer
+ }
+
+ return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
+ }
+ createDebug.selectColor = selectColor;
+
+ /**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
+ function createDebug(namespace) {
+ let prevTime;
+
+ function debug(...args) {
+ // Disabled?
+ if (!debug.enabled) {
+ return;
+ }
+
+ const self = debug;
+
+ // Set `diff` timestamp
+ const curr = Number(new Date());
+ const ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+
+ args[0] = createDebug.coerce(args[0]);
+
+ if (typeof args[0] !== 'string') {
+ // Anything else let's inspect with %O
+ args.unshift('%O');
+ }
+
+ // Apply any `formatters` transformations
+ let index = 0;
+ args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
+ // If we encounter an escaped % then don't increase the array index
+ if (match === '%%') {
+ return match;
+ }
+ index++;
+ const formatter = createDebug.formatters[format];
+ if (typeof formatter === 'function') {
+ const val = args[index];
+ match = formatter.call(self, val);
+
+ // Now we need to remove `args[index]` since it's inlined in the `format`
+ args.splice(index, 1);
+ index--;
+ }
+ return match;
+ });
+
+ // Apply env-specific formatting (colors, etc.)
+ createDebug.formatArgs.call(self, args);
+
+ const logFn = self.log || createDebug.log;
+ logFn.apply(self, args);
+ }
+
+ debug.namespace = namespace;
+ debug.enabled = createDebug.enabled(namespace);
+ debug.useColors = createDebug.useColors();
+ debug.color = selectColor(namespace);
+ debug.destroy = destroy;
+ debug.extend = extend;
+ // Debug.formatArgs = formatArgs;
+ // debug.rawLog = rawLog;
+
+ // env-specific initialization logic for debug instances
+ if (typeof createDebug.init === 'function') {
+ createDebug.init(debug);
+ }
+
+ createDebug.instances.push(debug);
+
+ return debug;
+ }
+
+ function destroy() {
+ const index = createDebug.instances.indexOf(this);
+ if (index !== -1) {
+ createDebug.instances.splice(index, 1);
+ return true;
+ }
+ return false;
+ }
+
+ function extend(namespace, delimiter) {
+ return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+ }
+
+ /**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
+ function enable(namespaces) {
+ createDebug.save(namespaces);
+
+ createDebug.names = [];
+ createDebug.skips = [];
+
+ let i;
+ const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
+ const len = split.length;
+
+ for (i = 0; i < len; i++) {
+ if (!split[i]) {
+ // ignore empty strings
+ continue;
+ }
+
+ namespaces = split[i].replace(/\*/g, '.*?');
+
+ if (namespaces[0] === '-') {
+ createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
+ } else {
+ createDebug.names.push(new RegExp('^' + namespaces + '$'));
+ }
+ }
+
+ for (i = 0; i < createDebug.instances.length; i++) {
+ const instance = createDebug.instances[i];
+ instance.enabled = createDebug.enabled(instance.namespace);
+ }
+ }
+
+ /**
+ * Disable debug output.
+ *
+ * @return {String} namespaces
+ * @api public
+ */
+ function disable() {
+ const namespaces = [
+ ...createDebug.names.map(toNamespace),
+ ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
+ ].join(',');
+ createDebug.enable('');
+ return namespaces;
+ }
+
+ /**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
+ function enabled(name) {
+ if (name[name.length - 1] === '*') {
+ return true;
+ }
+
+ let i;
+ let len;
+
+ for (i = 0, len = createDebug.skips.length; i < len; i++) {
+ if (createDebug.skips[i].test(name)) {
+ return false;
+ }
+ }
+
+ for (i = 0, len = createDebug.names.length; i < len; i++) {
+ if (createDebug.names[i].test(name)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Convert regexp to namespace
+ *
+ * @param {RegExp} regxep
+ * @return {String} namespace
+ * @api private
+ */
+ function toNamespace(regexp) {
+ return regexp.toString()
+ .substring(2, regexp.toString().length - 2)
+ .replace(/\.\*\?$/, '*');
+ }
+
+ /**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
+ function coerce(val) {
+ if (val instanceof Error) {
+ return val.stack || val.message;
+ }
+ return val;
+ }
+
+ createDebug.enable(createDebug.load());
+
+ return createDebug;
+}
+
+module.exports = setup;
diff --git a/node_modules/stylus/node_modules/debug/src/index.js b/node_modules/stylus/node_modules/debug/src/index.js
new file mode 100644
index 00000000..bf4c57f2
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/src/index.js
@@ -0,0 +1,10 @@
+/**
+ * Detect Electron renderer / nwjs process, which is node, but we should
+ * treat as a browser.
+ */
+
+if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
+ module.exports = require('./browser.js');
+} else {
+ module.exports = require('./node.js');
+}
diff --git a/node_modules/stylus/node_modules/debug/src/node.js b/node_modules/stylus/node_modules/debug/src/node.js
new file mode 100644
index 00000000..5e1f1541
--- /dev/null
+++ b/node_modules/stylus/node_modules/debug/src/node.js
@@ -0,0 +1,257 @@
+/**
+ * Module dependencies.
+ */
+
+const tty = require('tty');
+const util = require('util');
+
+/**
+ * This is the Node.js implementation of `debug()`.
+ */
+
+exports.init = init;
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+
+/**
+ * Colors.
+ */
+
+exports.colors = [6, 2, 3, 4, 5, 1];
+
+try {
+ // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
+ // eslint-disable-next-line import/no-extraneous-dependencies
+ const supportsColor = require('supports-color');
+
+ if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
+ exports.colors = [
+ 20,
+ 21,
+ 26,
+ 27,
+ 32,
+ 33,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 56,
+ 57,
+ 62,
+ 63,
+ 68,
+ 69,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 92,
+ 93,
+ 98,
+ 99,
+ 112,
+ 113,
+ 128,
+ 129,
+ 134,
+ 135,
+ 148,
+ 149,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 178,
+ 179,
+ 184,
+ 185,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 214,
+ 215,
+ 220,
+ 221
+ ];
+ }
+} catch (error) {
+ // Swallow - we only care if `supports-color` is available; it doesn't have to be.
+}
+
+/**
+ * Build up the default `inspectOpts` object from the environment variables.
+ *
+ * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
+ */
+
+exports.inspectOpts = Object.keys(process.env).filter(key => {
+ return /^debug_/i.test(key);
+}).reduce((obj, key) => {
+ // Camel-case
+ const prop = key
+ .substring(6)
+ .toLowerCase()
+ .replace(/_([a-z])/g, (_, k) => {
+ return k.toUpperCase();
+ });
+
+ // Coerce string value into JS value
+ let val = process.env[key];
+ if (/^(yes|on|true|enabled)$/i.test(val)) {
+ val = true;
+ } else if (/^(no|off|false|disabled)$/i.test(val)) {
+ val = false;
+ } else if (val === 'null') {
+ val = null;
+ } else {
+ val = Number(val);
+ }
+
+ obj[prop] = val;
+ return obj;
+}, {});
+
+/**
+ * Is stdout a TTY? Colored output is enabled when `true`.
+ */
+
+function useColors() {
+ return 'colors' in exports.inspectOpts ?
+ Boolean(exports.inspectOpts.colors) :
+ tty.isatty(process.stderr.fd);
+}
+
+/**
+ * Adds ANSI color escape codes if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+ const {namespace: name, useColors} = this;
+
+ if (useColors) {
+ const c = this.color;
+ const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
+ const prefix = ` ${colorCode};1m${name} \u001B[0m`;
+
+ args[0] = prefix + args[0].split('\n').join('\n' + prefix);
+ args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
+ } else {
+ args[0] = getDate() + name + ' ' + args[0];
+ }
+}
+
+function getDate() {
+ if (exports.inspectOpts.hideDate) {
+ return '';
+ }
+ return new Date().toISOString() + ' ';
+}
+
+/**
+ * Invokes `util.format()` with the specified arguments and writes to stderr.
+ */
+
+function log(...args) {
+ return process.stderr.write(util.format(...args) + '\n');
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+ if (namespaces) {
+ process.env.DEBUG = namespaces;
+ } else {
+ // If you set a process.env field to null or undefined, it gets cast to the
+ // string 'null' or 'undefined'. Just delete instead.
+ delete process.env.DEBUG;
+ }
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+function load() {
+ return process.env.DEBUG;
+}
+
+/**
+ * Init logic for `debug` instances.
+ *
+ * Create a new `inspectOpts` object in case `useColors` is set
+ * differently for a particular `debug` instance.
+ */
+
+function init(debug) {
+ debug.inspectOpts = {};
+
+ const keys = Object.keys(exports.inspectOpts);
+ for (let i = 0; i < keys.length; i++) {
+ debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
+ }
+}
+
+module.exports = require('./common')(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %o to `util.inspect()`, all on a single line.
+ */
+
+formatters.o = function (v) {
+ this.inspectOpts.colors = this.useColors;
+ return util.inspect(v, this.inspectOpts)
+ .replace(/\s*\n\s*/g, ' ');
+};
+
+/**
+ * Map %O to `util.inspect()`, allowing multiple lines if needed.
+ */
+
+formatters.O = function (v) {
+ this.inspectOpts.colors = this.useColors;
+ return util.inspect(v, this.inspectOpts);
+};
diff --git a/node_modules/stylus/node_modules/glob/LICENSE b/node_modules/stylus/node_modules/glob/LICENSE
new file mode 100644
index 00000000..19129e31
--- /dev/null
+++ b/node_modules/stylus/node_modules/glob/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/stylus/node_modules/glob/README.md b/node_modules/stylus/node_modules/glob/README.md
new file mode 100644
index 00000000..9dd9384f
--- /dev/null
+++ b/node_modules/stylus/node_modules/glob/README.md
@@ -0,0 +1,365 @@
+# Glob
+
+Match files using the patterns the shell uses, like stars and stuff.
+
+[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Build Status](https://ci.appveyor.com/api/projects/status/kd7f3yftf7unxlsx?svg=true)](https://ci.appveyor.com/project/isaacs/node-glob) [![Coverage Status](https://coveralls.io/repos/isaacs/node-glob/badge.svg?branch=master&service=github)](https://coveralls.io/github/isaacs/node-glob?branch=master)
+
+This is a glob implementation in JavaScript. It uses the `minimatch`
+library to do its matching.
+
+![](oh-my-glob.gif)
+
+## Usage
+
+Install with npm
+
+```
+npm i glob
+```
+
+```javascript
+var glob = require("glob")
+
+// options is optional
+glob("**/*.js", options, function (er, files) {
+ // files is an array of filenames.
+ // If the `nonull` option is set, and nothing
+ // was found, then files is ["**/*.js"]
+ // er is an error object or null.
+})
+```
+
+## Glob Primer
+
+"Globs" are the patterns you type when you do stuff like `ls *.js` on
+the command line, or put `build/*` in a `.gitignore` file.
+
+Before parsing the path part patterns, braced sections are expanded
+into a set. Braced sections start with `{` and end with `}`, with any
+number of comma-delimited sections within. Braced sections may contain
+slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`.
+
+The following characters have special magic meaning when used in a
+path portion:
+
+* `*` Matches 0 or more characters in a single path portion
+* `?` Matches 1 character
+* `[...]` Matches a range of characters, similar to a RegExp range.
+ If the first character of the range is `!` or `^` then it matches
+ any character not in the range.
+* `!(pattern|pattern|pattern)` Matches anything that does not match
+ any of the patterns provided.
+* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the
+ patterns provided.
+* `+(pattern|pattern|pattern)` Matches one or more occurrences of the
+ patterns provided.
+* `*(a|b|c)` Matches zero or more occurrences of the patterns provided
+* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
+ provided
+* `**` If a "globstar" is alone in a path portion, then it matches
+ zero or more directories and subdirectories searching for matches.
+ It does not crawl symlinked directories.
+
+### Dots
+
+If a file or directory path portion has a `.` as the first character,
+then it will not match any glob pattern unless that pattern's
+corresponding path part also has a `.` as its first character.
+
+For example, the pattern `a/.*/c` would match the file at `a/.b/c`.
+However the pattern `a/*/c` would not, because `*` does not start with
+a dot character.
+
+You can make glob treat dots as normal characters by setting
+`dot:true` in the options.
+
+### Basename Matching
+
+If you set `matchBase:true` in the options, and the pattern has no
+slashes in it, then it will seek for any file anywhere in the tree
+with a matching basename. For example, `*.js` would match
+`test/simple/basic.js`.
+
+### Empty Sets
+
+If no matching files are found, then an empty array is returned. This
+differs from the shell, where the pattern itself is returned. For
+example:
+
+ $ echo a*s*d*f
+ a*s*d*f
+
+To get the bash-style behavior, set the `nonull:true` in the options.
+
+### See Also:
+
+* `man sh`
+* `man bash` (Search for "Pattern Matching")
+* `man 3 fnmatch`
+* `man 5 gitignore`
+* [minimatch documentation](https://github.com/isaacs/minimatch)
+
+## glob.hasMagic(pattern, [options])
+
+Returns `true` if there are any special characters in the pattern, and
+`false` otherwise.
+
+Note that the options affect the results. If `noext:true` is set in
+the options object, then `+(a|b)` will not be considered a magic
+pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}`
+then that is considered magical, unless `nobrace:true` is set in the
+options.
+
+## glob(pattern, [options], cb)
+
+* `pattern` `{String}` Pattern to be matched
+* `options` `{Object}`
+* `cb` `{Function}`
+ * `err` `{Error | null}`
+ * `matches` `{Array<String>}` filenames found matching the pattern
+
+Perform an asynchronous glob search.
+
+## glob.sync(pattern, [options])
+
+* `pattern` `{String}` Pattern to be matched
+* `options` `{Object}`
+* return: `{Array<String>}` filenames found matching the pattern
+
+Perform a synchronous glob search.
+
+## Class: glob.Glob
+
+Create a Glob object by instantiating the `glob.Glob` class.
+
+```javascript
+var Glob = require("glob").Glob
+var mg = new Glob(pattern, options, cb)
+```
+
+It's an EventEmitter, and starts walking the filesystem to find matches
+immediately.
+
+### new glob.Glob(pattern, [options], [cb])
+
+* `pattern` `{String}` pattern to search for
+* `options` `{Object}`
+* `cb` `{Function}` Called when an error occurs, or matches are found
+ * `err` `{Error | null}`
+ * `matches` `{Array<String>}` filenames found matching the pattern
+
+Note that if the `sync` flag is set in the options, then matches will
+be immediately available on the `g.found` member.
+
+### Properties
+
+* `minimatch` The minimatch object that the glob uses.
+* `options` The options object passed in.
+* `aborted` Boolean which is set to true when calling `abort()`. There
+ is no way at this time to continue a glob search after aborting, but
+ you can re-use the statCache to avoid having to duplicate syscalls.
+* `cache` Convenience object. Each field has the following possible
+ values:
+ * `false` - Path does not exist
+ * `true` - Path exists
+ * `'FILE'` - Path exists, and is not a directory
+ * `'DIR'` - Path exists, and is a directory
+ * `[file, entries, ...]` - Path exists, is a directory, and the
+ array value is the results of `fs.readdir`
+* `statCache` Cache of `fs.stat` results, to prevent statting the same
+ path multiple times.
+* `symlinks` A record of which paths are symbolic links, which is
+ relevant in resolving `**` patterns.
+* `realpathCache` An optional object which is passed to `fs.realpath`
+ to minimize unnecessary syscalls. It is stored on the instantiated
+ Glob object, and may be re-used.
+
+### Events
+
+* `end` When the matching is finished, this is emitted with all the
+ matches found. If the `nonull` option is set, and no match was found,
+ then the `matches` list contains the original pattern. The matches
+ are sorted, unless the `nosort` flag is set.
+* `match` Every time a match is found, this is emitted with the specific
+ thing that matched. It is not deduplicated or resolved to a realpath.
+* `error` Emitted when an unexpected error is encountered, or whenever
+ any fs error occurs if `options.strict` is set.
+* `abort` When `abort()` is called, this event is raised.
+
+### Methods
+
+* `pause` Temporarily stop the search
+* `resume` Resume the search
+* `abort` Stop the search forever
+
+### Options
+
+All the options that can be passed to Minimatch can also be passed to
+Glob to change pattern matching behavior. Also, some have been added,
+or have glob-specific ramifications.
+
+All options are false by default, unless otherwise noted.
+
+All options are added to the Glob object, as well.
+
+If you are running many `glob` operations, you can pass a Glob object
+as the `options` argument to a subsequent operation to shortcut some
+`stat` and `readdir` calls. At the very least, you may pass in shared
+`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that
+parallel glob operations will be sped up by sharing information about
+the filesystem.
+
+* `cwd` The current working directory in which to search. Defaults
+ to `process.cwd()`.
+* `root` The place where patterns starting with `/` will be mounted
+ onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix
+ systems, and `C:\` or some such on Windows.)
+* `dot` Include `.dot` files in normal matches and `globstar` matches.
+ Note that an explicit dot in a portion of the pattern will always
+ match dot files.
+* `nomount` By default, a pattern starting with a forward-slash will be
+ "mounted" onto the root setting, so that a valid filesystem path is
+ returned. Set this flag to disable that behavior.
+* `mark` Add a `/` character to directory matches. Note that this
+ requires additional stat calls.
+* `nosort` Don't sort the results.
+* `stat` Set to true to stat *all* results. This reduces performance
+ somewhat, and is completely unnecessary, unless `readdir` is presumed
+ to be an untrustworthy indicator of file existence.
+* `silent` When an unusual error is encountered when attempting to
+ read a directory, a warning will be printed to stderr. Set the
+ `silent` option to true to suppress these warnings.
+* `strict` When an unusual error is encountered when attempting to
+ read a directory, the process will just continue on in search of
+ other matches. Set the `strict` option to raise an error in these
+ cases.
+* `cache` See `cache` property above. Pass in a previously generated
+ cache object to save some fs calls.
+* `statCache` A cache of results of filesystem information, to prevent
+ unnecessary stat calls. While it should not normally be necessary
+ to set this, you may pass the statCache from one glob() call to the
+ options object of another, if you know that the filesystem will not
+ change between calls. (See "Race Conditions" below.)
+* `symlinks` A cache of known symbolic links. You may pass in a
+ previously generated `symlinks` object to save `lstat` calls when
+ resolving `**` matches.
+* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead.
+* `nounique` In some cases, brace-expanded patterns can result in the
+ same file showing up multiple times in the result set. By default,
+ this implementation prevents duplicates in the result set. Set this
+ flag to disable that behavior.
+* `nonull` Set to never return an empty set, instead returning a set
+ containing the pattern itself. This is the default in glob(3).
+* `debug` Set to enable debug logging in minimatch and glob.
+* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
+* `noglobstar` Do not match `**` against multiple filenames. (Ie,
+ treat it as a normal `*` instead.)
+* `noext` Do not match `+(a|b)` "extglob" patterns.
+* `nocase` Perform a case-insensitive match. Note: on
+ case-insensitive filesystems, non-magic patterns will match by
+ default, since `stat` and `readdir` will not raise errors.
+* `matchBase` Perform a basename-only match if the pattern does not
+ contain any slash characters. That is, `*.js` would be treated as
+ equivalent to `**/*.js`, matching all js files in all directories.
+* `nodir` Do not match directories, only files. (Note: to match
+ *only* directories, simply put a `/` at the end of the pattern.)
+* `ignore` Add a pattern or an array of glob patterns to exclude matches.
+ Note: `ignore` patterns are *always* in `dot:true` mode, regardless
+ of any other settings.
+* `follow` Follow symlinked directories when expanding `**` patterns.
+ Note that this can result in a lot of duplicate references in the
+ presence of cyclic links.
+* `realpath` Set to true to call `fs.realpath` on all of the results.
+ In the case of a symlink that cannot be resolved, the full absolute
+ path to the matched entry is returned (though it will usually be a
+ broken symlink)
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between node-glob and other
+implementations, and are intentional.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set. This is supported in the manner of bsdglob
+and bash 4.3, where `**` only has special significance if it is the only
+thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+Note that symlinked directories are not crawled as part of a `**`,
+though their contents may match against subsequent portions of the
+pattern. This prevents infinite loops and duplicates and the like.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then glob returns the pattern as-provided, rather than
+interpreting the character escapes. For example,
+`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`. This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern. Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity. Since those two are valid, matching proceeds.
+
+### Comments and Negation
+
+Previously, this module let you mark a pattern as a "comment" if it
+started with a `#` character, or a "negated" pattern if it started
+with a `!` character.
+
+These options were deprecated in version 5, and removed in version 6.
+
+To specify things that should not match, use the `ignore` option.
+
+## Windows
+
+**Please only use forward-slashes in glob expressions.**
+
+Though windows uses either `/` or `\` as its path separator, only `/`
+characters are used by this glob implementation. You must use
+forward-slashes **only** in glob expressions. Back-slashes will always
+be interpreted as escape characters, not path separators.
+
+Results from absolute patterns such as `/foo/*` are mounted onto the
+root setting using `path.join`. On windows, this will by default result
+in `/foo/*` matching `C:\foo\bar.txt`.
+
+## Race Conditions
+
+Glob searching, by its very nature, is susceptible to race conditions,
+since it relies on directory walking and such.
+
+As a result, it is possible that a file that exists when glob looks for
+it may have been deleted or modified by the time it returns the result.
+
+As part of its internal implementation, this program caches all stat
+and readdir calls that it makes, in order to cut down on system
+overhead. However, this also makes it even more susceptible to races,
+especially if the cache or statCache objects are reused between glob
+calls.
+
+Users are thus advised not to use a glob result as a guarantee of
+filesystem state in the face of rapid changes. For the vast majority
+of operations, this is never a problem.
+
+## Contributing
+
+Any change to behavior (including bugfixes) must come with a test.
+
+Patches that fail tests or reduce performance will be rejected.
+
+```
+# to run tests
+npm test
+
+# to re-generate test fixtures
+npm run test-regen
+
+# to benchmark against bash/zsh
+npm run bench
+
+# to profile javascript
+npm run prof
+```
diff --git a/node_modules/stylus/node_modules/glob/changelog.md b/node_modules/stylus/node_modules/glob/changelog.md
new file mode 100644
index 00000000..41636771
--- /dev/null
+++ b/node_modules/stylus/node_modules/glob/changelog.md
@@ -0,0 +1,67 @@
+## 7.0
+
+- Raise error if `options.cwd` is specified, and not a directory
+
+## 6.0
+
+- Remove comment and negation pattern support
+- Ignore patterns are always in `dot:true` mode
+
+## 5.0
+
+- Deprecate comment and negation patterns
+- Fix regression in `mark` and `nodir` options from making all cache
+ keys absolute path.
+- Abort if `fs.readdir` returns an error that's unexpected
+- Don't emit `match` events for ignored items
+- Treat ENOTSUP like ENOTDIR in readdir
+
+## 4.5
+
+- Add `options.follow` to always follow directory symlinks in globstar
+- Add `options.realpath` to call `fs.realpath` on all results
+- Always cache based on absolute path
+
+## 4.4
+
+- Add `options.ignore`
+- Fix handling of broken symlinks
+
+## 4.3
+
+- Bump minimatch to 2.x
+- Pass all tests on Windows
+
+## 4.2
+
+- Add `glob.hasMagic` function
+- Add `options.nodir` flag
+
+## 4.1
+
+- Refactor sync and async implementations for performance
+- Throw if callback provided to sync glob function
+- Treat symbolic links in globstar results the same as Bash 4.3
+
+## 4.0
+
+- Use `^` for dependency versions (bumped major because this breaks
+ older npm versions)
+- Ensure callbacks are only ever called once
+- switch to ISC license
+
+## 3.x
+
+- Rewrite in JavaScript
+- Add support for setting root, cwd, and windows support
+- Cache many fs calls
+- Add globstar support
+- emit match events
+
+## 2.x
+
+- Use `glob.h` and `fnmatch.h` from NetBSD
+
+## 1.x
+
+- `glob.h` static binding.
diff --git a/node_modules/stylus/node_modules/glob/common.js b/node_modules/stylus/node_modules/glob/common.js
new file mode 100644
index 00000000..58dc41e6
--- /dev/null
+++ b/node_modules/stylus/node_modules/glob/common.js
@@ -0,0 +1,235 @@
+exports.alphasort = alphasort
+exports.alphasorti = alphasorti
+exports.setopts = setopts
+exports.ownProp = ownProp
+exports.makeAbs = makeAbs
+exports.finish = finish
+exports.mark = mark
+exports.isIgnored = isIgnored
+exports.childrenIgnored = childrenIgnored
+
+function ownProp (obj, field) {
+ return Object.prototype.hasOwnProperty.call(obj, field)
+}
+
+var path = require("path")
+var minimatch = require("minimatch")
+var isAbsolute = require("path-is-absolute")
+var Minimatch = minimatch.Minimatch
+
+function alphasorti (a, b) {
+ return a.toLowerCase().localeCompare(b.toLowerCase())
+}
+
+function alphasort (a, b) {
+ return a.localeCompare(b)
+}
+
+function setupIgnores (self, options) {
+ self.ignore = options.ignore || []
+
+ if (!Array.isArray(self.ignore))
+ self.ignore = [self.ignore]
+
+ if (self.ignore.length) {
+ self.ignore = self.ignore.map(ignoreMap)
+ }
+}
+
+// ignore patterns are always in dot:true mode.
+function ignoreMap (pattern) {
+ var gmatcher = null
+ if (pattern.slice(-3) === '/**') {
+ var gpattern = pattern.replace(/(\/\*\*)+$/, '')
+ gmatcher = new Minimatch(gpattern, { dot: true })
+ }
+
+ return {
+ matcher: new Minimatch(pattern, { dot: true }),
+ gmatcher: gmatcher
+ }
+}
+
+function setopts (self, pattern, options) {
+ if (!options)
+ options = {}
+
+ // base-matching: just use globstar for that.
+ if (options.matchBase && -1 === pattern.indexOf("/")) {
+ if (options.noglobstar) {
+ throw new Error("base matching requires globstar")
+ }
+ pattern = "**/" + pattern
+ }
+
+ self.silent = !!options.silent
+ self.pattern = pattern
+ self.strict = options.strict !== false
+ self.realpath = !!options.realpath
+ self.realpathCache = options.realpathCache || Object.create(null)
+ self.follow = !!options.follow
+ self.dot = !!options.dot
+ self.mark = !!options.mark
+ self.nodir = !!options.nodir
+ if (self.nodir)
+ self.mark = true
+ self.sync = !!options.sync
+ self.nounique = !!options.nounique
+ self.nonull = !!options.nonull
+ self.nosort = !!options.nosort
+ self.nocase = !!options.nocase
+ self.stat = !!options.stat
+ self.noprocess = !!options.noprocess
+
+ self.maxLength = options.maxLength || Infinity
+ self.cache = options.cache || Object.create(null)
+ self.statCache = options.statCache || Object.create(null)
+ self.symlinks = options.symlinks || Object.create(null)
+
+ setupIgnores(self, options)
+
+ self.changedCwd = false
+ var cwd = process.cwd()
+ if (!ownProp(options, "cwd"))
+ self.cwd = cwd
+ else {
+ self.cwd = path.resolve(options.cwd)
+ self.changedCwd = self.cwd !== cwd
+ }
+
+ self.root = options.root || path.resolve(self.cwd, "/")
+ self.root = path.resolve(self.root)
+ if (process.platform === "win32")
+ self.root = self.root.replace(/\\/g, "/")
+
+ self.cwdAbs = makeAbs(self, self.cwd)
+ self.nomount = !!options.nomount
+
+ // disable comments and negation in Minimatch.
+ // Note that they are not supported in Glob itself anyway.
+ options.nonegate = true
+ options.nocomment = true
+
+ self.minimatch = new Minimatch(pattern, options)
+ self.options = self.minimatch.options
+}
+
+function finish (self) {
+ var nou = self.nounique
+ var all = nou ? [] : Object.create(null)
+
+ for (var i = 0, l = self.matches.length; i < l; i ++) {
+ var matches = self.matches[i]
+ if (!matches || Object.keys(matches).length === 0) {
+ if (self.nonull) {
+ // do like the shell, and spit out the literal glob
+ var literal = self.minimatch.globSet[i]
+ if (nou)
+ all.push(literal)
+ else
+ all[literal] = true
+ }
+ } else {
+ // had matches
+ var m = Object.keys(matches)
+ if (nou)
+ all.push.apply(all, m)
+ else
+ m.forEach(function (m) {
+ all[m] = true
+ })
+ }
+ }
+
+ if (!nou)
+ all = Object.keys(all)
+
+ if (!self.nosort)
+ all = all.sort(self.nocase ? alphasorti : alphasort)
+
+ // at *some* point we statted all of these
+ if (self.mark) {
+ for (var i = 0; i < all.length; i++) {
+ all[i] = self._mark(all[i])
+ }
+ if (self.nodir) {
+ all = all.filter(function (e) {
+ var notDir = !(/\/$/.test(e))
+ var c = self.cache[e] || self.cache[makeAbs(self, e)]
+ if (notDir && c)
+ notDir = c !== 'DIR' && !Array.isArray(c)
+ return notDir
+ })
+ }
+ }
+
+ if (self.ignore.length)
+ all = all.filter(function(m) {
+ return !isIgnored(self, m)
+ })
+
+ self.found = all
+}
+
+function mark (self, p) {
+ var abs = makeAbs(self, p)
+ var c = self.cache[abs]
+ var m = p
+ if (c) {
+ var isDir = c === 'DIR' || Array.isArray(c)
+ var slash = p.slice(-1) === '/'
+
+ if (isDir && !slash)
+ m += '/'
+ else if (!isDir && slash)
+ m = m.slice(0, -1)
+
+ if (m !== p) {
+ var mabs = makeAbs(self, m)
+ self.statCache[mabs] = self.statCache[abs]
+ self.cache[mabs] = self.cache[abs]
+ }
+ }
+
+ return m
+}
+
+// lotta situps...
+function makeAbs (self, f) {
+ var abs = f
+ if (f.charAt(0) === '/') {
+ abs = path.join(self.root, f)
+ } else if (isAbsolute(f) || f === '') {
+ abs = f
+ } else if (self.changedCwd) {
+ abs = path.resolve(self.cwd, f)
+ } else {
+ abs = path.resolve(f)
+ }
+
+ if (process.platform === 'win32')
+ abs = abs.replace(/\\/g, '/')
+
+ return abs
+}
+
+
+// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
+// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
+function isIgnored (self, path) {
+ if (!self.ignore.length)
+ return false
+
+ return self.ignore.some(function(item) {
+ return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
+ })
+}
+
+function childrenIgnored (self, path) {
+ if (!self.ignore.length)
+ return false
+
+ return self.ignore.some(function(item) {
+ return !!(item.gmatcher && item.gmatcher.match(path))
+ })
+}
diff --git a/node_modules/stylus/node_modules/glob/glob.js b/node_modules/stylus/node_modules/glob/glob.js
new file mode 100644
index 00000000..9eca910b
--- /dev/null
+++ b/node_modules/stylus/node_modules/glob/glob.js
@@ -0,0 +1,787 @@
+// Approach:
+//
+// 1. Get the minimatch set
+// 2. For each pattern in the set, PROCESS(pattern, false)
+// 3. Store matches per-set, then uniq them
+//
+// PROCESS(pattern, inGlobStar)
+// Get the first [n] items from pattern that are all strings
+// Join these together. This is PREFIX.
+// If there is no more remaining, then stat(PREFIX) and
+// add to matches if it succeeds. END.
+//
+// If inGlobStar and PREFIX is symlink and points to dir
+// set ENTRIES = []
+// else readdir(PREFIX) as ENTRIES
+// If fail, END
+//
+// with ENTRIES
+// If pattern[n] is GLOBSTAR
+// // handle the case where the globstar match is empty
+// // by pruning it out, and testing the resulting pattern
+// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
+// // handle other cases.
+// for ENTRY in ENTRIES (not dotfiles)
+// // attach globstar + tail onto the entry
+// // Mark that this entry is a globstar match
+// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
+//
+// else // not globstar
+// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
+// Test ENTRY against pattern[n]
+// If fails, continue
+// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
+//
+// Caveat:
+// Cache all stats and readdirs results to minimize syscall. Since all
+// we ever care about is existence and directory-ness, we can just keep
+// `true` for files, and [children,...] for directories, or `false` for
+// things that don't exist.
+
+module.exports = glob
+
+var fs = require('fs')
+var rp = require('fs.realpath')
+var minimatch = require('minimatch')
+var Minimatch = minimatch.Minimatch
+var inherits = require('inherits')
+var EE = require('events').EventEmitter
+var path = require('path')
+var assert = require('assert')
+var isAbsolute = require('path-is-absolute')
+var globSync = require('./sync.js')
+var common = require('./common.js')
+var alphasort = common.alphasort
+var alphasorti = common.alphasorti
+var setopts = common.setopts
+var ownProp = common.ownProp
+var inflight = require('inflight')
+var util = require('util')
+var childrenIgnored = common.childrenIgnored
+var isIgnored = common.isIgnored
+
+var once = require('once')
+
+function glob (pattern, options, cb) {
+ if (typeof options === 'function') cb = options, options = {}
+ if (!options) options = {}
+
+ if (options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return globSync(pattern, options)
+ }
+
+ return new Glob(pattern, options, cb)
+}
+
+glob.sync = globSync
+var GlobSync = glob.GlobSync = globSync.GlobSync
+
+// old api surface
+glob.glob = glob
+
+function extend (origin, add) {
+ if (add === null || typeof add !== 'object') {
+ return origin
+ }
+
+ var keys = Object.keys(add)
+ var i = keys.length
+ while (i--) {
+ origin[keys[i]] = add[keys[i]]
+ }
+ return origin
+}
+
+glob.hasMagic = function (pattern, options_) {
+ var options = extend({}, options_)
+ options.noprocess = true
+
+ var g = new Glob(pattern, options)
+ var set = g.minimatch.set
+
+ if (!pattern)
+ return false
+
+ if (set.length > 1)
+ return true
+
+ for (var j = 0; j < set[0].length; j++) {
+ if (typeof set[0][j] !== 'string')
+ return true
+ }
+
+ return false
+}
+
+glob.Glob = Glob
+inherits(Glob, EE)
+function Glob (pattern, options, cb) {
+ if (typeof options === 'function') {
+ cb = options
+ options = null
+ }
+
+ if (options && options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return new GlobSync(pattern, options)
+ }
+
+ if (!(this instanceof Glob))
+ return new Glob(pattern, options, cb)
+
+ setopts(this, pattern, options)
+ this._didRealPath = false
+
+ // process each pattern in the minimatch set
+ var n = this.minimatch.set.length
+
+ // The matches are stored as {<filename>: true,...} so that
+ // duplicates are automagically pruned.
+ // Later, we do an Object.keys() on these.
+ // Keep them as a list so we can fill in when nonull is set.
+ this.matches = new Array(n)
+
+ if (typeof cb === 'function') {
+ cb = once(cb)
+ this.on('error', cb)
+ this.on('end', function (matches) {
+ cb(null, matches)
+ })
+ }
+
+ var self = this
+ var n = this.minimatch.set.length
+ this._processing = 0
+ this.matches = new Array(n)
+
+ this._emitQueue = []
+ this._processQueue = []
+ this.paused = false
+
+ if (this.noprocess)
+ return this
+
+ if (n === 0)
+ return done()
+
+ var sync = true
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false, done)
+ }
+ sync = false
+
+ function done () {
+ --self._processing
+ if (self._processing <= 0) {
+ if (sync) {
+ process.nextTick(function () {
+ self._finish()
+ })
+ } else {
+ self._finish()
+ }
+ }
+ }
+}
+
+Glob.prototype._finish = function () {
+ assert(this instanceof Glob)
+ if (this.aborted)
+ return
+
+ if (this.realpath && !this._didRealpath)
+ return this._realpath()
+
+ common.finish(this)
+ this.emit('end', this.found)
+}
+
+Glob.prototype._realpath = function () {
+ if (this._didRealpath)
+ return
+
+ this._didRealpath = true
+
+ var n = this.matches.length
+ if (n === 0)
+ return this._finish()
+
+ var self = this
+ for (var i = 0; i < this.matches.length; i++)
+ this._realpathSet(i, next)
+
+ function next () {
+ if (--n === 0)
+ self._finish()
+ }
+}
+
+Glob.prototype._realpathSet = function (index, cb) {
+ var matchset = this.matches[index]
+ if (!matchset)
+ return cb()
+
+ var found = Object.keys(matchset)
+ var self = this
+ var n = found.length
+
+ if (n === 0)
+ return cb()
+
+ var set = this.matches[index] = Object.create(null)
+ found.forEach(function (p, i) {
+ // If there's a problem with the stat, then it means that
+ // one or more of the links in the realpath couldn't be
+ // resolved. just return the abs value in that case.
+ p = self._makeAbs(p)
+ rp.realpath(p, self.realpathCache, function (er, real) {
+ if (!er)
+ set[real] = true
+ else if (er.syscall === 'stat')
+ set[p] = true
+ else
+ self.emit('error', er) // srsly wtf right here
+
+ if (--n === 0) {
+ self.matches[index] = set
+ cb()
+ }
+ })
+ })
+}
+
+Glob.prototype._mark = function (p) {
+ return common.mark(this, p)
+}
+
+Glob.prototype._makeAbs = function (f) {
+ return common.makeAbs(this, f)
+}
+
+Glob.prototype.abort = function () {
+ this.aborted = true
+ this.emit('abort')
+}
+
+Glob.prototype.pause = function () {
+ if (!this.paused) {
+ this.paused = true
+ this.emit('pause')
+ }
+}
+
+Glob.prototype.resume = function () {
+ if (this.paused) {
+ this.emit('resume')
+ this.paused = false
+ if (this._emitQueue.length) {
+ var eq = this._emitQueue.slice(0)
+ this._emitQueue.length = 0
+ for (var i = 0; i < eq.length; i ++) {
+ var e = eq[i]
+ this._emitMatch(e[0], e[1])
+ }
+ }
+ if (this._processQueue.length) {
+ var pq = this._processQueue.slice(0)
+ this._processQueue.length = 0
+ for (var i = 0; i < pq.length; i ++) {
+ var p = pq[i]
+ this._processing--
+ this._process(p[0], p[1], p[2], p[3])
+ }
+ }
+ }
+}
+
+Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
+ assert(this instanceof Glob)
+ assert(typeof cb === 'function')
+
+ if (this.aborted)
+ return
+
+ this._processing++
+ if (this.paused) {
+ this._processQueue.push([pattern, index, inGlobStar, cb])
+ return
+ }
+
+ //console.error('PROCESS %d', this._processing, pattern)
+
+ // Get the first [n] parts of pattern that are all strings.
+ var n = 0
+ while (typeof pattern[n] === 'string') {
+ n ++
+ }
+ // now n is the index of the first one that is *not* a string.
+
+ // see if there's anything else
+ var prefix
+ switch (n) {
+ // if not, then this is rather simple
+ case pattern.length:
+ this._processSimple(pattern.join('/'), index, cb)
+ return
+
+ case 0:
+ // pattern *starts* with some non-trivial item.
+ // going to readdir(cwd), but not include the prefix in matches.
+ prefix = null
+ break
+
+ default:
+ // pattern has some string bits in the front.
+ // whatever it starts with, whether that's 'absolute' like /foo/bar,
+ // or 'relative' like '../baz'
+ prefix = pattern.slice(0, n).join('/')
+ break
+ }
+
+ var remain = pattern.slice(n)
+
+ // get the list of entries.
+ var read
+ if (prefix === null)
+ read = '.'
+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
+ if (!prefix || !isAbsolute(prefix))
+ prefix = '/' + prefix
+ read = prefix
+ } else
+ read = prefix
+
+ var abs = this._makeAbs(read)
+
+ //if ignored, skip _processing
+ if (childrenIgnored(this, read))
+ return cb()
+
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
+}
+
+Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return cb()
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0]
+ var negate = !!this.minimatch.negate
+ var rawGlob = pn._glob
+ var dotOk = this.dot || rawGlob.charAt(0) === '.'
+
+ var matchedEntries = []
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i]
+ if (e.charAt(0) !== '.' || dotOk) {
+ var m
+ if (negate && !prefix) {
+ m = !e.match(pn)
+ } else {
+ m = e.match(pn)
+ }
+ if (m)
+ matchedEntries.push(e)
+ }
+ }
+
+ //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
+
+ var len = matchedEntries.length
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return cb()
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ if (prefix) {
+ if (prefix !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+
+ if (e.charAt(0) === '/' && !this.nomount) {
+ e = path.join(this.root, e)
+ }
+ this._emitMatch(index, e)
+ }
+ // This was the last one, and no stats were needed
+ return cb()
+ }
+
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift()
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ var newPattern
+ if (prefix) {
+ if (prefix !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+ this._process([e].concat(remain), index, inGlobStar, cb)
+ }
+ cb()
+}
+
+Glob.prototype._emitMatch = function (index, e) {
+ if (this.aborted)
+ return
+
+ if (this.matches[index][e])
+ return
+
+ if (isIgnored(this, e))
+ return
+
+ if (this.paused) {
+ this._emitQueue.push([index, e])
+ return
+ }
+
+ var abs = this._makeAbs(e)
+
+ if (this.nodir) {
+ var c = this.cache[abs]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
+
+ if (this.mark)
+ e = this._mark(e)
+
+ this.matches[index][e] = true
+
+ var st = this.statCache[abs]
+ if (st)
+ this.emit('stat', e, st)
+
+ this.emit('match', e)
+}
+
+Glob.prototype._readdirInGlobStar = function (abs, cb) {
+ if (this.aborted)
+ return
+
+ // follow all symlinked directories forever
+ // just proceed as if this is a non-globstar situation
+ if (this.follow)
+ return this._readdir(abs, false, cb)
+
+ var lstatkey = 'lstat\0' + abs
+ var self = this
+ var lstatcb = inflight(lstatkey, lstatcb_)
+
+ if (lstatcb)
+ fs.lstat(abs, lstatcb)
+
+ function lstatcb_ (er, lstat) {
+ if (er)
+ return cb()
+
+ var isSym = lstat.isSymbolicLink()
+ self.symlinks[abs] = isSym
+
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && !lstat.isDirectory()) {
+ self.cache[abs] = 'FILE'
+ cb()
+ } else
+ self._readdir(abs, false, cb)
+ }
+}
+
+Glob.prototype._readdir = function (abs, inGlobStar, cb) {
+ if (this.aborted)
+ return
+
+ cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
+ if (!cb)
+ return
+
+ //console.error('RD %j %j', +inGlobStar, abs)
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs, cb)
+
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return cb()
+
+ if (Array.isArray(c))
+ return cb(null, c)
+ }
+
+ var self = this
+ fs.readdir(abs, readdirCb(this, abs, cb))
+}
+
+function readdirCb (self, abs, cb) {
+ return function (er, entries) {
+ if (er)
+ self._readdirError(abs, er, cb)
+ else
+ self._readdirEntries(abs, entries, cb)
+ }
+}
+
+Glob.prototype._readdirEntries = function (abs, entries, cb) {
+ if (this.aborted)
+ return
+
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i]
+ if (abs === '/')
+ e = abs + e
+ else
+ e = abs + '/' + e
+ this.cache[e] = true
+ }
+ }
+
+ this.cache[abs] = entries
+ return cb(null, entries)
+}
+
+Glob.prototype._readdirError = function (f, er, cb) {
+ if (this.aborted)
+ return
+
+ // handle errors, and cache the information
+ switch (er.code) {
+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
+ case 'ENOTDIR': // totally normal. means it *does* exist.
+ var abs = this._makeAbs(f)
+ this.cache[abs] = 'FILE'
+ if (abs === this.cwdAbs) {
+ var error = new Error(er.code + ' invalid cwd ' + this.cwd)
+ error.path = this.cwd
+ error.code = er.code
+ this.emit('error', error)
+ this.abort()
+ }
+ break
+
+ case 'ENOENT': // not terribly unusual
+ case 'ELOOP':
+ case 'ENAMETOOLONG':
+ case 'UNKNOWN':
+ this.cache[this._makeAbs(f)] = false
+ break
+
+ default: // some unusual error. Treat as failure.
+ this.cache[this._makeAbs(f)] = false
+ if (this.strict) {
+ this.emit('error', er)
+ // If the error is handled, then we abort
+ // if not, we threw out of here
+ this.abort()
+ }
+ if (!this.silent)
+ console.error('glob error', er)
+ break
+ }
+
+ return cb()
+}
+
+Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+
+Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+ //console.error('pgs2', prefix, remain[0], entries)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return cb()
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1)
+ var gspref = prefix ? [ prefix ] : []
+ var noGlobStar = gspref.concat(remainWithoutGlobStar)
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false, cb)
+
+ var isSym = this.symlinks[abs]
+ var len = entries.length
+
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return cb()
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i]
+ if (e.charAt(0) === '.' && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar)
+ this._process(instead, index, true, cb)
+
+ var below = gspref.concat(entries[i], remain)
+ this._process(below, index, true, cb)
+ }
+
+ cb()
+}
+
+Glob.prototype._processSimple = function (prefix, index, cb) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var self = this
+ this._stat(prefix, function (er, exists) {
+ self._processSimple2(prefix, index, er, exists, cb)
+ })
+}
+Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
+
+ //console.error('ps2', prefix, exists)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return cb()
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix)
+ if (prefix.charAt(0) === '/') {
+ prefix = path.join(this.root, prefix)
+ } else {
+ prefix = path.resolve(this.root, prefix)
+ if (trail)
+ prefix += '/'
+ }
+ }
+
+ if (process.platform === 'win32')
+ prefix = prefix.replace(/\\/g, '/')
+
+ // Mark this as a match
+ this._emitMatch(index, prefix)
+ cb()
+}
+
+// Returns either 'DIR', 'FILE', or false
+Glob.prototype._stat = function (f, cb) {
+ var abs = this._makeAbs(f)
+ var needDir = f.slice(-1) === '/'
+
+ if (f.length > this.maxLength)
+ return cb()
+
+ if (!this.stat && ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+
+ if (Array.isArray(c))
+ c = 'DIR'
+
+ // It exists, but maybe not how we need it
+ if (!needDir || c === 'DIR')
+ return cb(null, c)
+
+ if (needDir && c === 'FILE')
+ return cb()
+
+ // otherwise we have to stat, because maybe c=true
+ // if we know it exists, but not what it is.
+ }
+
+ var exists
+ var stat = this.statCache[abs]
+ if (stat !== undefined) {
+ if (stat === false)
+ return cb(null, stat)
+ else {
+ var type = stat.isDirectory() ? 'DIR' : 'FILE'
+ if (needDir && type === 'FILE')
+ return cb()
+ else
+ return cb(null, type, stat)
+ }
+ }
+
+ var self = this
+ var statcb = inflight('stat\0' + abs, lstatcb_)
+ if (statcb)
+ fs.lstat(abs, statcb)
+
+ function lstatcb_ (er, lstat) {
+ if (lstat && lstat.isSymbolicLink()) {
+ // If it's a symlink, then treat it as the target, unless
+ // the target does not exist, then treat it as a file.
+ return fs.stat(abs, function (er, stat) {
+ if (er)
+ self._stat2(f, abs, null, lstat, cb)
+ else
+ self._stat2(f, abs, er, stat, cb)
+ })
+ } else {
+ self._stat2(f, abs, er, lstat, cb)
+ }
+ }
+}
+
+Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
+ if (er) {
+ this.statCache[abs] = false
+ return cb()
+ }
+
+ var needDir = f.slice(-1) === '/'
+ this.statCache[abs] = stat
+
+ if (abs.slice(-1) === '/' && !stat.isDirectory())
+ return cb(null, false, stat)
+
+ var c = stat.isDirectory() ? 'DIR' : 'FILE'
+ this.cache[abs] = this.cache[abs] || c
+
+ if (needDir && c !== 'DIR')
+ return cb()
+
+ return cb(null, c, stat)
+}
diff --git a/node_modules/stylus/node_modules/glob/package.json b/node_modules/stylus/node_modules/glob/package.json
new file mode 100644
index 00000000..f3c5ac71
--- /dev/null
+++ b/node_modules/stylus/node_modules/glob/package.json
@@ -0,0 +1,43 @@
+{
+ "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
+ "name": "glob",
+ "description": "a little globber",
+ "version": "7.0.6",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/node-glob.git"
+ },
+ "main": "glob.js",
+ "files": [
+ "glob.js",
+ "sync.js",
+ "common.js"
+ ],
+ "engines": {
+ "node": "*"
+ },
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.2",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "devDependencies": {
+ "mkdirp": "0",
+ "rimraf": "^2.2.8",
+ "tap": "^5.7.0",
+ "tick": "0.0.6"
+ },
+ "scripts": {
+ "prepublish": "npm run benchclean",
+ "profclean": "rm -f v8.log profile.txt",
+ "test": "tap test/*.js --cov",
+ "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js",
+ "bench": "bash benchmark.sh",
+ "prof": "bash prof.sh && cat profile.txt",
+ "benchclean": "node benchclean.js"
+ },
+ "license": "ISC"
+}
diff --git a/node_modules/stylus/node_modules/glob/sync.js b/node_modules/stylus/node_modules/glob/sync.js
new file mode 100644
index 00000000..bba2dc6a
--- /dev/null
+++ b/node_modules/stylus/node_modules/glob/sync.js
@@ -0,0 +1,468 @@
+module.exports = globSync
+globSync.GlobSync = GlobSync
+
+var fs = require('fs')
+var rp = require('fs.realpath')
+var minimatch = require('minimatch')
+var Minimatch = minimatch.Minimatch
+var Glob = require('./glob.js').Glob
+var util = require('util')
+var path = require('path')
+var assert = require('assert')
+var isAbsolute = require('path-is-absolute')
+var common = require('./common.js')
+var alphasort = common.alphasort
+var alphasorti = common.alphasorti
+var setopts = common.setopts
+var ownProp = common.ownProp
+var childrenIgnored = common.childrenIgnored
+
+function globSync (pattern, options) {
+ if (typeof options === 'function' || arguments.length === 3)
+ throw new TypeError('callback provided to sync glob\n'+
+ 'See: https://github.com/isaacs/node-glob/issues/167')
+
+ return new GlobSync(pattern, options).found
+}
+
+function GlobSync (pattern, options) {
+ if (!pattern)
+ throw new Error('must provide pattern')
+
+ if (typeof options === 'function' || arguments.length === 3)
+ throw new TypeError('callback provided to sync glob\n'+
+ 'See: https://github.com/isaacs/node-glob/issues/167')
+
+ if (!(this instanceof GlobSync))
+ return new GlobSync(pattern, options)
+
+ setopts(this, pattern, options)
+
+ if (this.noprocess)
+ return this
+
+ var n = this.minimatch.set.length
+ this.matches = new Array(n)
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false)
+ }
+ this._finish()
+}
+
+GlobSync.prototype._finish = function () {
+ assert(this instanceof GlobSync)
+ if (this.realpath) {
+ var self = this
+ this.matches.forEach(function (matchset, index) {
+ var set = self.matches[index] = Object.create(null)
+ for (var p in matchset) {
+ try {
+ p = self._makeAbs(p)
+ var real = rp.realpathSync(p, self.realpathCache)
+ set[real] = true
+ } catch (er) {
+ if (er.syscall === 'stat')
+ set[self._makeAbs(p)] = true
+ else
+ throw er
+ }
+ }
+ })
+ }
+ common.finish(this)
+}
+
+
+GlobSync.prototype._process = function (pattern, index, inGlobStar) {
+ assert(this instanceof GlobSync)
+
+ // Get the first [n] parts of pattern that are all strings.
+ var n = 0
+ while (typeof pattern[n] === 'string') {
+ n ++
+ }
+ // now n is the index of the first one that is *not* a string.
+
+ // See if there's anything else
+ var prefix
+ switch (n) {
+ // if not, then this is rather simple
+ case pattern.length:
+ this._processSimple(pattern.join('/'), index)
+ return
+
+ case 0:
+ // pattern *starts* with some non-trivial item.
+ // going to readdir(cwd), but not include the prefix in matches.
+ prefix = null
+ break
+
+ default:
+ // pattern has some string bits in the front.
+ // whatever it starts with, whether that's 'absolute' like /foo/bar,
+ // or 'relative' like '../baz'
+ prefix = pattern.slice(0, n).join('/')
+ break
+ }
+
+ var remain = pattern.slice(n)
+
+ // get the list of entries.
+ var read
+ if (prefix === null)
+ read = '.'
+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
+ if (!prefix || !isAbsolute(prefix))
+ prefix = '/' + prefix
+ read = prefix
+ } else
+ read = prefix
+
+ var abs = this._makeAbs(read)
+
+ //if ignored, skip processing
+ if (childrenIgnored(this, read))
+ return
+
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
+}
+
+
+GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
+ var entries = this._readdir(abs, inGlobStar)
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0]
+ var negate = !!this.minimatch.negate
+ var rawGlob = pn._glob
+ var dotOk = this.dot || rawGlob.charAt(0) === '.'
+
+ var matchedEntries = []
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i]
+ if (e.charAt(0) !== '.' || dotOk) {
+ var m
+ if (negate && !prefix) {
+ m = !e.match(pn)
+ } else {
+ m = e.match(pn)
+ }
+ if (m)
+ matchedEntries.push(e)
+ }
+ }
+
+ var len = matchedEntries.length
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ if (prefix) {
+ if (prefix.slice(-1) !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+
+ if (e.charAt(0) === '/' && !this.nomount) {
+ e = path.join(this.root, e)
+ }
+ this.matches[index][e] = true
+ }
+ // This was the last one, and no stats were needed
+ return
+ }
+
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift()
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ var newPattern
+ if (prefix)
+ newPattern = [prefix, e]
+ else
+ newPattern = [e]
+ this._process(newPattern.concat(remain), index, inGlobStar)
+ }
+}
+
+
+GlobSync.prototype._emitMatch = function (index, e) {
+ var abs = this._makeAbs(e)
+ if (this.mark)
+ e = this._mark(e)
+
+ if (this.matches[index][e])
+ return
+
+ if (this.nodir) {
+ var c = this.cache[this._makeAbs(e)]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
+
+ this.matches[index][e] = true
+ if (this.stat)
+ this._stat(e)
+}
+
+
+GlobSync.prototype._readdirInGlobStar = function (abs) {
+ // follow all symlinked directories forever
+ // just proceed as if this is a non-globstar situation
+ if (this.follow)
+ return this._readdir(abs, false)
+
+ var entries
+ var lstat
+ var stat
+ try {
+ lstat = fs.lstatSync(abs)
+ } catch (er) {
+ // lstat failed, doesn't exist
+ return null
+ }
+
+ var isSym = lstat.isSymbolicLink()
+ this.symlinks[abs] = isSym
+
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && !lstat.isDirectory())
+ this.cache[abs] = 'FILE'
+ else
+ entries = this._readdir(abs, false)
+
+ return entries
+}
+
+GlobSync.prototype._readdir = function (abs, inGlobStar) {
+ var entries
+
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs)
+
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return null
+
+ if (Array.isArray(c))
+ return c
+ }
+
+ try {
+ return this._readdirEntries(abs, fs.readdirSync(abs))
+ } catch (er) {
+ this._readdirError(abs, er)
+ return null
+ }
+}
+
+GlobSync.prototype._readdirEntries = function (abs, entries) {
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i]
+ if (abs === '/')
+ e = abs + e
+ else
+ e = abs + '/' + e
+ this.cache[e] = true
+ }
+ }
+
+ this.cache[abs] = entries
+
+ // mark and cache dir-ness
+ return entries
+}
+
+GlobSync.prototype._readdirError = function (f, er) {
+ // handle errors, and cache the information
+ switch (er.code) {
+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
+ case 'ENOTDIR': // totally normal. means it *does* exist.
+ var abs = this._makeAbs(f)
+ this.cache[abs] = 'FILE'
+ if (abs === this.cwdAbs) {
+ var error = new Error(er.code + ' invalid cwd ' + this.cwd)
+ error.path = this.cwd
+ error.code = er.code
+ throw error
+ }
+ break
+
+ case 'ENOENT': // not terribly unusual
+ case 'ELOOP':
+ case 'ENAMETOOLONG':
+ case 'UNKNOWN':
+ this.cache[this._makeAbs(f)] = false
+ break
+
+ default: // some unusual error. Treat as failure.
+ this.cache[this._makeAbs(f)] = false
+ if (this.strict)
+ throw er
+ if (!this.silent)
+ console.error('glob error', er)
+ break
+ }
+}
+
+GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
+
+ var entries = this._readdir(abs, inGlobStar)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1)
+ var gspref = prefix ? [ prefix ] : []
+ var noGlobStar = gspref.concat(remainWithoutGlobStar)
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false)
+
+ var len = entries.length
+ var isSym = this.symlinks[abs]
+
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i]
+ if (e.charAt(0) === '.' && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar)
+ this._process(instead, index, true)
+
+ var below = gspref.concat(entries[i], remain)
+ this._process(below, index, true)
+ }
+}
+
+GlobSync.prototype._processSimple = function (prefix, index) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var exists = this._stat(prefix)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix)
+ if (prefix.charAt(0) === '/') {
+ prefix = path.join(this.root, prefix)
+ } else {
+ prefix = path.resolve(this.root, prefix)
+ if (trail)
+ prefix += '/'
+ }
+ }
+
+ if (process.platform === 'win32')
+ prefix = prefix.replace(/\\/g, '/')
+
+ // Mark this as a match
+ this.matches[index][prefix] = true
+}
+
+// Returns either 'DIR', 'FILE', or false
+GlobSync.prototype._stat = function (f) {
+ var abs = this._makeAbs(f)
+ var needDir = f.slice(-1) === '/'
+
+ if (f.length > this.maxLength)
+ return false
+
+ if (!this.stat && ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+
+ if (Array.isArray(c))
+ c = 'DIR'
+
+ // It exists, but maybe not how we need it
+ if (!needDir || c === 'DIR')
+ return c
+
+ if (needDir && c === 'FILE')
+ return false
+
+ // otherwise we have to stat, because maybe c=true
+ // if we know it exists, but not what it is.
+ }
+
+ var exists
+ var stat = this.statCache[abs]
+ if (!stat) {
+ var lstat
+ try {
+ lstat = fs.lstatSync(abs)
+ } catch (er) {
+ return false
+ }
+
+ if (lstat.isSymbolicLink()) {
+ try {
+ stat = fs.statSync(abs)
+ } catch (er) {
+ stat = lstat
+ }
+ } else {
+ stat = lstat
+ }
+ }
+
+ this.statCache[abs] = stat
+
+ var c = stat.isDirectory() ? 'DIR' : 'FILE'
+ this.cache[abs] = this.cache[abs] || c
+
+ if (needDir && c !== 'DIR')
+ return false
+
+ return c
+}
+
+GlobSync.prototype._mark = function (p) {
+ return common.mark(this, p)
+}
+
+GlobSync.prototype._makeAbs = function (f) {
+ return common.makeAbs(this, f)
+}
diff --git a/node_modules/stylus/node_modules/ms/index.js b/node_modules/stylus/node_modules/ms/index.js
new file mode 100644
index 00000000..72297501
--- /dev/null
+++ b/node_modules/stylus/node_modules/ms/index.js
@@ -0,0 +1,162 @@
+/**
+ * Helpers.
+ */
+
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var w = d * 7;
+var y = d * 365.25;
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
+
+module.exports = function(val, options) {
+ options = options || {};
+ var type = typeof val;
+ if (type === 'string' && val.length > 0) {
+ return parse(val);
+ } else if (type === 'number' && isNaN(val) === false) {
+ return options.long ? fmtLong(val) : fmtShort(val);
+ }
+ throw new Error(
+ 'val is not a non-empty string or a valid number. val=' +
+ JSON.stringify(val)
+ );
+};
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+function parse(str) {
+ str = String(str);
+ if (str.length > 100) {
+ return;
+ }
+ var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
+ str
+ );
+ if (!match) {
+ return;
+ }
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y;
+ case 'weeks':
+ case 'week':
+ case 'w':
+ return n * w;
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d;
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h;
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m;
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s;
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n;
+ default:
+ return undefined;
+ }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function fmtShort(ms) {
+ var msAbs = Math.abs(ms);
+ if (msAbs >= d) {
+ return Math.round(ms / d) + 'd';
+ }
+ if (msAbs >= h) {
+ return Math.round(ms / h) + 'h';
+ }
+ if (msAbs >= m) {
+ return Math.round(ms / m) + 'm';
+ }
+ if (msAbs >= s) {
+ return Math.round(ms / s) + 's';
+ }
+ return ms + 'ms';
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function fmtLong(ms) {
+ var msAbs = Math.abs(ms);
+ if (msAbs >= d) {
+ return plural(ms, msAbs, d, 'day');
+ }
+ if (msAbs >= h) {
+ return plural(ms, msAbs, h, 'hour');
+ }
+ if (msAbs >= m) {
+ return plural(ms, msAbs, m, 'minute');
+ }
+ if (msAbs >= s) {
+ return plural(ms, msAbs, s, 'second');
+ }
+ return ms + ' ms';
+}
+
+/**
+ * Pluralization helper.
+ */
+
+function plural(ms, msAbs, n, name) {
+ var isPlural = msAbs >= n * 1.5;
+ return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+}
diff --git a/node_modules/stylus/node_modules/ms/license.md b/node_modules/stylus/node_modules/ms/license.md
new file mode 100644
index 00000000..69b61253
--- /dev/null
+++ b/node_modules/stylus/node_modules/ms/license.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Zeit, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/stylus/node_modules/ms/package.json b/node_modules/stylus/node_modules/ms/package.json
new file mode 100644
index 00000000..fc28cb39
--- /dev/null
+++ b/node_modules/stylus/node_modules/ms/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "ms",
+ "version": "2.1.1",
+ "description": "Tiny millisecond conversion utility",
+ "repository": "zeit/ms",
+ "main": "./index",
+ "files": [
+ "index.js"
+ ],
+ "scripts": {
+ "precommit": "lint-staged",
+ "lint": "eslint lib/* bin/*",
+ "test": "mocha tests.js"
+ },
+ "eslintConfig": {
+ "extends": "eslint:recommended",
+ "env": {
+ "node": true,
+ "es6": true
+ }
+ },
+ "lint-staged": {
+ "*.js": [
+ "npm run lint",
+ "prettier --single-quote --write",
+ "git add"
+ ]
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "eslint": "4.12.1",
+ "expect.js": "0.3.1",
+ "husky": "0.14.3",
+ "lint-staged": "5.0.0",
+ "mocha": "4.0.1"
+ }
+}
diff --git a/node_modules/stylus/node_modules/ms/readme.md b/node_modules/stylus/node_modules/ms/readme.md
new file mode 100644
index 00000000..bb767293
--- /dev/null
+++ b/node_modules/stylus/node_modules/ms/readme.md
@@ -0,0 +1,60 @@
+# ms
+
+[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms)
+[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/)
+
+Use this package to easily convert various time formats to milliseconds.
+
+## Examples
+
+```js
+ms('2 days') // 172800000
+ms('1d') // 86400000
+ms('10h') // 36000000
+ms('2.5 hrs') // 9000000
+ms('2h') // 7200000
+ms('1m') // 60000
+ms('5s') // 5000
+ms('1y') // 31557600000
+ms('100') // 100
+ms('-3 days') // -259200000
+ms('-1h') // -3600000
+ms('-200') // -200
+```
+
+### Convert from Milliseconds
+
+```js
+ms(60000) // "1m"
+ms(2 * 60000) // "2m"
+ms(-3 * 60000) // "-3m"
+ms(ms('10 hours')) // "10h"
+```
+
+### Time Format Written-Out
+
+```js
+ms(60000, { long: true }) // "1 minute"
+ms(2 * 60000, { long: true }) // "2 minutes"
+ms(-3 * 60000, { long: true }) // "-3 minutes"
+ms(ms('10 hours'), { long: true }) // "10 hours"
+```
+
+## Features
+
+- Works both in [Node.js](https://nodejs.org) and in the browser
+- If a number is supplied to `ms`, a string with a unit is returned
+- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
+- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
+
+## Related Packages
+
+- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
+
+## Caught a Bug?
+
+1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
+2. Link the package to the global module directory: `npm link`
+3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
+
+As always, you can run the tests using: `npm test`
diff --git a/node_modules/stylus/node_modules/sax/AUTHORS b/node_modules/stylus/node_modules/sax/AUTHORS
new file mode 100644
index 00000000..7145cbcd
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/AUTHORS
@@ -0,0 +1,10 @@
+# contributors sorted by whether or not they're me.
+Isaac Z. Schlueter <i@izs.me>
+Stein Martin Hustad <stein@hustad.com>
+Mikeal Rogers <mikeal.rogers@gmail.com>
+Laurie Harper <laurie@holoweb.net>
+Jann Horn <jann@Jann-PC.fritz.box>
+Elijah Insua <tmpvar@gmail.com>
+Henry Rawas <henryr@schakra.com>
+Justin Makeig <jmpublic@makeig.com>
+Mike Schilling <mike@emotive.com>
diff --git a/node_modules/stylus/node_modules/sax/LICENSE b/node_modules/stylus/node_modules/sax/LICENSE
new file mode 100644
index 00000000..62e4ccf9
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/LICENSE
@@ -0,0 +1,32 @@
+Copyright (c) Isaac Z. Schlueter ("Author")
+All rights reserved.
+
+The BSD License
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+The file "examples/strict.dtd" is licensed by the W3C and used according
+to the terms of the W3C SOFTWARE NOTICE AND LICENSE. See LICENSE-W3C.html
+for details.
diff --git a/node_modules/stylus/node_modules/sax/LICENSE-W3C.html b/node_modules/stylus/node_modules/sax/LICENSE-W3C.html
new file mode 100644
index 00000000..a611e3f9
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/LICENSE-W3C.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="generator" content="HTML Tidy for Mac OS X (vers 31 October 2006 - Apple Inc. build 13), see www.w3.org" /><title>W3C Software Notice and License</title><link rel="stylesheet" href="/2008/site/css/minimum" type="text/css" media="handheld, all" /><style type="text/css" media="print, screen and (min-width: 481px)" xml:space="preserve">
+ @import url("/2008/site/css/advanced");
+</style><link href="/2008/site/css/minimum" rel="stylesheet" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /><meta name="viewport" content="width=device-width" /><link rel="stylesheet" href="/2008/site/css/print" type="text/css" media="print" /><link rel="shortcut icon" href="/2008/site/images/favicon.ico" type="image/x-icon" /></head><body id="www-w3-org" class="w3c_public"><div id="w3c_container">
+
+
+
+ <div id="w3c_mast">
+ <h1 class="logo">
+ <a tabindex="2" accesskey="1" href="/"><img src="/2008/site/images/logo-w3c-mobile-lg" width="90" height="53" alt="W3C" /></a>
+ <span class="alt-logo">W3C</span>
+ </h1>
+
+ <div id="w3c_nav">
+
+
+
+ <form action="/Help/search" method="get" enctype="application/x-www-form-urlencoded"><div class="w3c_sec_nav"><!-- --></div><ul class="main_nav"><li class="first-item">
+ <a href="/standards/">Standards</a>
+ </li><li>
+ <a href="/participate/">Participate</a>
+ </li><li>
+ <a href="/Consortium/membership">Membership</a>
+ </li><li class="last-item">
+ <a href="/Consortium/">About W3C</a>
+ </li><li class="search-item">
+ <div id="search-form">
+ <input tabindex="3" class="text" name="q" value="" title="Search" type="text" />
+ <button id="search-submit" name="search-submit" type="submit"><img class="submit" src="/2008/site/images/search-button" alt="Search" width="21" height="17" /></button>
+ </div>
+ </li></ul></form>
+ </div>
+
+ </div>
+
+
+ <div id="w3c_main">
+ <div id="w3c_logo_shadow" class="w3c_leftCol">
+ <img height="32" alt="" src="/2008/site/images/logo-shadow" />
+ </div>
+
+ <div class="w3c_leftCol"><h2 class="offscreen">Site Navigation</h2>
+ <h3 class="category"><span class="ribbon"><a href="/Consortium/Legal/ipr-notice.html" title="Up to Policies and Legal Information">Policies and Legal Information <img src="/2008/site/images/header-link" alt="Header link" width="13" height="13" class="header-link" /></a></span></h3>
+ <ul class="theme">
+ <li><a href="/Consortium/Legal/2008/04-testsuite-copyright.html">Licenses for W3C Test Suites</a></li>
+ <li><a href="/2004/10/27-testcases.html">Policies for Contribution of Test Cases to W3C</a></li>
+ <li><a href="/Consortium/Legal/IPR-FAQ-20000620.html">Intellectual Rights FAQ</a></li>
+ <li><a href="/Consortium/Legal/privacy-statement-20000612.html">W3C Privacy Statements</a></li>
+ <li><a href="/Consortium/Legal/2002/copyright-documents-20021231.html">W3C Document License</a></li>
+ <li><a href="/Consortium/Legal/2002/trademarks-20021231.html">W3C Trademarks and Generic Terms</a></li>
+ <li><a href="/Consortium/Legal/2002/trademark-license-20021231.html">W3C&#xAE; Trademark and Service Mark License</a></li>
+ <li><a class="current">W3C Software Notice and License</a></li>
+ <li><a href="/Consortium/Legal/2002/collaborators-agreement-20021231.html">W3C Invited Expert and Collaborators Agreement</a></li>
+ <li><a href="/Consortium/Persistence.html">W3C URI Persistence Policy</a></li>
+ <li><a href="/1999/10/21-mirroring-policy.html">Mirroring the W3C Site</a></li>
+ <li><a href="/Consortium/Legal/2006/08-copyright-translations.html">Translations of the Copyright Notice</a></li>
+ </ul>
+ <br /></div>
+ <div class="w3c_mainCol">
+ <div id="w3c_crumbs">
+ <div id="w3c_crumbs_frame">
+ <ul class="bct"> <!-- .bct / Breadcrumbs -->
+ <li class="skip"><a tabindex="1" accesskey="2" title="Skip to content (e.g., when browsing via audio)" href="#w3c_content_body">Skip</a></li>
+ <li><a href="/">W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
+ <li><a href="/Consortium/">About&#xA0;W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
+ <li><a href="/Consortium/facts.html">Facts&#xA0;About&#xA0;W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
+ <li><a href="/Consortium/Legal/ipr-notice.html">Policies&#xA0;and&#xA0;Legal&#xA0;Information</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
+ <li class="current">W3C Software Notice and License</li>
+ </ul>
+ </div>
+ </div>
+ <h1 class="title">W3C Software Notice and License</h1>
+ <div id="w3c_content_body">
+ <div class="line">
+ <p class="intro tPadding">This work (and included software, documentation such as READMEs, or other
+related items) is being provided by the copyright holders under the following
+license.</p>
+<h2>License</h2>
+
+ <p class="tPadding">
+By obtaining, using and/or copying this work, you (the licensee)
+agree that you have read, understood, and will comply with the following
+terms and conditions.</p>
+
+ <p>Permission to copy, modify, and distribute this software and its
+documentation, with or without modification,&#xA0;for any purpose and without
+fee or royalty is hereby granted, provided that you include the following on
+ALL copies of the software and documentation or portions thereof, including
+modifications:</p>
+
+ <ul class="show_items"><li>The full text of this NOTICE in a location viewable to users of the
+ redistributed or derivative work.</li><li>Any pre-existing intellectual property disclaimers, notices, or terms
+ and conditions. If none exist, the <a href="copyright-software-short-notice-20021231.html">W3C Software Short
+ Notice</a> should be included (hypertext is preferred, text is permitted)
+ within the body of any redistributed or derivative code.</li><li>Notice of any changes or modifications to the files, including the date
+ changes were made. (We recommend you provide URIs to the location from
+ which the code is derived.)</li></ul>
+
+<h2>Disclaimers</h2>
+
+ <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
+ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+ <p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+DOCUMENTATION.</p>
+
+ <p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without specific, written
+prior permission. Title to copyright in this software and any associated
+documentation will at all times remain with copyright holders.</p>
+
+ <h2>Notes</h2>
+
+ <p>This version: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231</p>
+
+ <p>This formulation of W3C's notice and license became active on December 31
+2002. This version removes the copyright ownership notice such that this
+license can be used with materials other than those owned by the W3C,
+reflects that ERCIM is now a host of the W3C, includes references to this
+specific dated version of the license, and removes the ambiguous grant of
+"use". Otherwise, this version is the same as the <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980720">previous
+version</a> and is written so as to preserve the <a href="http://www.gnu.org/philosophy/license-list.html#GPLCompatibleLicenses">Free
+Software Foundation's assessment of GPL compatibility</a> and <a href="http://www.opensource.org/licenses/W3C.php">OSI's certification</a>
+under the <a href="http://www.opensource.org/docs/definition.php">Open Source
+Definition</a>.</p>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+
+ </div><div id="w3c_footer">
+ <div id="w3c_footer-inner">
+ <h2 class="offscreen">Footer Navigation</h2>
+ <div class="w3c_footer-nav">
+ <h3>Navigation</h3>
+ <ul class="footer_top_nav"><li>
+ <a href="/">Home</a>
+ </li><li>
+ <a href="/standards/">Standards</a>
+ </li><li>
+ <a href="/participate/">Participate</a>
+ </li><li>
+ <a href="/Consortium/membership">Membership</a>
+ </li><li class="last-item">
+ <a href="/Consortium/">About W3C</a>
+ </li></ul>
+ </div>
+ <div class="w3c_footer-nav">
+ <h3>Contact W3C</h3>
+ <ul class="footer_bottom_nav"><li>
+ <a href="/Consortium/contact">Contact</a>
+ </li><li>
+ <a accesskey="0" href="/Help/">Help and FAQ</a>
+ </li><li>
+ <a href="/Consortium/sponsor/">Sponsor / Donate</a>
+ </li><li>
+ <a href="/Consortium/siteindex">Site Map</a>
+ </li><li>
+ <address id="w3c_signature">
+ <a href="http://lists.w3.org/Archives/Public/site-comments/">Feedback</a></address>
+ </li></ul>
+ </div>
+ <div class="w3c_footer-nav">
+ <h3>W3C Updates</h3>
+ <ul class="footer_follow_nav"><li>
+ <a href="http://twitter.com/W3C" title="Follow W3C on Twitter">
+ <img src="/2008/site/images/twitter-bird" alt="Twitter" width="78" height="83" class="social-icon" />
+ </a>
+ <a href="http://identi.ca/w3c" title="See W3C on Identica">
+ <img src="/2008/site/images/identica-logo" alt="Identica" width="91" height="83" class="social-icon" />
+ </a>
+ </li></ul>
+ </div>
+ <p class="copyright">Copyright &#xA9; 2012 W3C <sup>&#xAE;</sup> (<a href="http://www.csail.mit.edu/">
+ <acronym title="Massachusetts Institute of Technology">MIT</acronym>
+ </a>, <a href="http://www.ercim.org/">
+ <acronym title="European Research Consortium for Informatics and Mathematics"> ERCIM</acronym>
+ </a>, <a href="http://www.keio.ac.jp/">Keio</a>) <a href="/Consortium/Legal/ipr-notice">Usage policies apply</a>.</p>
+ </div>
+ </div><!-- Generated from data/scripts.php, ../../smarty/{scripts.tpl} --><!-- At the bottom for performance reasons --><div id="w3c_scripts">
+ <script type="text/javascript" src="/2008/site/js/main" xml:space="preserve"><!-- --></script>
+ </div></body></html>
diff --git a/node_modules/stylus/node_modules/sax/README.md b/node_modules/stylus/node_modules/sax/README.md
new file mode 100644
index 00000000..c9652420
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/README.md
@@ -0,0 +1,216 @@
+# sax js
+
+A sax-style parser for XML and HTML.
+
+Designed with [node](http://nodejs.org/) in mind, but should work fine in
+the browser or other CommonJS implementations.
+
+## What This Is
+
+* A very simple tool to parse through an XML string.
+* A stepping stone to a streaming HTML parser.
+* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML
+ docs.
+
+## What This Is (probably) Not
+
+* An HTML Parser - That's a fine goal, but this isn't it. It's just
+ XML.
+* A DOM Builder - You can use it to build an object model out of XML,
+ but it doesn't do that out of the box.
+* XSLT - No DOM = no querying.
+* 100% Compliant with (some other SAX implementation) - Most SAX
+ implementations are in Java and do a lot more than this does.
+* An XML Validator - It does a little validation when in strict mode, but
+ not much.
+* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic
+ masochism.
+* A DTD-aware Thing - Fetching DTDs is a much bigger job.
+
+## Regarding `<!DOCTYPE`s and `<!ENTITY`s
+
+The parser will handle the basic XML entities in text nodes and attribute
+values: `&amp; &lt; &gt; &apos; &quot;`. It's possible to define additional
+entities in XML by putting them in the DTD. This parser doesn't do anything
+with that. If you want to listen to the `ondoctype` event, and then fetch
+the doctypes, and read the entities and add them to `parser.ENTITIES`, then
+be my guest.
+
+Unknown entities will fail in strict mode, and in loose mode, will pass
+through unmolested.
+
+## Usage
+
+ var sax = require("./lib/sax"),
+ strict = true, // set to false for html-mode
+ parser = sax.parser(strict);
+
+ parser.onerror = function (e) {
+ // an error happened.
+ };
+ parser.ontext = function (t) {
+ // got some text. t is the string of text.
+ };
+ parser.onopentag = function (node) {
+ // opened a tag. node has "name" and "attributes"
+ };
+ parser.onattribute = function (attr) {
+ // an attribute. attr has "name" and "value"
+ };
+ parser.onend = function () {
+ // parser stream is done, and ready to have more stuff written to it.
+ };
+
+ parser.write('<xml>Hello, <who name="world">world</who>!</xml>').close();
+
+ // stream usage
+ // takes the same options as the parser
+ var saxStream = require("sax").createStream(strict, options)
+ saxStream.on("error", function (e) {
+ // unhandled errors will throw, since this is a proper node
+ // event emitter.
+ console.error("error!", e)
+ // clear the error
+ this._parser.error = null
+ this._parser.resume()
+ })
+ saxStream.on("opentag", function (node) {
+ // same object as above
+ })
+ // pipe is supported, and it's readable/writable
+ // same chunks coming in also go out.
+ fs.createReadStream("file.xml")
+ .pipe(saxStream)
+ .pipe(fs.createWriteStream("file-copy.xml"))
+
+
+
+## Arguments
+
+Pass the following arguments to the parser function. All are optional.
+
+`strict` - Boolean. Whether or not to be a jerk. Default: `false`.
+
+`opt` - Object bag of settings regarding string formatting. All default to `false`.
+
+Settings supported:
+
+* `trim` - Boolean. Whether or not to trim text and comment nodes.
+* `normalize` - Boolean. If true, then turn any whitespace into a single
+ space.
+* `lowercase` - Boolean. If true, then lowercase tag names and attribute names
+ in loose mode, rather than uppercasing them.
+* `xmlns` - Boolean. If true, then namespaces are supported.
+* `position` - Boolean. If false, then don't track line/col/position.
+
+## Methods
+
+`write` - Write bytes onto the stream. You don't have to do this all at
+once. You can keep writing as much as you want.
+
+`close` - Close the stream. Once closed, no more data may be written until
+it is done processing the buffer, which is signaled by the `end` event.
+
+`resume` - To gracefully handle errors, assign a listener to the `error`
+event. Then, when the error is taken care of, you can call `resume` to
+continue parsing. Otherwise, the parser will not continue while in an error
+state.
+
+## Members
+
+At all times, the parser object will have the following members:
+
+`line`, `column`, `position` - Indications of the position in the XML
+document where the parser currently is looking.
+
+`startTagPosition` - Indicates the position where the current tag starts.
+
+`closed` - Boolean indicating whether or not the parser can be written to.
+If it's `true`, then wait for the `ready` event to write again.
+
+`strict` - Boolean indicating whether or not the parser is a jerk.
+
+`opt` - Any options passed into the constructor.
+
+`tag` - The current tag being dealt with.
+
+And a bunch of other stuff that you probably shouldn't touch.
+
+## Events
+
+All events emit with a single argument. To listen to an event, assign a
+function to `on<eventname>`. Functions get executed in the this-context of
+the parser object. The list of supported events are also in the exported
+`EVENTS` array.
+
+When using the stream interface, assign handlers using the EventEmitter
+`on` function in the normal fashion.
+
+`error` - Indication that something bad happened. The error will be hanging
+out on `parser.error`, and must be deleted before parsing can continue. By
+listening to this event, you can keep an eye on that kind of stuff. Note:
+this happens *much* more in strict mode. Argument: instance of `Error`.
+
+`text` - Text node. Argument: string of text.
+
+`doctype` - The `<!DOCTYPE` declaration. Argument: doctype string.
+
+`processinginstruction` - Stuff like `<?xml foo="blerg" ?>`. Argument:
+object with `name` and `body` members. Attributes are not parsed, as
+processing instructions have implementation dependent semantics.
+
+`sgmldeclaration` - Random SGML declarations. Stuff like `<!ENTITY p>`
+would trigger this kind of event. This is a weird thing to support, so it
+might go away at some point. SAX isn't intended to be used to parse SGML,
+after all.
+
+`opentag` - An opening tag. Argument: object with `name` and `attributes`.
+In non-strict mode, tag names are uppercased, unless the `lowercase`
+option is set. If the `xmlns` option is set, then it will contain
+namespace binding information on the `ns` member, and will have a
+`local`, `prefix`, and `uri` member.
+
+`closetag` - A closing tag. In loose mode, tags are auto-closed if their
+parent closes. In strict mode, well-formedness is enforced. Note that
+self-closing tags will have `closeTag` emitted immediately after `openTag`.
+Argument: tag name.
+
+`attribute` - An attribute node. Argument: object with `name` and `value`.
+In non-strict mode, attribute names are uppercased, unless the `lowercase`
+option is set. If the `xmlns` option is set, it will also contains namespace
+information.
+
+`comment` - A comment node. Argument: the string of the comment.
+
+`opencdata` - The opening tag of a `<![CDATA[` block.
+
+`cdata` - The text of a `<![CDATA[` block. Since `<![CDATA[` blocks can get
+quite large, this event may fire multiple times for a single block, if it
+is broken up into multiple `write()`s. Argument: the string of random
+character data.
+
+`closecdata` - The closing tag (`]]>`) of a `<![CDATA[` block.
+
+`opennamespace` - If the `xmlns` option is set, then this event will
+signal the start of a new namespace binding.
+
+`closenamespace` - If the `xmlns` option is set, then this event will
+signal the end of a namespace binding.
+
+`end` - Indication that the closed stream has ended.
+
+`ready` - Indication that the stream has reset, and is ready to be written
+to.
+
+`noscript` - In non-strict mode, `<script>` tags trigger a `"script"`
+event, and their contents are not checked for special xml characters.
+If you pass `noscript: true`, then this behavior is suppressed.
+
+## Reporting Problems
+
+It's best to write a failing test if you find an issue. I will always
+accept pull requests with failing tests if they demonstrate intended
+behavior, but it is very hard to figure out what issue you're describing
+without a test. Writing a test is also the best way for you yourself
+to figure out if you really understand the issue you think you have with
+sax-js.
diff --git a/node_modules/stylus/node_modules/sax/component.json b/node_modules/stylus/node_modules/sax/component.json
new file mode 100644
index 00000000..96b5d731
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/component.json
@@ -0,0 +1,12 @@
+{
+ "name": "sax",
+ "description": "An evented streaming XML parser in JavaScript",
+ "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
+ "version": "0.5.2",
+ "main": "lib/sax.js",
+ "license": "BSD",
+ "scripts": [
+ "lib/sax.js"
+ ],
+ "repository": "git://github.com/isaacs/sax-js.git"
+}
diff --git a/node_modules/stylus/node_modules/sax/examples/big-not-pretty.xml b/node_modules/stylus/node_modules/sax/examples/big-not-pretty.xml
new file mode 100644
index 00000000..fb5265dd
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/big-not-pretty.xml
@@ -0,0 +1,8002 @@
+<big>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+</big>
diff --git a/node_modules/stylus/node_modules/sax/examples/example.js b/node_modules/stylus/node_modules/sax/examples/example.js
new file mode 100644
index 00000000..7b0246e9
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/example.js
@@ -0,0 +1,29 @@
+
+var fs = require("fs"),
+ util = require("util"),
+ path = require("path"),
+ xml = fs.readFileSync(path.join(__dirname, "test.xml"), "utf8"),
+ sax = require("../lib/sax"),
+ strict = sax.parser(true),
+ loose = sax.parser(false, {trim:true}),
+ inspector = function (ev) { return function (data) {
+ console.error("%s %s %j", this.line+":"+this.column, ev, data);
+ }};
+
+sax.EVENTS.forEach(function (ev) {
+ loose["on"+ev] = inspector(ev);
+});
+loose.onend = function () {
+ console.error("end");
+ console.error(loose);
+};
+
+// do this in random bits at a time to verify that it works.
+(function () {
+ if (xml) {
+ var c = Math.ceil(Math.random() * 1000)
+ loose.write(xml.substr(0,c));
+ xml = xml.substr(c);
+ process.nextTick(arguments.callee);
+ } else loose.close();
+})();
diff --git a/node_modules/stylus/node_modules/sax/examples/get-products.js b/node_modules/stylus/node_modules/sax/examples/get-products.js
new file mode 100644
index 00000000..9e8d74aa
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/get-products.js
@@ -0,0 +1,58 @@
+// pull out /GeneralSearchResponse/categories/category/items/product tags
+// the rest we don't care about.
+
+var sax = require("../lib/sax.js")
+var fs = require("fs")
+var path = require("path")
+var xmlFile = path.resolve(__dirname, "shopping.xml")
+var util = require("util")
+var http = require("http")
+
+fs.readFile(xmlFile, function (er, d) {
+ http.createServer(function (req, res) {
+ if (er) throw er
+ var xmlstr = d.toString("utf8")
+
+ var parser = sax.parser(true)
+ var products = []
+ var product = null
+ var currentTag = null
+
+ parser.onclosetag = function (tagName) {
+ if (tagName === "product") {
+ products.push(product)
+ currentTag = product = null
+ return
+ }
+ if (currentTag && currentTag.parent) {
+ var p = currentTag.parent
+ delete currentTag.parent
+ currentTag = p
+ }
+ }
+
+ parser.onopentag = function (tag) {
+ if (tag.name !== "product" && !product) return
+ if (tag.name === "product") {
+ product = tag
+ }
+ tag.parent = currentTag
+ tag.children = []
+ tag.parent && tag.parent.children.push(tag)
+ currentTag = tag
+ }
+
+ parser.ontext = function (text) {
+ if (currentTag) currentTag.children.push(text)
+ }
+
+ parser.onend = function () {
+ var out = util.inspect(products, false, 3, true)
+ res.writeHead(200, {"content-type":"application/json"})
+ res.end("{\"ok\":true}")
+ // res.end(JSON.stringify(products))
+ }
+
+ parser.write(xmlstr).end()
+ }).listen(1337)
+})
diff --git a/node_modules/stylus/node_modules/sax/examples/hello-world.js b/node_modules/stylus/node_modules/sax/examples/hello-world.js
new file mode 100644
index 00000000..cbfa5184
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/hello-world.js
@@ -0,0 +1,4 @@
+require("http").createServer(function (req, res) {
+ res.writeHead(200, {"content-type":"application/json"})
+ res.end(JSON.stringify({ok: true}))
+}).listen(1337)
diff --git a/node_modules/stylus/node_modules/sax/examples/not-pretty.xml b/node_modules/stylus/node_modules/sax/examples/not-pretty.xml
new file mode 100644
index 00000000..9592852d
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/not-pretty.xml
@@ -0,0 +1,8 @@
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
diff --git a/node_modules/stylus/node_modules/sax/examples/pretty-print.js b/node_modules/stylus/node_modules/sax/examples/pretty-print.js
new file mode 100644
index 00000000..cd6aca9e
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/pretty-print.js
@@ -0,0 +1,74 @@
+var sax = require("../lib/sax")
+ , printer = sax.createStream(false, {lowercasetags:true, trim:true})
+ , fs = require("fs")
+
+function entity (str) {
+ return str.replace('"', '&quot;')
+}
+
+printer.tabstop = 2
+printer.level = 0
+printer.indent = function () {
+ print("\n")
+ for (var i = this.level; i > 0; i --) {
+ for (var j = this.tabstop; j > 0; j --) {
+ print(" ")
+ }
+ }
+}
+printer.on("opentag", function (tag) {
+ this.indent()
+ this.level ++
+ print("<"+tag.name)
+ for (var i in tag.attributes) {
+ print(" "+i+"=\""+entity(tag.attributes[i])+"\"")
+ }
+ print(">")
+})
+
+printer.on("text", ontext)
+printer.on("doctype", ontext)
+function ontext (text) {
+ this.indent()
+ print(text)
+}
+
+printer.on("closetag", function (tag) {
+ this.level --
+ this.indent()
+ print("</"+tag+">")
+})
+
+printer.on("cdata", function (data) {
+ this.indent()
+ print("<![CDATA["+data+"]]>")
+})
+
+printer.on("comment", function (comment) {
+ this.indent()
+ print("<!--"+comment+"-->")
+})
+
+printer.on("error", function (error) {
+ console.error(error)
+ throw error
+})
+
+if (!process.argv[2]) {
+ throw new Error("Please provide an xml file to prettify\n"+
+ "TODO: read from stdin or take a file")
+}
+var xmlfile = require("path").join(process.cwd(), process.argv[2])
+var fstr = fs.createReadStream(xmlfile, { encoding: "utf8" })
+
+function print (c) {
+ if (!process.stdout.write(c)) {
+ fstr.pause()
+ }
+}
+
+process.stdout.on("drain", function () {
+ fstr.resume()
+})
+
+fstr.pipe(printer)
diff --git a/node_modules/stylus/node_modules/sax/examples/shopping.xml b/node_modules/stylus/node_modules/sax/examples/shopping.xml
new file mode 100644
index 00000000..223c6c66
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/shopping.xml
@@ -0,0 +1,2 @@
+
+<GeneralSearchResponse xmlns="urn:types.partner.api.shopping.com"><serverDetail><apiEnv>sandbox</apiEnv><apiVersion>3.1 r31.Kadu4DC.phase3</apiVersion><buildNumber>5778</buildNumber><buildTimestamp>2011.10.06 15:37:23 PST</buildTimestamp><requestId>p2.a121bc2aaf029435dce6</requestId><timestamp>2011-10-21T18:38:45.982-04:00</timestamp><responseTime>P0Y0M0DT0H0M0.169S</responseTime></serverDetail><exceptions exceptionCount="1"><exception type="warning"><code>1112</code><message>You are currently using the SDC API sandbox environment! No clicks to merchant URLs from this response will be paid. Please change the host of your API requests to 'publisher.api.shopping.com' when you have finished development and testing</message></exception></exceptions><clientTracking height="19" type="logo" width="106"><sourceURL>http://statTest.dealtime.com/pixel/noscript?PV_EvnTyp=APPV&amp;APPV_APITSP=10%2F21%2F11_06%3A38%3A45_PM&amp;APPV_DSPRQSID=p2.a121bc2aaf029435dce6&amp;APPV_IMGURL=http://img.shopping.com/sc/glb/sdc_logo_106x19.gif&amp;APPV_LI_LNKINID=7000610&amp;APPV_LI_SBMKYW=nikon&amp;APPV_MTCTYP=1000&amp;APPV_PRTID=2002&amp;APPV_BrnID=14804</sourceURL><hrefURL>http://www.shopping.com/digital-cameras/products</hrefURL><titleText>Digital Cameras</titleText><altText>Digital Cameras</altText></clientTracking><searchHistory><categorySelection id="3"><name>Electronics</name><categoryURL>http://www.shopping.com/xCH-electronics-nikon~linkin_id-7000610?oq=nikon</categoryURL></categorySelection><categorySelection id="449"><name>Cameras and Photography</name><categoryURL>http://www.shopping.com/xCH-cameras_and_photography-nikon~linkin_id-7000610?oq=nikon</categoryURL></categorySelection><categorySelection id="7185"><name>Digital Cameras</name><categoryURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</categoryURL></categorySelection><dynamicNavigationHistory><keywordSearch dropped="false" modified="false"><originalKeyword>nikon</originalKeyword><resultKeyword>nikon</resultKeyword></keywordSearch></dynamicNavigationHistory></searchHistory><categories matchedCategoryCount="1" returnedCategoryCount="1"><category id="7185"><name>Digital Cameras</name><categoryURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</categoryURL><items matchedItemCount="322" pageNumber="1" returnedItemCount="5"><product id="101677489"><name>Nikon D3100 Digital Camera</name><shortDescription>14.2 Megapixel, SLR Camera, 3 in. LCD Screen, With High Definition Video, Weight: 1 lb.</shortDescription><fullDescription>The Nikon D3100 digital SLR camera speaks to the growing ranks of enthusiastic D-SLR users and aspiring photographers by providing an easy-to-use and affordable entrance to the world of Nikon D-SLR’s. The 14.2-megapixel D3100 has powerful features, such as the enhanced Guide Mode that makes it easy to unleash creative potential and capture memories with still images and full HD video. Like having a personal photo tutor at your fingertips, this unique feature provides a simple graphical interface on the camera’s LCD that guides users by suggesting and/or adjusting camera settings to achieve the desired end result images. The D3100 is also the world’s first D-SLR to introduce full time auto focus (AF) in Live View and D-Movie mode to effortlessly achieve the critical focus needed when shooting Full HD 1080p video.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="500" width="606"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-606x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></images><rating><reviewCount>9</reviewCount><rating>4.56</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_4.5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D3100/reviews~linkin_id-7000610</reviewURL></rating><minPrice>429.00</minPrice><maxPrice>1360.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D3100/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D3100/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="64" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="-ZW6BMZqz6fbS-aULwga_g==" smartBuy="false" used="false"><name>Nikon D3100 Digital SLR Camera with 18-55mm NIKKOR VR Lens</name><description>The Nikon D3100 Digital SLR Camera is an affordable compact and lightweight photographic power-house. It features the all-purpose 18-55mm VR lens a high-resolution 14.2 MP CMOS sensor along with a feature set that's comprehensive yet easy to navigate - the intuitive onboard learn-as-you grow guide mode allows the photographer to understand what the 3100 can do quickly and easily. Capture beautiful pictures and amazing Full HD 1080p movies with sound and full-time autofocus. Availabilty: In Stock!</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="350" width="350"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-350x350-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Free Shipping with Any Purchase!</storeNotes><basePrice currency="USD">529.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">799.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=647&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=475674&amp;crawler_id=475674&amp;dealId=-ZW6BMZqz6fbS-aULwga_g%3D%3D&amp;url=http%3A%2F%2Fwww.fumfie.com%2Fproduct%2F343.5%2Fshopping-com%3F&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+Digital+SLR+Camera+with+18-55mm+NIKKOR+VR+Lens&amp;dlprc=529.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=1&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=1&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=658&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475674" trusted="true"><name>FumFie</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475674.gif</sourceURL></logo><phoneNumber>866 666 9198</phoneNumber><ratingInfo><reviewCount>560</reviewCount><rating>4.27</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_fumfie~MRD-475674~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>F343C5</sku></offer><offer featured="false" id="md1e9lD8vdOu4FHQfJqKng==" smartBuy="false" used="false"><name>Nikon Nikon D3100 14.2MP Digital SLR Camera with 18-55mm f/3.5-5.6 AF-S DX VR, Cameras</name><description>Nikon D3100 14.2MP Digital SLR Camera with 18-55mm f/3.5-5.6 AF-S DX VR</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="352" width="385"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-385x352-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">549.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=779&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=305814&amp;crawler_id=305814&amp;dealId=md1e9lD8vdOu4FHQfJqKng%3D%3D&amp;url=http%3A%2F%2Fwww.electronics-expo.com%2Findex.php%3Fpage%3Ditem%26id%3DNIKD3100%26source%3DSideCar%26scpid%3D8%26scid%3Dscsho318727%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Nikon+D3100+14.2MP+Digital+SLR+Camera+with+18-55mm+f%2F3.5-5.6+AF-S+DX+VR%2C+Cameras&amp;dlprc=549.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=9&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=9&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=771&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="305814" trusted="true"><name>Electronics Expo</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/305814.gif</sourceURL></logo><phoneNumber>1-888-707-EXPO</phoneNumber><ratingInfo><reviewCount>371</reviewCount><rating>3.90</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_4.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_electronics_expo~MRD-305814~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>NIKD3100</sku></offer><offer featured="false" id="yYuaXnDFtCY7rDUjkY2aaw==" smartBuy="false" used="false"><name>Nikon D3100 14.2-Megapixel Digital SLR Camera With 18-55mm Zoom-Nikkor Lens, Black</name><description>Split-second shutter response captures shots other cameras may have missed Helps eliminate the frustration of shutter delay! 14.2-megapixels for enlargements worth framing and hanging. Takes breathtaking 1080p HD movies. ISO sensitivity from 100-1600 for bright or dimly lit settings. 3.0in. color LCD for beautiful, wide-angle framing and viewing. In-camera image editing lets you retouch with no PC. Automatic scene modes include Child, Sports, Night Portrait and more. Accepts SDHC memory cards. Nikon D3100 14.2-Megapixel Digital SLR Camera With 18-55mm Zoom-Nikkor Lens, Black is one of many Digital SLR Cameras available through Office Depot. Made by Nikon.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="250" width="250"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-250x250-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">699.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=698&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=467671&amp;crawler_id=467671&amp;dealId=yYuaXnDFtCY7rDUjkY2aaw%3D%3D&amp;url=http%3A%2F%2Flink.mercent.com%2Fredirect.ashx%3Fmr%3AmerchantID%3DOfficeDepot%26mr%3AtrackingCode%3DCEC9669E-6ABC-E011-9F24-0019B9C043EB%26mr%3AtargetUrl%3Dhttp%3A%2F%2Fwww.officedepot.com%2Fa%2Fproducts%2F486292%2FNikon-D3100-142-Megapixel-Digital-SLR%2F%253fcm_mmc%253dMercent-_-Shopping-_-Cameras_and_Camcorders-_-486292&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+14.2-Megapixel+Digital+SLR+Camera+With+18-55mm+Zoom-Nikkor+Lens%2C+Black&amp;dlprc=549.99&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=10&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=10&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=690&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="467671" trusted="true"><name>Office Depot</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/467671.gif</sourceURL></logo><phoneNumber>1-800-GO-DEPOT</phoneNumber><ratingInfo><reviewCount>135</reviewCount><rating>2.37</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_office_depot_4158555~MRD-467671~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>486292</sku></offer><offer featured="false" id="Rl56U7CuiTYsH4MGZ02lxQ==" smartBuy="false" used="false"><name>Nikon® D3100™ 14.2MP Digital SLR with 18-55mm Lens</name><description>The Nikon D3100 DSLR will surprise you with its simplicity and impress you with superb results.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">549.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=Rl56U7CuiTYsH4MGZ02lxQ%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D903483107%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D3100%E2%84%A2+14.2MP+Digital+SLR+with+18-55mm+Lens&amp;dlprc=549.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=11&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=11&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>9614867</sku></offer><offer featured="false" id="huS6xZKDKaKMTMP71eI6DA==" smartBuy="false" used="false"><name>Nikon D3100 SLR w/Nikon 18-55mm VR &amp; 55-200mm VR Lenses</name><description>14.2 Megapixels3" LCDLive ViewHD 1080p Video w/ Sound &amp; Autofocus11-point Autofocus3 Frames per Second ShootingISO 100 to 3200 (Expand to 12800-Hi2)Self Cleaning SensorEXPEED 2, Image Processing EngineScene Recognition System</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="345" width="345"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-345x345-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">695.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">695.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=huS6xZKDKaKMTMP71eI6DA%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D32983%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+SLR+w%2FNikon+18-55mm+VR+%26+55-200mm+VR+Lenses&amp;dlprc=695.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=15&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=15&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>32983</sku></offer></offers></product><product id="95397883"><name>Nikon COOLPIX S203 Digital Camera</name><shortDescription>10 Megapixel, Ultra-Compact Camera, 2.5 in. LCD Screen, 3x Optical Zoom, With Video Capability, Weight: 0.23 lb.</shortDescription><fullDescription>With 10.34 mega pixel, electronic VR vibration reduction, 5-level brightness adjustment, 3x optical zoom, and TFT LCD, Nikon Coolpix s203 fulfills all the demands of any photographer. The digital camera has an inbuilt memory of 44MB and an external memory slot made for all kinds of SD (Secure Digital) cards.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="499" width="500"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-500x499-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></images><rating><reviewCount>0</reviewCount></rating><minPrice>139.00</minPrice><maxPrice>139.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-Coolpix-S203/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-Coolpix-S203/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="1" pageNumber="1" returnedOfferCount="1"><offer featured="false" id="sBd2JnIEPM-A_lBAM1RZgQ==" smartBuy="false" used="false"><name>Nikon Coolpix S203 Digital Camera (Red)</name><description>With 10.34 mega pixel, electronic VR vibration reduction, 5-level brightness adjustment, 3x optical zoom, and TFT LCD, Nikon Coolpix s203 fulfills all the demands of any photographer. The digital camera has an inbuilt memory of 44MB and an external memory slot made for all kinds of SD (Secure Digital) cards.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Fantastic prices with ease &amp; comfort of Amazon.com!</storeNotes><basePrice currency="USD">139.00</basePrice><shippingCost currency="USD">9.50</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=566&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=301531&amp;crawler_id=1903313&amp;dealId=sBd2JnIEPM-A_lBAM1RZgQ%3D%3D&amp;url=http%3A%2F%2Fwww.amazon.com%2Fdp%2FB002T964IM%2Fref%3Dasc_df_B002T964IM1751618%3Fsmid%3DA22UHVNXG98FAT%26tag%3Ddealtime-ce-mp01feed-20%26linkCode%3Dasn%26creative%3D395105%26creativeASIN%3DB002T964IM&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Coolpix+S203+Digital+Camera+%28Red%29&amp;dlprc=139.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=63&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=95397883&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=63&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=518&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="301531" trusted="false"><name>Amazon Marketplace</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/301531.gif</sourceURL></logo><ratingInfo><reviewCount>213</reviewCount><rating>2.73</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_amazon_marketplace_9689~MRD-301531~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>B002T964IM</sku></offer></offers></product><product id="106834268"><name>Nikon S3100 Digital Camera</name><shortDescription>14.5 Megapixel, Compact Camera, 2.7 in. LCD Screen, 5x Optical Zoom, With High Definition Video, Weight: 0.23 lb.</shortDescription><fullDescription>This digital camera features a wide-angle optical Zoom-NIKKOR glass lens that allows you to capture anything from landscapes to portraits to action shots. The high-definition movie mode with one-touch recording makes it easy to capture video clips.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="387" width="507"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-507x387-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></images><rating><reviewCount>1</reviewCount><rating>2.00</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_2.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/nikon-s3100/reviews~linkin_id-7000610</reviewURL></rating><minPrice>99.95</minPrice><maxPrice>134.95</maxPrice><productOffersURL>http://www.shopping.com/nikon-s3100/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/nikon-s3100/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="67" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="UUyGoqV8r0-xrkn-rnGNbg==" smartBuy="false" used="false"><name>CoolPix S3100 14 Megapixel Compact Digital Camera- Red</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - red</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=UUyGoqV8r0-xrkn-rnGNbg%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJ3Yx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmDAJeU1oyGG0GcBdhGwUGCAVqYF9SO0xSN1sZdmA7dmMdBQAJB24qX1NbQxI6AjA2ME5dVFULPDsGPFcQTTdaLTA6SR0OFlQvPAwMDxYcYlxIVkcoLTcCDA%3D%3D%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=CoolPix+S3100+14+Megapixel+Compact+Digital+Camera-+Red&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=28&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=28&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337013000</sku></offer><offer featured="false" id="X87AwXlW1dXoMXk4QQDToQ==" smartBuy="false" used="false"><name>COOLPIX S3100 Pink</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - pink</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=X87AwXlW1dXoMXk4QQDToQ%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJxYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcUFxDEGsPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=COOLPIX+S3100+Pink&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=31&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=31&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337015000</sku></offer><offer featured="false" id="nvFwnpfA4rlA1Dbksdsa0w==" smartBuy="false" used="false"><name>Nikon Coolpix S3100 14.0 MP Digital Camera - Silver</name><description>Nikon Coolpix S3100 14.0 MP Digital Camera - Silver</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="270" width="270"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-270x270-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">109.97</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">109.97</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=803&amp;BEFID=7185&amp;aon=%5E&amp;MerchantID=475774&amp;crawler_id=475774&amp;dealId=nvFwnpfA4rlA1Dbksdsa0w%3D%3D&amp;url=http%3A%2F%2Fwww.thewiz.com%2Fcatalog%2Fproduct.jsp%3FmodelNo%3DS3100SILVER%26gdftrk%3DgdfV2677_a_7c996_a_7c4049_a_7c26262&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Coolpix+S3100+14.0+MP+Digital+Camera+-+Silver&amp;dlprc=109.97&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=33&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=33&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=797&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475774" trusted="false"><name>TheWiz.com</name><logo available="false" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475774.gif</sourceURL></logo><phoneNumber>877-542-6988</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>26262</sku></offer><offer featured="false" id="5GtaN2NeryKwps-Se2l-4g==" smartBuy="false" used="false"><name>Nikon� COOLPIX� S3100 14MP Digital Camera (Silver)</name><description>The Nikon COOLPIX S3100 is the easy way to share your life and stay connected.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">119.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">119.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=5GtaN2NeryKwps-Se2l-4g%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D848064082%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C3%AF%C2%BF%C2%BD+COOLPIX%C3%AF%C2%BF%C2%BD+S3100+14MP+Digital+Camera+%28Silver%29&amp;dlprc=119.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=37&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=37&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=509&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>10101095</sku></offer><offer featured="false" id="a43m0RXulX38zCnQjU59jw==" smartBuy="false" used="false"><name>COOLPIX S3100 Yellow</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - yellow</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=a43m0RXulX38zCnQjU59jw%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJwYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcUFxDEGoPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=COOLPIX+S3100+Yellow&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=38&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=38&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337014000</sku></offer></offers></product><product id="99671132"><name>Nikon D90 Digital Camera</name><shortDescription>12.3 Megapixel, Point and Shoot Camera, 3 in. LCD Screen, With Video Capability, Weight: 1.36 lb.</shortDescription><fullDescription>Untitled Document Nikon D90 SLR Digital Camera With 28-80mm 75-300mm Lens Kit The Nikon D90 SLR Digital Camera, with its 12.3-megapixel DX-format CMOS, 3" High resolution LCD display, Scene Recognition System, Picture Control, Active D-Lighting, and one-button Live View, provides photo enthusiasts with the image quality and performance they need to pursue their own vision while still being intuitive enough for use as an everyday camera.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="255" width="499"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-499x255-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></images><rating><reviewCount>7</reviewCount><rating>5.00</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/reviews~linkin_id-7000610</reviewURL></rating><minPrice>689.00</minPrice><maxPrice>2299.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="43" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="GU5JJkpUAxe5HujB7fkwAA==" smartBuy="false" used="false"><name>Nikon® D90 12.3MP Digital SLR Camera (Body Only)</name><description>The Nikon D90 will make you rethink what a digital SLR camera can achieve.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1015.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1015.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=GU5JJkpUAxe5HujB7fkwAA%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D851830266%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D90+12.3MP+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=1015.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=14&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=14&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>10148659</sku></offer><offer featured="false" id="XhURuSC-spBbTIDfo4qfzQ==" smartBuy="false" used="false"><name>Nikon D90 SLR Digital Camera (Camera Body)</name><description>The Nikon D90 SLR Digital Camera with its 12.3-megapixel DX-format CCD 3" High resolution LCD display Scene Recognition System Picture Control Active D-Lighting and one-button Live View provides photo enthusiasts with the image quality and performance they need to pursue their own vision while still being intuitive enough for use as an everyday camera. In addition the D90 introduces the D-Movie mode allowing for the first time an interchangeable lens SLR camera that is capable of recording 720p HD movie clips. Availabilty: In Stock</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="350" width="350"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-350x350-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Free Shipping with Any Purchase!</storeNotes><basePrice currency="USD">689.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">900.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=647&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=475674&amp;crawler_id=475674&amp;dealId=XhURuSC-spBbTIDfo4qfzQ%3D%3D&amp;url=http%3A%2F%2Fwww.fumfie.com%2Fproduct%2F169.5%2Fshopping-com%3F&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+Digital+Camera+%28Camera+Body%29&amp;dlprc=689.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=16&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=16&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=658&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475674" trusted="true"><name>FumFie</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475674.gif</sourceURL></logo><phoneNumber>866 666 9198</phoneNumber><ratingInfo><reviewCount>560</reviewCount><rating>4.27</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_fumfie~MRD-475674~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>F169C5</sku></offer><offer featured="false" id="o0Px_XLWDbrxAYRy3rCmyQ==" smartBuy="false" used="false"><name>Nikon D90 SLR w/Nikon 18-105mm VR &amp; 55-200mm VR Lenses</name><description>12.3 MegapixelDX Format CMOS Sensor3" VGA LCD DisplayLive ViewSelf Cleaning SensorD-Movie ModeHigh Sensitivity (ISO 3200)4.5 fps BurstIn-Camera Image Editing</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1189.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1189.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=o0Px_XLWDbrxAYRy3rCmyQ%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D30619%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+w%2FNikon+18-105mm+VR+%26+55-200mm+VR+Lenses&amp;dlprc=1189.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=20&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=20&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>30619</sku></offer><offer featured="false" id="4HgbWJSJ8ssgIf8B0MXIwA==" smartBuy="false" used="false"><name>Nikon D90 12.3 Megapixel Digital SLR Camera (Body Only)</name><description>Fusing 12.3 megapixel image quality and a cinematic 24fps D-Movie Mode, the Nikon D90 exceeds the demands of passionate photographers. Coupled with Nikon's EXPEED image processing technologies and NIKKOR optics, breathtaking image fidelity is assured. Combined with fast 0.15ms power-up and split-second 65ms shooting lag, dramatic action and decisive moments are captured easily. Effective 4-frequency, ultrasonic sensor cleaning frees image degrading dust particles from the sensor's optical low pass filter.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>FREE FEDEX 2-3 DAY DELIVERY</storeNotes><basePrice currency="USD">899.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">899.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=269&amp;BEFID=7185&amp;aon=%5E&amp;MerchantID=9296&amp;crawler_id=811558&amp;dealId=4HgbWJSJ8ssgIf8B0MXIwA%3D%3D&amp;url=http%3A%2F%2Fwww.pcnation.com%2Foptics-gallery%2Fdetails.asp%3Faffid%3D305%26item%3D2N145P&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+12.3+Megapixel+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=899.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=21&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=21&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=257&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="9296" trusted="true"><name>PCNation</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/9296.gif</sourceURL></logo><phoneNumber>800-470-7079</phoneNumber><ratingInfo><reviewCount>1622</reviewCount><rating>4.43</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_pcnation_9689~MRD-9296~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>2N145P</sku></offer><offer featured="false" id="UNDa3uMDZXOnvD_7sTILYg==" smartBuy="false" used="false"><name>Nikon D90 12.3MP Digital SLR Camera (Body Only)</name><description>Fusing 12.3-megapixel image quality inherited from the award-winning D300 with groundbreaking features, the D90's breathtaking, low-noise image quality is further advanced with EXPEED image processing. Split-second shutter response and continuous shooting at up to 4.5 frames-per-second provide the power to capture fast action and precise moments perfectly, while Nikon's exclusive Scene Recognition System contributes to faster 11-area autofocus performance, finer white balance detection and more. The D90 delivers the control passionate photographers demand, utilizing comprehensive exposure functions and the intelligence of 3D Color Matrix Metering II. Stunning results come to life on a 3-inch 920,000-dot color LCD monitor, providing accurate image review, Live View composition and brilliant playback of the D90's cinematic-quality 24-fps HD D-Movie mode.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Fantastic prices with ease &amp; comfort of Amazon.com!</storeNotes><basePrice currency="USD">780.00</basePrice><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">780.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=566&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=301531&amp;crawler_id=1903313&amp;dealId=UNDa3uMDZXOnvD_7sTILYg%3D%3D&amp;url=http%3A%2F%2Fwww.amazon.com%2Fdp%2FB001ET5U92%2Fref%3Dasc_df_B001ET5U921751618%3Fsmid%3DAHF4SYKP09WBH%26tag%3Ddealtime-ce-mp01feed-20%26linkCode%3Dasn%26creative%3D395105%26creativeASIN%3DB001ET5U92&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+12.3MP+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=780.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=29&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=29&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=520&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="301531" trusted="false"><name>Amazon Marketplace</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/301531.gif</sourceURL></logo><ratingInfo><reviewCount>213</reviewCount><rating>2.73</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_amazon_marketplace_9689~MRD-301531~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>B001ET5U92</sku></offer></offers></product><product id="70621646"><name>Nikon D90 Digital Camera with 18-105mm lens</name><shortDescription>12.9 Megapixel, SLR Camera, 3 in. LCD Screen, 5.8x Optical Zoom, With Video Capability, Weight: 2.3 lb.</shortDescription><fullDescription>Its 12.3 megapixel DX-format CMOS image sensor and EXPEED image processing system offer outstanding image quality across a wide ISO light sensitivity range. Live View mode lets you compose and shoot via the high-resolution 3-inch LCD monitor, and an advanced Scene Recognition System and autofocus performance help capture images with astounding accuracy. Movies can be shot in Motion JPEG format using the D-Movie function. The camera’s large image sensor ensures exceptional movie image quality and you can create dramatic effects by shooting with a wide range of interchangeable NIKKOR lenses, from wide-angle to macro to fisheye, or by adjusting the lens aperture and experimenting with depth-of-field. The D90 – designed to fuel your passion for photography.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="489" width="490"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-490x489-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></images><rating><reviewCount>32</reviewCount><rating>4.81</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/reviews~linkin_id-7000610</reviewURL></rating><minPrice>849.95</minPrice><maxPrice>1599.95</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="25" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="3o5e1VghgJPfhLvT1JFKTA==" smartBuy="false" used="false"><name>Nikon D90 18-105mm VR Lens</name><description>The Nikon D90 SLR Digital Camera with its 12.3-megapixel DX-format CMOS 3" High resolution LCD display Scene Recognition System Picture Control Active D-Lighting and one-button Live View prov</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="260" width="260"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-260x260-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">849.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">849.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=419&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=9390&amp;crawler_id=1905054&amp;dealId=3o5e1VghgJPfhLvT1JFKTA%3D%3D&amp;url=http%3A%2F%2Fwww.ajrichard.com%2FNikon-D90-18-105mm-VR-Lens%2Fp-292%3Frefid%3DShopping%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+18-105mm+VR+Lens&amp;dlprc=849.95&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=2&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=2&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=425&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="9390" trusted="false"><name>AJRichard</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/9390.gif</sourceURL></logo><phoneNumber>1-888-871-1256</phoneNumber><ratingInfo><reviewCount>3124</reviewCount><rating>4.48</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_ajrichard~MRD-9390~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>292</sku></offer><offer featured="false" id="_lYWj_jbwfsSkfcwUcDuww==" smartBuy="false" used="false"><name>Nikon D90 SLR w/Nikon 18-105mm VR Lens</name><description>12.3 MegapixelDX Format CMOS Sensor3" VGA LCD DisplayLive ViewSelf Cleaning SensorD-Movie ModeHigh Sensitivity (ISO 3200)4.5 fps BurstIn-Camera Image Editing</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">909.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">909.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=_lYWj_jbwfsSkfcwUcDuww%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D30971%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+w%2FNikon+18-105mm+VR+Lens&amp;dlprc=909.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=3&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=3&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>30971</sku></offer><offer featured="false" id="1KCclCGuWvty2XKU9skadg==" smartBuy="false" used="false"><name>25448/D90 12.3 Megapixel Digital Camera 18-105mm Zoom Lens w/ 3" Screen - Black</name><description>Nikon D90 - Digital camera - SLR - 12.3 Mpix - Nikon AF-S DX 18-105mm lens - optical zoom: 5.8 x - supported memory: SD, SDHC</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">1199.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">8.20</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1199.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=1KCclCGuWvty2XKU9skadg%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBRtFXpzYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcVlhCGGkPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=25448%2FD90+12.3+Megapixel+Digital+Camera+18-105mm+Zoom+Lens+w%2F+3%22+Screen+-+Black&amp;dlprc=1199.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=4&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=4&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=586&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00353197000</sku></offer><offer featured="false" id="3-VOSfVV5Jo7HlA4kJtanA==" smartBuy="false" used="false"><name>Nikon® D90 12.3MP Digital SLR with 18-105mm Lens</name><description>The Nikon D90 will make you rethink what a digital SLR camera can achieve.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1350.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1350.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=3-VOSfVV5Jo7HlA4kJtanA%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D982673361%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D90+12.3MP+Digital+SLR+with+18-105mm+Lens&amp;dlprc=1350.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=5&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=5&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>11148905</sku></offer><offer featured="false" id="kQnB6rS4AjN5dx5h2_631g==" smartBuy="false" used="false"><name>Nikon D90 Kit 12.3-megapixel Digital SLR with 18-105mm VR Lens</name><description>Photographers, take your passion further!Now is the time for new creativity, and to rethink what a digital SLR camera can achieve. It's time for the D90, a camera with everything you would expect from Nikon's next-generation D-SLRs, and some unexpected surprises, as well. The stunning image quality is inherited from the D300, Nikon's DX-format flagship. The D90 also has Nikon's unmatched ergonomics and high performance, and now takes high-quality movies with beautifully cinematic results. The world of photography has changed, and with the D90 in your hands, it's time to make your own rules.AF-S DX NIKKOR 18-105mm f/3.5-5.6G ED VR LensWide-ratio 5.8x zoom Compact, versatile and ideal for a broad range of shooting situations, ranging from interiors and landscapes to beautiful portraits� a perfect everyday zoom. Nikon VR (Vibration Reduction) image stabilization Vibration Reduction is engineered specifically for each VR NIKKOR lens and enables handheld shooting at up to 3 shutter speeds slower than would</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="232" width="300"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-300x232-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Shipping Included!</storeNotes><basePrice currency="USD">1050.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1199.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=135&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=313162&amp;crawler_id=313162&amp;dealId=kQnB6rS4AjN5dx5h2_631g%3D%3D&amp;url=http%3A%2F%2Fonecall.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1pZSxNoWHFwLx8GTAICa2ZeH1sPXTZLNzRpAh1HR0BxPQEGCBJNMhFHUElsFCFCVkVTTHAcBggEHQ4aHXNpGERGH3RQODsbAgdechJtbBt8fx8JAwhtZFAzJj1oGgIWCxRlNyFOUV9UUGIxBgo0T0IyTSYqJ0RWHw4QPCIBAAQXRGMDICg6TllZVBhh%26nAID%3D13736960&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+Kit+12.3-megapixel+Digital+SLR+with+18-105mm+VR+Lens&amp;dlprc=1050.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=6&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=6&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=1&amp;code=&amp;acode=143&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="313162" trusted="true"><name>OneCall</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/313162.gif</sourceURL></logo><phoneNumber>1.800.398.0766</phoneNumber><ratingInfo><reviewCount>180</reviewCount><rating>4.44</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_onecall_9689~MRD-313162~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>92826</sku></offer></offers></product></items><attributes matchedAttributeCount="5" returnedAttributeCount="5"><attribute id="Dynamic_Price_Range"><name>Price range</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="2" returnedValueCount="2"><attributeValue id="price_range_24_4012" matchingItemsCount="1"><name>$24 - $4012</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon/products?minPrice=24&amp;maxPrice=4012&amp;linkin_id=7000610</attributeValueURL></attributeValue><attributeValue id="price_range_4012_7999" matchingItemsCount="1"><name>$4012 - $7999</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon/products?minPrice=4012&amp;maxPrice=7999&amp;linkin_id=7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="9688_brand"><name>Brand</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-9688-brand~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="7" returnedValueCount="5"><attributeValue id="brand_nikon" matchingItemsCount="2261"><name>Nikon</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+brand-nikon/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="9688_brand_crane" matchingItemsCount="17"><name>Crane</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+9688-brand-crane/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="ikelite" matchingItemsCount="2"><name>Ikelite</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+ikelite/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="bower" matchingItemsCount="1"><name>Bower</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+bower/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="brand_fuji" matchingItemsCount="2"><name>FUJIFILM</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+brand-fuji/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="store"><name>Store</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-store~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="35" returnedValueCount="5"><attributeValue id="store_amazon_marketplace_9689" matchingItemsCount="808"><name>Amazon Marketplace</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-amazon-marketplace-9689/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_amazon" matchingItemsCount="83"><name>Amazon</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-amazon/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_adorama" matchingItemsCount="81"><name>Adorama</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-adorama/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_j_r_music_and_computer_world" matchingItemsCount="78"><name>J&amp;R Music and Computer World</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-j-r-music-and-computer-world/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_rythercamera_com" matchingItemsCount="78"><name>RytherCamera.com</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-rythercamera-com/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="21885_resolution"><name>Resolution</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-21885-resolution~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="13" returnedValueCount="5"><attributeValue id="under_4_megapixel" matchingItemsCount="3"><name>Under 4 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+under-4-megapixel/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="5_megapixel_digital_cameras" matchingItemsCount="1085"><name>At least 5 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+5-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="6_megapixel_digital_cameras" matchingItemsCount="1080"><name>At least 6 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+6-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="7_megapixel_digital_cameras" matchingItemsCount="1066"><name>At least 7 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+7-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="8_megapixel_digital_cameras" matchingItemsCount="1056"><name>At least 8 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+8-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="32804-features"><name>Features</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-32804-features~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="12" returnedValueCount="5"><attributeValue id="32804_features_shockproof" matchingItemsCount="7"><name>Shockproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-shockproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_waterproof" matchingItemsCount="32"><name>Waterproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-waterproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_freezeproof" matchingItemsCount="7"><name>Freezeproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-freezeproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_dust_proof" matchingItemsCount="23"><name>Dust proof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-dust-proof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_image_stabilization" matchingItemsCount="797"><name>Image Stabilization</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-image-stabilization/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute></attributes><contentType>hybrid</contentType></category></categories><relatedTerms><term>digital camera</term><term>g1</term><term>sony</term><term>camera</term><term>canon</term><term>nikon</term><term>kodak digital camera</term><term>kodak</term><term>sony cybershot</term><term>kodak easyshare digital camera</term><term>nikon coolpix</term><term>olympus</term><term>pink digital camera</term><term>canon powershot</term></relatedTerms></GeneralSearchResponse> \ No newline at end of file
diff --git a/node_modules/stylus/node_modules/sax/examples/strict.dtd b/node_modules/stylus/node_modules/sax/examples/strict.dtd
new file mode 100644
index 00000000..b2745594
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/strict.dtd
@@ -0,0 +1,870 @@
+<!--
+ This is HTML 4.01 Strict DTD, which excludes the presentation
+ attributes and elements that W3C expects to phase out as
+ support for style sheets matures. Authors should use the Strict
+ DTD when possible, but may use the Transitional DTD when support
+ for presentation attribute and elements is required.
+
+ HTML 4 includes mechanisms for style sheets, scripting,
+ embedding objects, improved support for right to left and mixed
+ direction text, and enhancements to forms for improved
+ accessibility for people with disabilities.
+
+ Draft: $Date: 1999/12/24 23:37:48 $
+
+ Authors:
+ Dave Raggett <dsr@w3.org>
+ Arnaud Le Hors <lehors@w3.org>
+ Ian Jacobs <ij@w3.org>
+
+ Further information about HTML 4.01 is available at:
+
+ http://www.w3.org/TR/1999/REC-html401-19991224
+
+
+ The HTML 4.01 specification includes additional
+ syntactic constraints that cannot be expressed within
+ the DTDs.
+
+-->
+<!--
+ Typical usage:
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+ <html>
+ <head>
+ ...
+ </head>
+ <body>
+ ...
+ </body>
+ </html>
+
+ The URI used as a system identifier with the public identifier allows
+ the user agent to download the DTD and entity sets as needed.
+
+ The FPI for the Transitional HTML 4.01 DTD is:
+
+ "-//W3C//DTD HTML 4.01 Transitional//EN"
+
+ This version of the transitional DTD is:
+
+ http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd
+
+ If you are writing a document that includes frames, use
+ the following FPI:
+
+ "-//W3C//DTD HTML 4.01 Frameset//EN"
+
+ This version of the frameset DTD is:
+
+ http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd
+
+ Use the following (relative) URIs to refer to
+ the DTDs and entity definitions of this specification:
+
+ "strict.dtd"
+ "loose.dtd"
+ "frameset.dtd"
+ "HTMLlat1.ent"
+ "HTMLsymbol.ent"
+ "HTMLspecial.ent"
+
+-->
+
+<!--================== Imported Names ====================================-->
+<!-- Feature Switch for frameset documents -->
+<!ENTITY % HTML.Frameset "IGNORE">
+
+<!ENTITY % ContentType "CDATA"
+ -- media type, as per [RFC2045]
+ -->
+
+<!ENTITY % ContentTypes "CDATA"
+ -- comma-separated list of media types, as per [RFC2045]
+ -->
+
+<!ENTITY % Charset "CDATA"
+ -- a character encoding, as per [RFC2045]
+ -->
+
+<!ENTITY % Charsets "CDATA"
+ -- a space-separated list of character encodings, as per [RFC2045]
+ -->
+
+<!ENTITY % LanguageCode "NAME"
+ -- a language code, as per [RFC1766]
+ -->
+
+<!ENTITY % Character "CDATA"
+ -- a single character from [ISO10646]
+ -->
+
+<!ENTITY % LinkTypes "CDATA"
+ -- space-separated list of link types
+ -->
+
+<!ENTITY % MediaDesc "CDATA"
+ -- single or comma-separated list of media descriptors
+ -->
+
+<!ENTITY % URI "CDATA"
+ -- a Uniform Resource Identifier,
+ see [URI]
+ -->
+
+<!ENTITY % Datetime "CDATA" -- date and time information. ISO date format -->
+
+
+<!ENTITY % Script "CDATA" -- script expression -->
+
+<!ENTITY % StyleSheet "CDATA" -- style sheet data -->
+
+
+
+<!ENTITY % Text "CDATA">
+
+
+<!-- Parameter Entities -->
+
+<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->
+
+<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
+
+<!ENTITY % list "UL | OL">
+
+<!ENTITY % preformatted "PRE">
+
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin1//EN//HTML"
+ "HTMLlat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols//EN//HTML"
+ "HTMLsymbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special//EN//HTML"
+ "HTMLspecial.ent">
+%HTMLspecial;
+<!--=================== Generic Attributes ===============================-->
+
+<!ENTITY % coreattrs
+ "id ID #IMPLIED -- document-wide unique id --
+ class CDATA #IMPLIED -- space-separated list of classes --
+ style %StyleSheet; #IMPLIED -- associated style info --
+ title %Text; #IMPLIED -- advisory title --"
+ >
+
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED -- language code --
+ dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --"
+ >
+
+<!ENTITY % events
+ "onclick %Script; #IMPLIED -- a pointer button was clicked --
+ ondblclick %Script; #IMPLIED -- a pointer button was double clicked--
+ onmousedown %Script; #IMPLIED -- a pointer button was pressed down --
+ onmouseup %Script; #IMPLIED -- a pointer button was released --
+ onmouseover %Script; #IMPLIED -- a pointer was moved onto --
+ onmousemove %Script; #IMPLIED -- a pointer was moved within --
+ onmouseout %Script; #IMPLIED -- a pointer was moved away --
+ onkeypress %Script; #IMPLIED -- a key was pressed and released --
+ onkeydown %Script; #IMPLIED -- a key was pressed down --
+ onkeyup %Script; #IMPLIED -- a key was released --"
+ >
+
+<!-- Reserved Feature Switch -->
+<!ENTITY % HTML.Reserved "IGNORE">
+
+<!-- The following attributes are reserved for possible future use -->
+<![ %HTML.Reserved; [
+<!ENTITY % reserved
+ "datasrc %URI; #IMPLIED -- a single or tabular Data Source --
+ datafld CDATA #IMPLIED -- the property or column name --
+ dataformatas (plaintext|html) plaintext -- text or html --"
+ >
+]]>
+
+<!ENTITY % reserved "">
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+
+<!--=================== Text Markup ======================================-->
+
+<!ENTITY % fontstyle
+ "TT | I | B | BIG | SMALL">
+
+<!ENTITY % phrase "EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
+
+<!ENTITY % special
+ "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
+
+<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
+
+<!-- %inline; covers inline or "text-level" elements -->
+<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
+
+<!ELEMENT (%fontstyle;|%phrase;) - - (%inline;)*>
+<!ATTLIST (%fontstyle;|%phrase;)
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT (SUB|SUP) - - (%inline;)* -- subscript, superscript -->
+<!ATTLIST (SUB|SUP)
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT SPAN - - (%inline;)* -- generic language/style container -->
+<!ATTLIST SPAN
+ %attrs; -- %coreattrs, %i18n, %events --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!ELEMENT BDO - - (%inline;)* -- I18N BiDi over-ride -->
+<!ATTLIST BDO
+ %coreattrs; -- id, class, style, title --
+ lang %LanguageCode; #IMPLIED -- language code --
+ dir (ltr|rtl) #REQUIRED -- directionality --
+ >
+
+
+<!ELEMENT BR - O EMPTY -- forced line break -->
+<!ATTLIST BR
+ %coreattrs; -- id, class, style, title --
+ >
+
+<!--================== HTML content models ===============================-->
+
+<!--
+ HTML has two basic content models:
+
+ %inline; character level elements and text strings
+ %block; block-like elements e.g. paragraphs and lists
+-->
+
+<!ENTITY % block
+ "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
+ BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
+
+<!ENTITY % flow "%block; | %inline;">
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) -- document body -->
+<!ATTLIST BODY
+ %attrs; -- %coreattrs, %i18n, %events --
+ onload %Script; #IMPLIED -- the document has been loaded --
+ onunload %Script; #IMPLIED -- the document has been removed --
+ >
+
+<!ELEMENT ADDRESS - - (%inline;)* -- information on author -->
+<!ATTLIST ADDRESS
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT DIV - - (%flow;)* -- generic language/style container -->
+<!ATTLIST DIV
+ %attrs; -- %coreattrs, %i18n, %events --
+ %reserved; -- reserved for possible future use --
+ >
+
+
+<!--================== The Anchor Element ================================-->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+<!ENTITY % Coords "CDATA" -- comma-separated list of lengths -->
+
+<!ELEMENT A - - (%inline;)* -(A) -- anchor -->
+<!ATTLIST A
+ %attrs; -- %coreattrs, %i18n, %events --
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ type %ContentType; #IMPLIED -- advisory content type --
+ name CDATA #IMPLIED -- named link end --
+ href %URI; #IMPLIED -- URI for linked resource --
+ hreflang %LanguageCode; #IMPLIED -- language code --
+ rel %LinkTypes; #IMPLIED -- forward link types --
+ rev %LinkTypes; #IMPLIED -- reverse link types --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ shape %Shape; rect -- for use with client-side image maps --
+ coords %Coords; #IMPLIED -- for use with client-side image maps --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ >
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT MAP - - ((%block;) | AREA)+ -- client-side image map -->
+<!ATTLIST MAP
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #REQUIRED -- for reference by usemap --
+ >
+
+<!ELEMENT AREA - O EMPTY -- client-side image map area -->
+<!ATTLIST AREA
+ %attrs; -- %coreattrs, %i18n, %events --
+ shape %Shape; rect -- controls interpretation of coords --
+ coords %Coords; #IMPLIED -- comma-separated list of lengths --
+ href %URI; #IMPLIED -- URI for linked resource --
+ nohref (nohref) #IMPLIED -- this region has no action --
+ alt %Text; #REQUIRED -- short description --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ >
+
+<!--================== The LINK Element ==================================-->
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the LINK element in document head e.g.
+ start, contents, previous, next, index, end, help
+ b) to link to a separate style sheet (rel=stylesheet)
+ c) to make a link to a script (rel=script)
+ d) by stylesheets to control how collections of
+ html nodes are rendered into printed documents
+ e) to make a link to a printable version of this document
+ e.g. a postscript or pdf version (rel=alternate media=print)
+-->
+
+<!ELEMENT LINK - O EMPTY -- a media-independent link -->
+<!ATTLIST LINK
+ %attrs; -- %coreattrs, %i18n, %events --
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ href %URI; #IMPLIED -- URI for linked resource --
+ hreflang %LanguageCode; #IMPLIED -- language code --
+ type %ContentType; #IMPLIED -- advisory content type --
+ rel %LinkTypes; #IMPLIED -- forward link types --
+ rev %LinkTypes; #IMPLIED -- reverse link types --
+ media %MediaDesc; #IMPLIED -- for rendering on these media --
+ >
+
+<!--=================== Images ===========================================-->
+
+<!-- Length defined in strict DTD for cellpadding/cellspacing -->
+<!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length -->
+<!ENTITY % MultiLength "CDATA" -- pixel, percentage, or relative -->
+
+<![ %HTML.Frameset; [
+<!ENTITY % MultiLengths "CDATA" -- comma-separated list of MultiLength -->
+]]>
+
+<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
+
+
+<!-- To avoid problems with text-only UAs as well as
+ to make image content understandable and navigable
+ to users of non-visual UAs, you need to provide
+ a description with ALT, and avoid server-side image maps -->
+<!ELEMENT IMG - O EMPTY -- Embedded image -->
+<!ATTLIST IMG
+ %attrs; -- %coreattrs, %i18n, %events --
+ src %URI; #REQUIRED -- URI of image to embed --
+ alt %Text; #REQUIRED -- short description --
+ longdesc %URI; #IMPLIED -- link to long description
+ (complements alt) --
+ name CDATA #IMPLIED -- name of image for scripting --
+ height %Length; #IMPLIED -- override height --
+ width %Length; #IMPLIED -- override width --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ ismap (ismap) #IMPLIED -- use server-side image map --
+ >
+
+<!-- USEMAP points to a MAP element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--==================== OBJECT ======================================-->
+<!--
+ OBJECT is used to embed objects as part of HTML pages
+ PARAM elements should precede other content. SGML mixed content
+ model technicality precludes specifying this formally ...
+-->
+
+<!ELEMENT OBJECT - - (PARAM | %flow;)*
+ -- generic embedded object -->
+<!ATTLIST OBJECT
+ %attrs; -- %coreattrs, %i18n, %events --
+ declare (declare) #IMPLIED -- declare but don't instantiate flag --
+ classid %URI; #IMPLIED -- identifies an implementation --
+ codebase %URI; #IMPLIED -- base URI for classid, data, archive--
+ data %URI; #IMPLIED -- reference to object's data --
+ type %ContentType; #IMPLIED -- content type for data --
+ codetype %ContentType; #IMPLIED -- content type for code --
+ archive CDATA #IMPLIED -- space-separated list of URIs --
+ standby %Text; #IMPLIED -- message to show while loading --
+ height %Length; #IMPLIED -- override height --
+ width %Length; #IMPLIED -- override width --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ name CDATA #IMPLIED -- submit as part of form --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!ELEMENT PARAM - O EMPTY -- named property value -->
+<!ATTLIST PARAM
+ id ID #IMPLIED -- document-wide unique id --
+ name CDATA #REQUIRED -- property name --
+ value CDATA #IMPLIED -- property value --
+ valuetype (DATA|REF|OBJECT) DATA -- How to interpret value --
+ type %ContentType; #IMPLIED -- content type for value
+ when valuetype=ref --
+ >
+
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT HR - O EMPTY -- horizontal rule -->
+<!ATTLIST HR
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT P - O (%inline;)* -- paragraph -->
+<!ATTLIST P
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from H1 (the most important)
+ to H6 (the least important).
+-->
+
+<!ELEMENT (%heading;) - - (%inline;)* -- heading -->
+<!ATTLIST (%heading;)
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- excludes markup for images and changes in font size -->
+<!ENTITY % pre.exclusion "IMG|OBJECT|BIG|SMALL|SUB|SUP">
+
+<!ELEMENT PRE - - (%inline;)* -(%pre.exclusion;) -- preformatted text -->
+<!ATTLIST PRE
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--===================== Inline Quotes ==================================-->
+
+<!ELEMENT Q - - (%inline;)* -- short inline quotation -->
+<!ATTLIST Q
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- URI for source document or msg --
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT BLOCKQUOTE - - (%block;|SCRIPT)+ -- long quotation -->
+<!ATTLIST BLOCKQUOTE
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- URI for source document or msg --
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+
+<!-- INS/DEL are handled by inclusion on BODY -->
+<!ELEMENT (INS|DEL) - - (%flow;)* -- inserted text, deleted text -->
+<!ATTLIST (INS|DEL)
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- info on reason for change --
+ datetime %Datetime; #IMPLIED -- date and time of change --
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- definition lists - DT for term, DD for its definition -->
+
+<!ELEMENT DL - - (DT|DD)+ -- definition list -->
+<!ATTLIST DL
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT DT - O (%inline;)* -- definition term -->
+<!ELEMENT DD - O (%flow;)* -- definition description -->
+<!ATTLIST (DT|DD)
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+
+<!ELEMENT OL - - (LI)+ -- ordered list -->
+<!ATTLIST OL
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!-- Unordered Lists (UL) bullet styles -->
+<!ELEMENT UL - - (LI)+ -- unordered list -->
+<!ATTLIST UL
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+
+
+<!ELEMENT LI - O (%flow;)* -- list item -->
+<!ATTLIST LI
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--================ Forms ===============================================-->
+<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->
+<!ATTLIST FORM
+ %attrs; -- %coreattrs, %i18n, %events --
+ action %URI; #REQUIRED -- server-side form handler --
+ method (GET|POST) GET -- HTTP method used to submit the form--
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ name CDATA #IMPLIED -- name of form for scripting --
+ onsubmit %Script; #IMPLIED -- the form was submitted --
+ onreset %Script; #IMPLIED -- the form was reset --
+ accept-charset %Charsets; #IMPLIED -- list of supported charsets --
+ >
+
+<!-- Each label must not contain more than ONE field -->
+<!ELEMENT LABEL - - (%inline;)* -(LABEL) -- form field label text -->
+<!ATTLIST LABEL
+ %attrs; -- %coreattrs, %i18n, %events --
+ for IDREF #IMPLIED -- matches field ID value --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ >
+
+<!ENTITY % InputType
+ "(TEXT | PASSWORD | CHECKBOX |
+ RADIO | SUBMIT | RESET |
+ FILE | HIDDEN | IMAGE | BUTTON)"
+ >
+
+<!-- attribute name required for all but submit and reset -->
+<!ELEMENT INPUT - O EMPTY -- form control -->
+<!ATTLIST INPUT
+ %attrs; -- %coreattrs, %i18n, %events --
+ type %InputType; TEXT -- what kind of widget is needed --
+ name CDATA #IMPLIED -- submit as part of form --
+ value CDATA #IMPLIED -- Specify for radio buttons and checkboxes --
+ checked (checked) #IMPLIED -- for radio buttons and check boxes --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ readonly (readonly) #IMPLIED -- for text and passwd --
+ size CDATA #IMPLIED -- specific to each type of field --
+ maxlength NUMBER #IMPLIED -- max chars for text fields --
+ src %URI; #IMPLIED -- for fields with images --
+ alt CDATA #IMPLIED -- short description --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ ismap (ismap) #IMPLIED -- use server-side image map --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onselect %Script; #IMPLIED -- some text was selected --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!ELEMENT SELECT - - (OPTGROUP|OPTION)+ -- option selector -->
+<!ATTLIST SELECT
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED -- field name --
+ size NUMBER #IMPLIED -- rows visible --
+ multiple (multiple) #IMPLIED -- default is single selection --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!ELEMENT OPTGROUP - - (OPTION)+ -- option group -->
+<!ATTLIST OPTGROUP
+ %attrs; -- %coreattrs, %i18n, %events --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ label %Text; #REQUIRED -- for use in hierarchical menus --
+ >
+
+<!ELEMENT OPTION - O (#PCDATA) -- selectable choice -->
+<!ATTLIST OPTION
+ %attrs; -- %coreattrs, %i18n, %events --
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ label %Text; #IMPLIED -- for use in hierarchical menus --
+ value CDATA #IMPLIED -- defaults to element content --
+ >
+
+<!ELEMENT TEXTAREA - - (#PCDATA) -- multi-line text field -->
+<!ATTLIST TEXTAREA
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED
+ rows NUMBER #REQUIRED
+ cols NUMBER #REQUIRED
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ readonly (readonly) #IMPLIED
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onselect %Script; #IMPLIED -- some text was selected --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!--
+ #PCDATA is to solve the mixed content problem,
+ per specification only whitespace is allowed there!
+ -->
+<!ELEMENT FIELDSET - - (#PCDATA,LEGEND,(%flow;)*) -- form control group -->
+<!ATTLIST FIELDSET
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT LEGEND - - (%inline;)* -- fieldset legend -->
+
+<!ATTLIST LEGEND
+ %attrs; -- %coreattrs, %i18n, %events --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ >
+
+<!ELEMENT BUTTON - -
+ (%flow;)* -(A|%formctrl;|FORM|FIELDSET)
+ -- push button -->
+<!ATTLIST BUTTON
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED -- sent to server when submitted --
+ type (button|submit|reset) submit -- for use as form button --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The BORDER attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The FRAME attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the VALIGN attribute.
+
+ The value "border" is included for backwards compatibility with
+ <TABLE BORDER> which yields frame=border and border=implied
+ For <TABLE BORDER=1> you get border=1 and frame=implied. In this
+ case, it is appropriate to treat this as frame=border for backwards
+ compatibility with deployed browsers.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The RULES attribute defines which rules to draw between cells:
+
+ If RULES is absent then assume:
+ "none" if BORDER is absent or BORDER=0 otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents -->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED -- alignment char, e.g. char=':' --
+ charoff %Length; #IMPLIED -- offset for alignment char --"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT TABLE - -
+ (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
+<!ELEMENT CAPTION - - (%inline;)* -- table caption -->
+<!ELEMENT THEAD - O (TR)+ -- table header -->
+<!ELEMENT TFOOT - O (TR)+ -- table footer -->
+<!ELEMENT TBODY O O (TR)+ -- table body -->
+<!ELEMENT COLGROUP - O (COL)* -- table column group -->
+<!ELEMENT COL - O EMPTY -- table column -->
+<!ELEMENT TR - O (TH|TD)+ -- table row -->
+<!ELEMENT (TH|TD) - O (%flow;)* -- table header cell, table data cell-->
+
+<!ATTLIST TABLE -- table element --
+ %attrs; -- %coreattrs, %i18n, %events --
+ summary %Text; #IMPLIED -- purpose/structure for speech output--
+ width %Length; #IMPLIED -- table width --
+ border %Pixels; #IMPLIED -- controls frame width around table --
+ frame %TFrame; #IMPLIED -- which parts of frame to render --
+ rules %TRules; #IMPLIED -- rulings between rows and cols --
+ cellspacing %Length; #IMPLIED -- spacing between cells --
+ cellpadding %Length; #IMPLIED -- spacing within cells --
+ %reserved; -- reserved for possible future use --
+ datapagesize CDATA #IMPLIED -- reserved for possible future use --
+ >
+
+
+<!ATTLIST CAPTION
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--
+COLGROUP groups a set of COL elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST COLGROUP
+ %attrs; -- %coreattrs, %i18n, %events --
+ span NUMBER 1 -- default number of columns in group --
+ width %MultiLength; #IMPLIED -- default width for enclosed COLs --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+<!--
+ COL elements define the alignment properties for cells in
+ one or more columns.
+
+ The WIDTH attribute specifies the width of the columns, e.g.
+
+ width=64 width in screen pixels
+ width=0.5* relative width of 0.5
+
+ The SPAN attribute causes the attributes of one
+ COL element to apply to more than one column.
+-->
+<!ATTLIST COL -- column groups and properties --
+ %attrs; -- %coreattrs, %i18n, %events --
+ span NUMBER 1 -- COL attributes affect N columns --
+ width %MultiLength; #IMPLIED -- column width specification --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+<!--
+ Use THEAD to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ TBODY sections are rendered in scrolling panel.
+
+ Use TFOOT to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ TBODY sections are rendered in scrolling panel.
+
+ Use multiple TBODY sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST (THEAD|TBODY|TFOOT) -- table section --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+<!ATTLIST TR -- table row --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- TH is for headers, TD for data, but for cells acting as both use TD -->
+<!ATTLIST (TH|TD) -- header or data cell --
+ %attrs; -- %coreattrs, %i18n, %events --
+ abbr %Text; #IMPLIED -- abbreviation for header cell --
+ axis CDATA #IMPLIED -- comma-separated list of related headers--
+ headers IDREFS #IMPLIED -- list of id's for header cells --
+ scope %Scope; #IMPLIED -- scope covered by header cells --
+ rowspan NUMBER 1 -- number of rows spanned by cell --
+ colspan NUMBER 1 -- number of cols spanned by cell --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+
+<!--================ Document Head =======================================-->
+<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT" -->
+<!ENTITY % head.content "TITLE & BASE?">
+
+<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->
+<!ATTLIST HEAD
+ %i18n; -- lang, dir --
+ profile %URI; #IMPLIED -- named dictionary of meta info --
+ >
+
+<!-- The TITLE element is not considered part of the flow of text.
+ It should be displayed, for example as the page header or
+ window title. Exactly one title is required per document.
+ -->
+<!ELEMENT TITLE - - (#PCDATA) -(%head.misc;) -- document title -->
+<!ATTLIST TITLE %i18n>
+
+
+<!ELEMENT BASE - O EMPTY -- document base URI -->
+<!ATTLIST BASE
+ href %URI; #REQUIRED -- URI that acts as base URI --
+ >
+
+<!ELEMENT META - O EMPTY -- generic metainformation -->
+<!ATTLIST META
+ %i18n; -- lang, dir, for use with content --
+ http-equiv NAME #IMPLIED -- HTTP response header name --
+ name NAME #IMPLIED -- metainformation name --
+ content CDATA #REQUIRED -- associated information --
+ scheme CDATA #IMPLIED -- select form of content --
+ >
+
+<!ELEMENT STYLE - - %StyleSheet -- style info -->
+<!ATTLIST STYLE
+ %i18n; -- lang, dir, for use with title --
+ type %ContentType; #REQUIRED -- content type of style language --
+ media %MediaDesc; #IMPLIED -- designed for use with these media --
+ title %Text; #IMPLIED -- advisory title --
+ >
+
+<!ELEMENT SCRIPT - - %Script; -- script statements -->
+<!ATTLIST SCRIPT
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ type %ContentType; #REQUIRED -- content type of script language --
+ src %URI; #IMPLIED -- URI for an external script --
+ defer (defer) #IMPLIED -- UA may defer execution of script --
+ event CDATA #IMPLIED -- reserved for possible future use --
+ for %URI; #IMPLIED -- reserved for possible future use --
+ >
+
+<!ELEMENT NOSCRIPT - - (%block;)+
+ -- alternate content container for non script-based rendering -->
+<!ATTLIST NOSCRIPT
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--================ Document Structure ==================================-->
+<!ENTITY % html.content "HEAD, BODY">
+
+<!ELEMENT HTML O O (%html.content;) -- document root element -->
+<!ATTLIST HTML
+ %i18n; -- lang, dir --
+ >
diff --git a/node_modules/stylus/node_modules/sax/examples/test.html b/node_modules/stylus/node_modules/sax/examples/test.html
new file mode 100644
index 00000000..61f8f1ab
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/test.html
@@ -0,0 +1,15 @@
+<!doctype html>
+
+<html lang="en">
+<head>
+ <title>testing the parser</title>
+</head>
+<body>
+
+<p>hello
+
+<script>
+
+</script>
+</body>
+</html>
diff --git a/node_modules/stylus/node_modules/sax/examples/test.xml b/node_modules/stylus/node_modules/sax/examples/test.xml
new file mode 100644
index 00000000..801292d7
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/examples/test.xml
@@ -0,0 +1,1254 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE RootElement [
+ <!ENTITY e SYSTEM "001.ent">
+]>
+<RootElement param="value">
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+</RootElement> \ No newline at end of file
diff --git a/node_modules/stylus/node_modules/sax/lib/sax.js b/node_modules/stylus/node_modules/sax/lib/sax.js
new file mode 100644
index 00000000..d5c0cb6c
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/lib/sax.js
@@ -0,0 +1,1355 @@
+// wrapper for non-node envs
+;(function (sax) {
+
+sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
+sax.SAXParser = SAXParser
+sax.SAXStream = SAXStream
+sax.createStream = createStream
+
+// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
+// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
+// since that's the earliest that a buffer overrun could occur. This way, checks are
+// as rare as required, but as often as necessary to ensure never crossing this bound.
+// Furthermore, buffers are only tested at most once per write(), so passing a very
+// large string into write() might have undesirable effects, but this is manageable by
+// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
+// edge case, result in creating at most one complete copy of the string passed in.
+// Set to Infinity to have unlimited buffers.
+sax.MAX_BUFFER_LENGTH = 64 * 1024
+
+var buffers = [
+ "comment", "sgmlDecl", "textNode", "tagName", "doctype",
+ "procInstName", "procInstBody", "entity", "attribName",
+ "attribValue", "cdata", "script"
+]
+
+sax.EVENTS = // for discoverability.
+ [ "text"
+ , "processinginstruction"
+ , "sgmldeclaration"
+ , "doctype"
+ , "comment"
+ , "attribute"
+ , "opentag"
+ , "closetag"
+ , "opencdata"
+ , "cdata"
+ , "closecdata"
+ , "error"
+ , "end"
+ , "ready"
+ , "script"
+ , "opennamespace"
+ , "closenamespace"
+ ]
+
+function SAXParser (strict, opt) {
+ if (!(this instanceof SAXParser)) return new SAXParser(strict, opt)
+
+ var parser = this
+ clearBuffers(parser)
+ parser.q = parser.c = ""
+ parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
+ parser.opt = opt || {}
+ parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
+ parser.looseCase = parser.opt.lowercase ? "toLowerCase" : "toUpperCase"
+ parser.tags = []
+ parser.closed = parser.closedRoot = parser.sawRoot = false
+ parser.tag = parser.error = null
+ parser.strict = !!strict
+ parser.noscript = !!(strict || parser.opt.noscript)
+ parser.state = S.BEGIN
+ parser.ENTITIES = Object.create(sax.ENTITIES)
+ parser.attribList = []
+
+ // namespaces form a prototype chain.
+ // it always points at the current tag,
+ // which protos to its parent tag.
+ if (parser.opt.xmlns) parser.ns = Object.create(rootNS)
+
+ // mostly just for error reporting
+ parser.trackPosition = parser.opt.position !== false
+ if (parser.trackPosition) {
+ parser.position = parser.line = parser.column = 0
+ }
+ emit(parser, "onready")
+}
+
+if (!Object.create) Object.create = function (o) {
+ function f () { this.__proto__ = o }
+ f.prototype = o
+ return new f
+}
+
+if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) {
+ return o.__proto__
+}
+
+if (!Object.keys) Object.keys = function (o) {
+ var a = []
+ for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
+ return a
+}
+
+function checkBufferLength (parser) {
+ var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
+ , maxActual = 0
+ for (var i = 0, l = buffers.length; i < l; i ++) {
+ var len = parser[buffers[i]].length
+ if (len > maxAllowed) {
+ // Text/cdata nodes can get big, and since they're buffered,
+ // we can get here under normal conditions.
+ // Avoid issues by emitting the text node now,
+ // so at least it won't get any bigger.
+ switch (buffers[i]) {
+ case "textNode":
+ closeText(parser)
+ break
+
+ case "cdata":
+ emitNode(parser, "oncdata", parser.cdata)
+ parser.cdata = ""
+ break
+
+ case "script":
+ emitNode(parser, "onscript", parser.script)
+ parser.script = ""
+ break
+
+ default:
+ error(parser, "Max buffer length exceeded: "+buffers[i])
+ }
+ }
+ maxActual = Math.max(maxActual, len)
+ }
+ // schedule the next check for the earliest possible buffer overrun.
+ parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual)
+ + parser.position
+}
+
+function clearBuffers (parser) {
+ for (var i = 0, l = buffers.length; i < l; i ++) {
+ parser[buffers[i]] = ""
+ }
+}
+
+function flushBuffers (parser) {
+ closeText(parser)
+ if (parser.cdata !== "") {
+ emitNode(parser, "oncdata", parser.cdata)
+ parser.cdata = ""
+ }
+ if (parser.script !== "") {
+ emitNode(parser, "onscript", parser.script)
+ parser.script = ""
+ }
+}
+
+SAXParser.prototype =
+ { end: function () { end(this) }
+ , write: write
+ , resume: function () { this.error = null; return this }
+ , close: function () { return this.write(null) }
+ , flush: function () { flushBuffers(this) }
+ }
+
+try {
+ var Stream = require("stream").Stream
+} catch (ex) {
+ var Stream = function () {}
+}
+
+
+var streamWraps = sax.EVENTS.filter(function (ev) {
+ return ev !== "error" && ev !== "end"
+})
+
+function createStream (strict, opt) {
+ return new SAXStream(strict, opt)
+}
+
+function SAXStream (strict, opt) {
+ if (!(this instanceof SAXStream)) return new SAXStream(strict, opt)
+
+ Stream.apply(this)
+
+ this._parser = new SAXParser(strict, opt)
+ this.writable = true
+ this.readable = true
+
+
+ var me = this
+
+ this._parser.onend = function () {
+ me.emit("end")
+ }
+
+ this._parser.onerror = function (er) {
+ me.emit("error", er)
+
+ // if didn't throw, then means error was handled.
+ // go ahead and clear error, so we can write again.
+ me._parser.error = null
+ }
+
+ this._decoder = null;
+
+ streamWraps.forEach(function (ev) {
+ Object.defineProperty(me, "on" + ev, {
+ get: function () { return me._parser["on" + ev] },
+ set: function (h) {
+ if (!h) {
+ me.removeAllListeners(ev)
+ return me._parser["on"+ev] = h
+ }
+ me.on(ev, h)
+ },
+ enumerable: true,
+ configurable: false
+ })
+ })
+}
+
+SAXStream.prototype = Object.create(Stream.prototype,
+ { constructor: { value: SAXStream } })
+
+SAXStream.prototype.write = function (data) {
+ if (typeof Buffer === 'function' &&
+ typeof Buffer.isBuffer === 'function' &&
+ Buffer.isBuffer(data)) {
+ if (!this._decoder) {
+ var SD = require('string_decoder').StringDecoder
+ this._decoder = new SD('utf8')
+ }
+ data = this._decoder.write(data);
+ }
+
+ this._parser.write(data.toString())
+ this.emit("data", data)
+ return true
+}
+
+SAXStream.prototype.end = function (chunk) {
+ if (chunk && chunk.length) this.write(chunk)
+ this._parser.end()
+ return true
+}
+
+SAXStream.prototype.on = function (ev, handler) {
+ var me = this
+ if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) {
+ me._parser["on"+ev] = function () {
+ var args = arguments.length === 1 ? [arguments[0]]
+ : Array.apply(null, arguments)
+ args.splice(0, 0, ev)
+ me.emit.apply(me, args)
+ }
+ }
+
+ return Stream.prototype.on.call(me, ev, handler)
+}
+
+
+
+// character classes and tokens
+var whitespace = "\r\n\t "
+ // this really needs to be replaced with character classes.
+ // XML allows all manner of ridiculous numbers and digits.
+ , number = "0124356789"
+ , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ // (Letter | "_" | ":")
+ , quote = "'\""
+ , entity = number+letter+"#"
+ , attribEnd = whitespace + ">"
+ , CDATA = "[CDATA["
+ , DOCTYPE = "DOCTYPE"
+ , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
+ , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"
+ , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
+
+// turn all the string character sets into character class objects.
+whitespace = charClass(whitespace)
+number = charClass(number)
+letter = charClass(letter)
+
+// http://www.w3.org/TR/REC-xml/#NT-NameStartChar
+// This implementation works on strings, a single character at a time
+// as such, it cannot ever support astral-plane characters (10000-EFFFF)
+// without a significant breaking change to either this parser, or the
+// JavaScript language. Implementation of an emoji-capable xml parser
+// is left as an exercise for the reader.
+var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
+
+var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/
+
+quote = charClass(quote)
+entity = charClass(entity)
+attribEnd = charClass(attribEnd)
+
+function charClass (str) {
+ return str.split("").reduce(function (s, c) {
+ s[c] = true
+ return s
+ }, {})
+}
+
+function isRegExp (c) {
+ return Object.prototype.toString.call(c) === '[object RegExp]'
+}
+
+function is (charclass, c) {
+ return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]
+}
+
+function not (charclass, c) {
+ return !is(charclass, c)
+}
+
+var S = 0
+sax.STATE =
+{ BEGIN : S++
+, TEXT : S++ // general stuff
+, TEXT_ENTITY : S++ // &amp and such.
+, OPEN_WAKA : S++ // <
+, SGML_DECL : S++ // <!BLARG
+, SGML_DECL_QUOTED : S++ // <!BLARG foo "bar
+, DOCTYPE : S++ // <!DOCTYPE
+, DOCTYPE_QUOTED : S++ // <!DOCTYPE "//blah
+, DOCTYPE_DTD : S++ // <!DOCTYPE "//blah" [ ...
+, DOCTYPE_DTD_QUOTED : S++ // <!DOCTYPE "//blah" [ "foo
+, COMMENT_STARTING : S++ // <!-
+, COMMENT : S++ // <!--
+, COMMENT_ENDING : S++ // <!-- blah -
+, COMMENT_ENDED : S++ // <!-- blah --
+, CDATA : S++ // <![CDATA[ something
+, CDATA_ENDING : S++ // ]
+, CDATA_ENDING_2 : S++ // ]]
+, PROC_INST : S++ // <?hi
+, PROC_INST_BODY : S++ // <?hi there
+, PROC_INST_ENDING : S++ // <?hi "there" ?
+, OPEN_TAG : S++ // <strong
+, OPEN_TAG_SLASH : S++ // <strong /
+, ATTRIB : S++ // <a
+, ATTRIB_NAME : S++ // <a foo
+, ATTRIB_NAME_SAW_WHITE : S++ // <a foo _
+, ATTRIB_VALUE : S++ // <a foo=
+, ATTRIB_VALUE_QUOTED : S++ // <a foo="bar
+, ATTRIB_VALUE_CLOSED : S++ // <a foo="bar"
+, ATTRIB_VALUE_UNQUOTED : S++ // <a foo=bar
+, ATTRIB_VALUE_ENTITY_Q : S++ // <foo bar="&quot;"
+, ATTRIB_VALUE_ENTITY_U : S++ // <foo bar=&quot;
+, CLOSE_TAG : S++ // </a
+, CLOSE_TAG_SAW_WHITE : S++ // </a >
+, SCRIPT : S++ // <script> ...
+, SCRIPT_ENDING : S++ // <script> ... <
+}
+
+sax.ENTITIES =
+{ "amp" : "&"
+, "gt" : ">"
+, "lt" : "<"
+, "quot" : "\""
+, "apos" : "'"
+, "AElig" : 198
+, "Aacute" : 193
+, "Acirc" : 194
+, "Agrave" : 192
+, "Aring" : 197
+, "Atilde" : 195
+, "Auml" : 196
+, "Ccedil" : 199
+, "ETH" : 208
+, "Eacute" : 201
+, "Ecirc" : 202
+, "Egrave" : 200
+, "Euml" : 203
+, "Iacute" : 205
+, "Icirc" : 206
+, "Igrave" : 204
+, "Iuml" : 207
+, "Ntilde" : 209
+, "Oacute" : 211
+, "Ocirc" : 212
+, "Ograve" : 210
+, "Oslash" : 216
+, "Otilde" : 213
+, "Ouml" : 214
+, "THORN" : 222
+, "Uacute" : 218
+, "Ucirc" : 219
+, "Ugrave" : 217
+, "Uuml" : 220
+, "Yacute" : 221
+, "aacute" : 225
+, "acirc" : 226
+, "aelig" : 230
+, "agrave" : 224
+, "aring" : 229
+, "atilde" : 227
+, "auml" : 228
+, "ccedil" : 231
+, "eacute" : 233
+, "ecirc" : 234
+, "egrave" : 232
+, "eth" : 240
+, "euml" : 235
+, "iacute" : 237
+, "icirc" : 238
+, "igrave" : 236
+, "iuml" : 239
+, "ntilde" : 241
+, "oacute" : 243
+, "ocirc" : 244
+, "ograve" : 242
+, "oslash" : 248
+, "otilde" : 245
+, "ouml" : 246
+, "szlig" : 223
+, "thorn" : 254
+, "uacute" : 250
+, "ucirc" : 251
+, "ugrave" : 249
+, "uuml" : 252
+, "yacute" : 253
+, "yuml" : 255
+, "copy" : 169
+, "reg" : 174
+, "nbsp" : 160
+, "iexcl" : 161
+, "cent" : 162
+, "pound" : 163
+, "curren" : 164
+, "yen" : 165
+, "brvbar" : 166
+, "sect" : 167
+, "uml" : 168
+, "ordf" : 170
+, "laquo" : 171
+, "not" : 172
+, "shy" : 173
+, "macr" : 175
+, "deg" : 176
+, "plusmn" : 177
+, "sup1" : 185
+, "sup2" : 178
+, "sup3" : 179
+, "acute" : 180
+, "micro" : 181
+, "para" : 182
+, "middot" : 183
+, "cedil" : 184
+, "ordm" : 186
+, "raquo" : 187
+, "frac14" : 188
+, "frac12" : 189
+, "frac34" : 190
+, "iquest" : 191
+, "times" : 215
+, "divide" : 247
+, "OElig" : 338
+, "oelig" : 339
+, "Scaron" : 352
+, "scaron" : 353
+, "Yuml" : 376
+, "fnof" : 402
+, "circ" : 710
+, "tilde" : 732
+, "Alpha" : 913
+, "Beta" : 914
+, "Gamma" : 915
+, "Delta" : 916
+, "Epsilon" : 917
+, "Zeta" : 918
+, "Eta" : 919
+, "Theta" : 920
+, "Iota" : 921
+, "Kappa" : 922
+, "Lambda" : 923
+, "Mu" : 924
+, "Nu" : 925
+, "Xi" : 926
+, "Omicron" : 927
+, "Pi" : 928
+, "Rho" : 929
+, "Sigma" : 931
+, "Tau" : 932
+, "Upsilon" : 933
+, "Phi" : 934
+, "Chi" : 935
+, "Psi" : 936
+, "Omega" : 937
+, "alpha" : 945
+, "beta" : 946
+, "gamma" : 947
+, "delta" : 948
+, "epsilon" : 949
+, "zeta" : 950
+, "eta" : 951
+, "theta" : 952
+, "iota" : 953
+, "kappa" : 954
+, "lambda" : 955
+, "mu" : 956
+, "nu" : 957
+, "xi" : 958
+, "omicron" : 959
+, "pi" : 960
+, "rho" : 961
+, "sigmaf" : 962
+, "sigma" : 963
+, "tau" : 964
+, "upsilon" : 965
+, "phi" : 966
+, "chi" : 967
+, "psi" : 968
+, "omega" : 969
+, "thetasym" : 977
+, "upsih" : 978
+, "piv" : 982
+, "ensp" : 8194
+, "emsp" : 8195
+, "thinsp" : 8201
+, "zwnj" : 8204
+, "zwj" : 8205
+, "lrm" : 8206
+, "rlm" : 8207
+, "ndash" : 8211
+, "mdash" : 8212
+, "lsquo" : 8216
+, "rsquo" : 8217
+, "sbquo" : 8218
+, "ldquo" : 8220
+, "rdquo" : 8221
+, "bdquo" : 8222
+, "dagger" : 8224
+, "Dagger" : 8225
+, "bull" : 8226
+, "hellip" : 8230
+, "permil" : 8240
+, "prime" : 8242
+, "Prime" : 8243
+, "lsaquo" : 8249
+, "rsaquo" : 8250
+, "oline" : 8254
+, "frasl" : 8260
+, "euro" : 8364
+, "image" : 8465
+, "weierp" : 8472
+, "real" : 8476
+, "trade" : 8482
+, "alefsym" : 8501
+, "larr" : 8592
+, "uarr" : 8593
+, "rarr" : 8594
+, "darr" : 8595
+, "harr" : 8596
+, "crarr" : 8629
+, "lArr" : 8656
+, "uArr" : 8657
+, "rArr" : 8658
+, "dArr" : 8659
+, "hArr" : 8660
+, "forall" : 8704
+, "part" : 8706
+, "exist" : 8707
+, "empty" : 8709
+, "nabla" : 8711
+, "isin" : 8712
+, "notin" : 8713
+, "ni" : 8715
+, "prod" : 8719
+, "sum" : 8721
+, "minus" : 8722
+, "lowast" : 8727
+, "radic" : 8730
+, "prop" : 8733
+, "infin" : 8734
+, "ang" : 8736
+, "and" : 8743
+, "or" : 8744
+, "cap" : 8745
+, "cup" : 8746
+, "int" : 8747
+, "there4" : 8756
+, "sim" : 8764
+, "cong" : 8773
+, "asymp" : 8776
+, "ne" : 8800
+, "equiv" : 8801
+, "le" : 8804
+, "ge" : 8805
+, "sub" : 8834
+, "sup" : 8835
+, "nsub" : 8836
+, "sube" : 8838
+, "supe" : 8839
+, "oplus" : 8853
+, "otimes" : 8855
+, "perp" : 8869
+, "sdot" : 8901
+, "lceil" : 8968
+, "rceil" : 8969
+, "lfloor" : 8970
+, "rfloor" : 8971
+, "lang" : 9001
+, "rang" : 9002
+, "loz" : 9674
+, "spades" : 9824
+, "clubs" : 9827
+, "hearts" : 9829
+, "diams" : 9830
+}
+
+Object.keys(sax.ENTITIES).forEach(function (key) {
+ var e = sax.ENTITIES[key]
+ var s = typeof e === 'number' ? String.fromCharCode(e) : e
+ sax.ENTITIES[key] = s
+})
+
+for (var S in sax.STATE) sax.STATE[sax.STATE[S]] = S
+
+// shorthand
+S = sax.STATE
+
+function emit (parser, event, data) {
+ parser[event] && parser[event](data)
+}
+
+function emitNode (parser, nodeType, data) {
+ if (parser.textNode) closeText(parser)
+ emit(parser, nodeType, data)
+}
+
+function closeText (parser) {
+ parser.textNode = textopts(parser.opt, parser.textNode)
+ if (parser.textNode) emit(parser, "ontext", parser.textNode)
+ parser.textNode = ""
+}
+
+function textopts (opt, text) {
+ if (opt.trim) text = text.trim()
+ if (opt.normalize) text = text.replace(/\s+/g, " ")
+ return text
+}
+
+function error (parser, er) {
+ closeText(parser)
+ if (parser.trackPosition) {
+ er += "\nLine: "+parser.line+
+ "\nColumn: "+parser.column+
+ "\nChar: "+parser.c
+ }
+ er = new Error(er)
+ parser.error = er
+ emit(parser, "onerror", er)
+ return parser
+}
+
+function end (parser) {
+ if (!parser.closedRoot) strictFail(parser, "Unclosed root tag")
+ if ((parser.state !== S.BEGIN) && (parser.state !== S.TEXT)) error(parser, "Unexpected end")
+ closeText(parser)
+ parser.c = ""
+ parser.closed = true
+ emit(parser, "onend")
+ SAXParser.call(parser, parser.strict, parser.opt)
+ return parser
+}
+
+function strictFail (parser, message) {
+ if (typeof parser !== 'object' || !(parser instanceof SAXParser))
+ throw new Error('bad call to strictFail');
+ if (parser.strict) error(parser, message)
+}
+
+function newTag (parser) {
+ if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
+ var parent = parser.tags[parser.tags.length - 1] || parser
+ , tag = parser.tag = { name : parser.tagName, attributes : {} }
+
+ // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
+ if (parser.opt.xmlns) tag.ns = parent.ns
+ parser.attribList.length = 0
+}
+
+function qname (name, attribute) {
+ var i = name.indexOf(":")
+ , qualName = i < 0 ? [ "", name ] : name.split(":")
+ , prefix = qualName[0]
+ , local = qualName[1]
+
+ // <x "xmlns"="http://foo">
+ if (attribute && name === "xmlns") {
+ prefix = "xmlns"
+ local = ""
+ }
+
+ return { prefix: prefix, local: local }
+}
+
+function attrib (parser) {
+ if (!parser.strict) parser.attribName = parser.attribName[parser.looseCase]()
+
+ if (parser.attribList.indexOf(parser.attribName) !== -1 ||
+ parser.tag.attributes.hasOwnProperty(parser.attribName)) {
+ return parser.attribName = parser.attribValue = ""
+ }
+
+ if (parser.opt.xmlns) {
+ var qn = qname(parser.attribName, true)
+ , prefix = qn.prefix
+ , local = qn.local
+
+ if (prefix === "xmlns") {
+ // namespace binding attribute; push the binding into scope
+ if (local === "xml" && parser.attribValue !== XML_NAMESPACE) {
+ strictFail( parser
+ , "xml: prefix must be bound to " + XML_NAMESPACE + "\n"
+ + "Actual: " + parser.attribValue )
+ } else if (local === "xmlns" && parser.attribValue !== XMLNS_NAMESPACE) {
+ strictFail( parser
+ , "xmlns: prefix must be bound to " + XMLNS_NAMESPACE + "\n"
+ + "Actual: " + parser.attribValue )
+ } else {
+ var tag = parser.tag
+ , parent = parser.tags[parser.tags.length - 1] || parser
+ if (tag.ns === parent.ns) {
+ tag.ns = Object.create(parent.ns)
+ }
+ tag.ns[local] = parser.attribValue
+ }
+ }
+
+ // defer onattribute events until all attributes have been seen
+ // so any new bindings can take effect; preserve attribute order
+ // so deferred events can be emitted in document order
+ parser.attribList.push([parser.attribName, parser.attribValue])
+ } else {
+ // in non-xmlns mode, we can emit the event right away
+ parser.tag.attributes[parser.attribName] = parser.attribValue
+ emitNode( parser
+ , "onattribute"
+ , { name: parser.attribName
+ , value: parser.attribValue } )
+ }
+
+ parser.attribName = parser.attribValue = ""
+}
+
+function openTag (parser, selfClosing) {
+ if (parser.opt.xmlns) {
+ // emit namespace binding events
+ var tag = parser.tag
+
+ // add namespace info to tag
+ var qn = qname(parser.tagName)
+ tag.prefix = qn.prefix
+ tag.local = qn.local
+ tag.uri = tag.ns[qn.prefix] || ""
+
+ if (tag.prefix && !tag.uri) {
+ strictFail(parser, "Unbound namespace prefix: "
+ + JSON.stringify(parser.tagName))
+ tag.uri = qn.prefix
+ }
+
+ var parent = parser.tags[parser.tags.length - 1] || parser
+ if (tag.ns && parent.ns !== tag.ns) {
+ Object.keys(tag.ns).forEach(function (p) {
+ emitNode( parser
+ , "onopennamespace"
+ , { prefix: p , uri: tag.ns[p] } )
+ })
+ }
+
+ // handle deferred onattribute events
+ // Note: do not apply default ns to attributes:
+ // http://www.w3.org/TR/REC-xml-names/#defaulting
+ for (var i = 0, l = parser.attribList.length; i < l; i ++) {
+ var nv = parser.attribList[i]
+ var name = nv[0]
+ , value = nv[1]
+ , qualName = qname(name, true)
+ , prefix = qualName.prefix
+ , local = qualName.local
+ , uri = prefix == "" ? "" : (tag.ns[prefix] || "")
+ , a = { name: name
+ , value: value
+ , prefix: prefix
+ , local: local
+ , uri: uri
+ }
+
+ // if there's any attributes with an undefined namespace,
+ // then fail on them now.
+ if (prefix && prefix != "xmlns" && !uri) {
+ strictFail(parser, "Unbound namespace prefix: "
+ + JSON.stringify(prefix))
+ a.uri = prefix
+ }
+ parser.tag.attributes[name] = a
+ emitNode(parser, "onattribute", a)
+ }
+ parser.attribList.length = 0
+ }
+
+ parser.tag.isSelfClosing = !!selfClosing
+
+ // process the tag
+ parser.sawRoot = true
+ parser.tags.push(parser.tag)
+ emitNode(parser, "onopentag", parser.tag)
+ if (!selfClosing) {
+ // special case for <script> in non-strict mode.
+ if (!parser.noscript && parser.tagName.toLowerCase() === "script") {
+ parser.state = S.SCRIPT
+ } else {
+ parser.state = S.TEXT
+ }
+ parser.tag = null
+ parser.tagName = ""
+ }
+ parser.attribName = parser.attribValue = ""
+ parser.attribList.length = 0
+}
+
+function closeTag (parser) {
+ if (!parser.tagName) {
+ strictFail(parser, "Weird empty close tag.")
+ parser.textNode += "</>"
+ parser.state = S.TEXT
+ return
+ }
+
+ if (parser.script) {
+ if (parser.tagName !== "script") {
+ parser.script += "</" + parser.tagName + ">"
+ parser.tagName = ""
+ parser.state = S.SCRIPT
+ return
+ }
+ emitNode(parser, "onscript", parser.script)
+ parser.script = ""
+ }
+
+ // first make sure that the closing tag actually exists.
+ // <a><b></c></b></a> will close everything, otherwise.
+ var t = parser.tags.length
+ var tagName = parser.tagName
+ if (!parser.strict) tagName = tagName[parser.looseCase]()
+ var closeTo = tagName
+ while (t --) {
+ var close = parser.tags[t]
+ if (close.name !== closeTo) {
+ // fail the first time in strict mode
+ strictFail(parser, "Unexpected close tag")
+ } else break
+ }
+
+ // didn't find it. we already failed for strict, so just abort.
+ if (t < 0) {
+ strictFail(parser, "Unmatched closing tag: "+parser.tagName)
+ parser.textNode += "</" + parser.tagName + ">"
+ parser.state = S.TEXT
+ return
+ }
+ parser.tagName = tagName
+ var s = parser.tags.length
+ while (s --> t) {
+ var tag = parser.tag = parser.tags.pop()
+ parser.tagName = parser.tag.name
+ emitNode(parser, "onclosetag", parser.tagName)
+
+ var x = {}
+ for (var i in tag.ns) x[i] = tag.ns[i]
+
+ var parent = parser.tags[parser.tags.length - 1] || parser
+ if (parser.opt.xmlns && tag.ns !== parent.ns) {
+ // remove namespace bindings introduced by tag
+ Object.keys(tag.ns).forEach(function (p) {
+ var n = tag.ns[p]
+ emitNode(parser, "onclosenamespace", { prefix: p, uri: n })
+ })
+ }
+ }
+ if (t === 0) parser.closedRoot = true
+ parser.tagName = parser.attribValue = parser.attribName = ""
+ parser.attribList.length = 0
+ parser.state = S.TEXT
+}
+
+function parseEntity (parser) {
+ var entity = parser.entity
+ , entityLC = entity.toLowerCase()
+ , num
+ , numStr = ""
+ if (parser.ENTITIES[entity])
+ return parser.ENTITIES[entity]
+ if (parser.ENTITIES[entityLC])
+ return parser.ENTITIES[entityLC]
+ entity = entityLC
+ if (entity.charAt(0) === "#") {
+ if (entity.charAt(1) === "x") {
+ entity = entity.slice(2)
+ num = parseInt(entity, 16)
+ numStr = num.toString(16)
+ } else {
+ entity = entity.slice(1)
+ num = parseInt(entity, 10)
+ numStr = num.toString(10)
+ }
+ }
+ entity = entity.replace(/^0+/, "")
+ if (numStr.toLowerCase() !== entity) {
+ strictFail(parser, "Invalid character entity")
+ return "&"+parser.entity + ";"
+ }
+ return String.fromCharCode(num)
+}
+
+function write (chunk) {
+ var parser = this
+ if (this.error) throw this.error
+ if (parser.closed) return error(parser,
+ "Cannot write after close. Assign an onready handler.")
+ if (chunk === null) return end(parser)
+ var i = 0, c = ""
+ while (parser.c = c = chunk.charAt(i++)) {
+ if (parser.trackPosition) {
+ parser.position ++
+ if (c === "\n") {
+ parser.line ++
+ parser.column = 0
+ } else parser.column ++
+ }
+ switch (parser.state) {
+
+ case S.BEGIN:
+ if (c === "<") {
+ parser.state = S.OPEN_WAKA
+ parser.startTagPosition = parser.position
+ } else if (not(whitespace,c)) {
+ // have to process this as a text node.
+ // weird, but happens.
+ strictFail(parser, "Non-whitespace before first tag.")
+ parser.textNode = c
+ parser.state = S.TEXT
+ }
+ continue
+
+ case S.TEXT:
+ if (parser.sawRoot && !parser.closedRoot) {
+ var starti = i-1
+ while (c && c!=="<" && c!=="&") {
+ c = chunk.charAt(i++)
+ if (c && parser.trackPosition) {
+ parser.position ++
+ if (c === "\n") {
+ parser.line ++
+ parser.column = 0
+ } else parser.column ++
+ }
+ }
+ parser.textNode += chunk.substring(starti, i-1)
+ }
+ if (c === "<") {
+ parser.state = S.OPEN_WAKA
+ parser.startTagPosition = parser.position
+ } else {
+ if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot))
+ strictFail(parser, "Text data outside of root node.")
+ if (c === "&") parser.state = S.TEXT_ENTITY
+ else parser.textNode += c
+ }
+ continue
+
+ case S.SCRIPT:
+ // only non-strict
+ if (c === "<") {
+ parser.state = S.SCRIPT_ENDING
+ } else parser.script += c
+ continue
+
+ case S.SCRIPT_ENDING:
+ if (c === "/") {
+ parser.state = S.CLOSE_TAG
+ } else {
+ parser.script += "<" + c
+ parser.state = S.SCRIPT
+ }
+ continue
+
+ case S.OPEN_WAKA:
+ // either a /, ?, !, or text is coming next.
+ if (c === "!") {
+ parser.state = S.SGML_DECL
+ parser.sgmlDecl = ""
+ } else if (is(whitespace, c)) {
+ // wait for it...
+ } else if (is(nameStart,c)) {
+ parser.state = S.OPEN_TAG
+ parser.tagName = c
+ } else if (c === "/") {
+ parser.state = S.CLOSE_TAG
+ parser.tagName = ""
+ } else if (c === "?") {
+ parser.state = S.PROC_INST
+ parser.procInstName = parser.procInstBody = ""
+ } else {
+ strictFail(parser, "Unencoded <")
+ // if there was some whitespace, then add that in.
+ if (parser.startTagPosition + 1 < parser.position) {
+ var pad = parser.position - parser.startTagPosition
+ c = new Array(pad).join(" ") + c
+ }
+ parser.textNode += "<" + c
+ parser.state = S.TEXT
+ }
+ continue
+
+ case S.SGML_DECL:
+ if ((parser.sgmlDecl+c).toUpperCase() === CDATA) {
+ emitNode(parser, "onopencdata")
+ parser.state = S.CDATA
+ parser.sgmlDecl = ""
+ parser.cdata = ""
+ } else if (parser.sgmlDecl+c === "--") {
+ parser.state = S.COMMENT
+ parser.comment = ""
+ parser.sgmlDecl = ""
+ } else if ((parser.sgmlDecl+c).toUpperCase() === DOCTYPE) {
+ parser.state = S.DOCTYPE
+ if (parser.doctype || parser.sawRoot) strictFail(parser,
+ "Inappropriately located doctype declaration")
+ parser.doctype = ""
+ parser.sgmlDecl = ""
+ } else if (c === ">") {
+ emitNode(parser, "onsgmldeclaration", parser.sgmlDecl)
+ parser.sgmlDecl = ""
+ parser.state = S.TEXT
+ } else if (is(quote, c)) {
+ parser.state = S.SGML_DECL_QUOTED
+ parser.sgmlDecl += c
+ } else parser.sgmlDecl += c
+ continue
+
+ case S.SGML_DECL_QUOTED:
+ if (c === parser.q) {
+ parser.state = S.SGML_DECL
+ parser.q = ""
+ }
+ parser.sgmlDecl += c
+ continue
+
+ case S.DOCTYPE:
+ if (c === ">") {
+ parser.state = S.TEXT
+ emitNode(parser, "ondoctype", parser.doctype)
+ parser.doctype = true // just remember that we saw it.
+ } else {
+ parser.doctype += c
+ if (c === "[") parser.state = S.DOCTYPE_DTD
+ else if (is(quote, c)) {
+ parser.state = S.DOCTYPE_QUOTED
+ parser.q = c
+ }
+ }
+ continue
+
+ case S.DOCTYPE_QUOTED:
+ parser.doctype += c
+ if (c === parser.q) {
+ parser.q = ""
+ parser.state = S.DOCTYPE
+ }
+ continue
+
+ case S.DOCTYPE_DTD:
+ parser.doctype += c
+ if (c === "]") parser.state = S.DOCTYPE
+ else if (is(quote,c)) {
+ parser.state = S.DOCTYPE_DTD_QUOTED
+ parser.q = c
+ }
+ continue
+
+ case S.DOCTYPE_DTD_QUOTED:
+ parser.doctype += c
+ if (c === parser.q) {
+ parser.state = S.DOCTYPE_DTD
+ parser.q = ""
+ }
+ continue
+
+ case S.COMMENT:
+ if (c === "-") parser.state = S.COMMENT_ENDING
+ else parser.comment += c
+ continue
+
+ case S.COMMENT_ENDING:
+ if (c === "-") {
+ parser.state = S.COMMENT_ENDED
+ parser.comment = textopts(parser.opt, parser.comment)
+ if (parser.comment) emitNode(parser, "oncomment", parser.comment)
+ parser.comment = ""
+ } else {
+ parser.comment += "-" + c
+ parser.state = S.COMMENT
+ }
+ continue
+
+ case S.COMMENT_ENDED:
+ if (c !== ">") {
+ strictFail(parser, "Malformed comment")
+ // allow <!-- blah -- bloo --> in non-strict mode,
+ // which is a comment of " blah -- bloo "
+ parser.comment += "--" + c
+ parser.state = S.COMMENT
+ } else parser.state = S.TEXT
+ continue
+
+ case S.CDATA:
+ if (c === "]") parser.state = S.CDATA_ENDING
+ else parser.cdata += c
+ continue
+
+ case S.CDATA_ENDING:
+ if (c === "]") parser.state = S.CDATA_ENDING_2
+ else {
+ parser.cdata += "]" + c
+ parser.state = S.CDATA
+ }
+ continue
+
+ case S.CDATA_ENDING_2:
+ if (c === ">") {
+ if (parser.cdata) emitNode(parser, "oncdata", parser.cdata)
+ emitNode(parser, "onclosecdata")
+ parser.cdata = ""
+ parser.state = S.TEXT
+ } else if (c === "]") {
+ parser.cdata += "]"
+ } else {
+ parser.cdata += "]]" + c
+ parser.state = S.CDATA
+ }
+ continue
+
+ case S.PROC_INST:
+ if (c === "?") parser.state = S.PROC_INST_ENDING
+ else if (is(whitespace, c)) parser.state = S.PROC_INST_BODY
+ else parser.procInstName += c
+ continue
+
+ case S.PROC_INST_BODY:
+ if (!parser.procInstBody && is(whitespace, c)) continue
+ else if (c === "?") parser.state = S.PROC_INST_ENDING
+ else parser.procInstBody += c
+ continue
+
+ case S.PROC_INST_ENDING:
+ if (c === ">") {
+ emitNode(parser, "onprocessinginstruction", {
+ name : parser.procInstName,
+ body : parser.procInstBody
+ })
+ parser.procInstName = parser.procInstBody = ""
+ parser.state = S.TEXT
+ } else {
+ parser.procInstBody += "?" + c
+ parser.state = S.PROC_INST_BODY
+ }
+ continue
+
+ case S.OPEN_TAG:
+ if (is(nameBody, c)) parser.tagName += c
+ else {
+ newTag(parser)
+ if (c === ">") openTag(parser)
+ else if (c === "/") parser.state = S.OPEN_TAG_SLASH
+ else {
+ if (not(whitespace, c)) strictFail(
+ parser, "Invalid character in tag name")
+ parser.state = S.ATTRIB
+ }
+ }
+ continue
+
+ case S.OPEN_TAG_SLASH:
+ if (c === ">") {
+ openTag(parser, true)
+ closeTag(parser)
+ } else {
+ strictFail(parser, "Forward-slash in opening tag not followed by >")
+ parser.state = S.ATTRIB
+ }
+ continue
+
+ case S.ATTRIB:
+ // haven't read the attribute name yet.
+ if (is(whitespace, c)) continue
+ else if (c === ">") openTag(parser)
+ else if (c === "/") parser.state = S.OPEN_TAG_SLASH
+ else if (is(nameStart, c)) {
+ parser.attribName = c
+ parser.attribValue = ""
+ parser.state = S.ATTRIB_NAME
+ } else strictFail(parser, "Invalid attribute name")
+ continue
+
+ case S.ATTRIB_NAME:
+ if (c === "=") parser.state = S.ATTRIB_VALUE
+ else if (c === ">") {
+ strictFail(parser, "Attribute without value")
+ parser.attribValue = parser.attribName
+ attrib(parser)
+ openTag(parser)
+ }
+ else if (is(whitespace, c)) parser.state = S.ATTRIB_NAME_SAW_WHITE
+ else if (is(nameBody, c)) parser.attribName += c
+ else strictFail(parser, "Invalid attribute name")
+ continue
+
+ case S.ATTRIB_NAME_SAW_WHITE:
+ if (c === "=") parser.state = S.ATTRIB_VALUE
+ else if (is(whitespace, c)) continue
+ else {
+ strictFail(parser, "Attribute without value")
+ parser.tag.attributes[parser.attribName] = ""
+ parser.attribValue = ""
+ emitNode(parser, "onattribute",
+ { name : parser.attribName, value : "" })
+ parser.attribName = ""
+ if (c === ">") openTag(parser)
+ else if (is(nameStart, c)) {
+ parser.attribName = c
+ parser.state = S.ATTRIB_NAME
+ } else {
+ strictFail(parser, "Invalid attribute name")
+ parser.state = S.ATTRIB
+ }
+ }
+ continue
+
+ case S.ATTRIB_VALUE:
+ if (is(whitespace, c)) continue
+ else if (is(quote, c)) {
+ parser.q = c
+ parser.state = S.ATTRIB_VALUE_QUOTED
+ } else {
+ strictFail(parser, "Unquoted attribute value")
+ parser.state = S.ATTRIB_VALUE_UNQUOTED
+ parser.attribValue = c
+ }
+ continue
+
+ case S.ATTRIB_VALUE_QUOTED:
+ if (c !== parser.q) {
+ if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_Q
+ else parser.attribValue += c
+ continue
+ }
+ attrib(parser)
+ parser.q = ""
+ parser.state = S.ATTRIB_VALUE_CLOSED
+ continue
+
+ case S.ATTRIB_VALUE_CLOSED:
+ if (is(whitespace, c)) {
+ parser.state = S.ATTRIB
+ } else if (c === ">") openTag(parser)
+ else if (c === "/") parser.state = S.OPEN_TAG_SLASH
+ else if (is(nameStart, c)) {
+ strictFail(parser, "No whitespace between attributes")
+ parser.attribName = c
+ parser.attribValue = ""
+ parser.state = S.ATTRIB_NAME
+ } else strictFail(parser, "Invalid attribute name")
+ continue
+
+ case S.ATTRIB_VALUE_UNQUOTED:
+ if (not(attribEnd,c)) {
+ if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_U
+ else parser.attribValue += c
+ continue
+ }
+ attrib(parser)
+ if (c === ">") openTag(parser)
+ else parser.state = S.ATTRIB
+ continue
+
+ case S.CLOSE_TAG:
+ if (!parser.tagName) {
+ if (is(whitespace, c)) continue
+ else if (not(nameStart, c)) {
+ if (parser.script) {
+ parser.script += "</" + c
+ parser.state = S.SCRIPT
+ } else {
+ strictFail(parser, "Invalid tagname in closing tag.")
+ }
+ } else parser.tagName = c
+ }
+ else if (c === ">") closeTag(parser)
+ else if (is(nameBody, c)) parser.tagName += c
+ else if (parser.script) {
+ parser.script += "</" + parser.tagName
+ parser.tagName = ""
+ parser.state = S.SCRIPT
+ } else {
+ if (not(whitespace, c)) strictFail(parser,
+ "Invalid tagname in closing tag")
+ parser.state = S.CLOSE_TAG_SAW_WHITE
+ }
+ continue
+
+ case S.CLOSE_TAG_SAW_WHITE:
+ if (is(whitespace, c)) continue
+ if (c === ">") closeTag(parser)
+ else strictFail(parser, "Invalid characters in closing tag")
+ continue
+
+ case S.TEXT_ENTITY:
+ case S.ATTRIB_VALUE_ENTITY_Q:
+ case S.ATTRIB_VALUE_ENTITY_U:
+ switch(parser.state) {
+ case S.TEXT_ENTITY:
+ var returnState = S.TEXT, buffer = "textNode"
+ break
+
+ case S.ATTRIB_VALUE_ENTITY_Q:
+ var returnState = S.ATTRIB_VALUE_QUOTED, buffer = "attribValue"
+ break
+
+ case S.ATTRIB_VALUE_ENTITY_U:
+ var returnState = S.ATTRIB_VALUE_UNQUOTED, buffer = "attribValue"
+ break
+ }
+ if (c === ";") {
+ parser[buffer] += parseEntity(parser)
+ parser.entity = ""
+ parser.state = returnState
+ }
+ else if (is(entity, c)) parser.entity += c
+ else {
+ strictFail(parser, "Invalid character entity")
+ parser[buffer] += "&" + parser.entity + c
+ parser.entity = ""
+ parser.state = returnState
+ }
+ continue
+
+ default:
+ throw new Error(parser, "Unknown state: " + parser.state)
+ }
+ } // while
+ // cdata blocks can get very big under normal conditions. emit and move on.
+ // if (parser.state === S.CDATA && parser.cdata) {
+ // emitNode(parser, "oncdata", parser.cdata)
+ // parser.cdata = ""
+ // }
+ if (parser.position >= parser.bufferCheckPosition) checkBufferLength(parser)
+ return parser
+}
+
+})(typeof exports === "undefined" ? sax = {} : exports)
diff --git a/node_modules/stylus/node_modules/sax/package.json b/node_modules/stylus/node_modules/sax/package.json
new file mode 100644
index 00000000..31f323b4
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "sax",
+ "description": "An evented streaming XML parser in JavaScript",
+ "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
+ "version": "0.5.8",
+ "main": "lib/sax.js",
+ "license": "BSD",
+ "scripts": {
+ "test": "node test/index.js"
+ },
+ "repository": "git://github.com/isaacs/sax-js.git"
+}
diff --git a/node_modules/stylus/node_modules/sax/test/attribute-name.js b/node_modules/stylus/node_modules/sax/test/attribute-name.js
new file mode 100644
index 00000000..9ebbe58e
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/attribute-name.js
@@ -0,0 +1,33 @@
+require(__dirname).test(
+ { xml: "<root length='12345'></root>"
+ , expect: [
+ ["attribute", {
+ name: "length"
+ , value: "12345"
+ , prefix: ""
+ , local: "length"
+ , uri: ""
+ }]
+ , ["opentag", {
+ name: "root"
+ , prefix: ""
+ , local: "root"
+ , uri: ""
+ , attributes: {
+ length: {
+ name: "length"
+ , value: "12345"
+ , prefix: ""
+ , local: "length"
+ , uri: ""
+ }
+ }
+ , ns: {}
+ , isSelfClosing: false
+ }]
+ , ["closetag", "root"]
+ ]
+ , strict: true
+ , opt: { xmlns: true }
+ }
+)
diff --git a/node_modules/stylus/node_modules/sax/test/attribute-no-space.js b/node_modules/stylus/node_modules/sax/test/attribute-no-space.js
new file mode 100644
index 00000000..fe9aa465
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/attribute-no-space.js
@@ -0,0 +1,75 @@
+// non-strict: no error
+require(__dirname).test
+ ( { xml : '<root attr1="first"attr2="second"/>'
+
+ , expect :
+ [ [ "attribute", { name: 'attr1', value: 'first' } ]
+ , [ "attribute", { name: 'attr2', value: 'second' } ]
+ , [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
+ , [ "closetag", "root" ]
+ ]
+ , strict : false
+ , opt : { lowercase: true }
+ }
+ )
+
+// strict: should give an error, but still parse
+require(__dirname).test
+ ( { xml : '<root attr1="first"attr2="second"/>'
+
+ , expect :
+ [ [ "attribute", { name: 'attr1', value: 'first' } ]
+ , [ "error", "No whitespace between attributes\nLine: 0\nColumn: 20\nChar: a" ]
+ , [ "attribute", { name: 'attr2', value: 'second' } ]
+ , [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
+ , [ "closetag", "root" ]
+ ]
+ , strict : true
+ , opt : { }
+ }
+ )
+
+// strict: other cases should still pass
+require(__dirname).test
+ ( { xml : '<root attr1="first" attr2="second"/>'
+
+ , expect :
+ [ [ "attribute", { name: 'attr1', value: 'first' } ]
+ , [ "attribute", { name: 'attr2', value: 'second' } ]
+ , [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
+ , [ "closetag", "root" ]
+ ]
+ , strict : true
+ , opt : { }
+ }
+ )
+
+// strict: other cases should still pass
+require(__dirname).test
+ ( { xml : '<root attr1="first"\nattr2="second"/>'
+
+ , expect :
+ [ [ "attribute", { name: 'attr1', value: 'first' } ]
+ , [ "attribute", { name: 'attr2', value: 'second' } ]
+ , [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
+ , [ "closetag", "root" ]
+ ]
+ , strict : true
+ , opt : { }
+ }
+ )
+
+// strict: other cases should still pass
+require(__dirname).test
+ ( { xml : '<root attr1="first" attr2="second"/>'
+
+ , expect :
+ [ [ "attribute", { name: 'attr1', value: 'first' } ]
+ , [ "attribute", { name: 'attr2', value: 'second' } ]
+ , [ "opentag", { name: "root", attributes: {attr1: 'first', attr2: 'second'}, isSelfClosing: true } ]
+ , [ "closetag", "root" ]
+ ]
+ , strict : true
+ , opt : { }
+ }
+ )
diff --git a/node_modules/stylus/node_modules/sax/test/buffer-overrun.js b/node_modules/stylus/node_modules/sax/test/buffer-overrun.js
new file mode 100644
index 00000000..57d3c41f
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/buffer-overrun.js
@@ -0,0 +1,26 @@
+// set this really low so that I don't have to put 64 MB of xml in here.
+var sax = require("../lib/sax")
+var bl = sax.MAX_BUFFER_LENGTH
+sax.MAX_BUFFER_LENGTH = 5;
+
+require(__dirname).test({
+ expect : [
+ ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 15\nChar: "],
+ ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 30\nChar: "],
+ ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 45\nChar: "],
+ ["opentag", {
+ "name": "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "attributes": {},
+ "isSelfClosing": false
+ }],
+ ["text", "yo"],
+ ["closetag", "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"]
+ ]
+}).write("<abcdefghijklmn")
+ .write("opqrstuvwxyzABC")
+ .write("DEFGHIJKLMNOPQR")
+ .write("STUVWXYZ>")
+ .write("yo")
+ .write("</abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ>")
+ .close();
+sax.MAX_BUFFER_LENGTH = bl
diff --git a/node_modules/stylus/node_modules/sax/test/case.js b/node_modules/stylus/node_modules/sax/test/case.js
new file mode 100644
index 00000000..9da78aba
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/case.js
@@ -0,0 +1,50 @@
+// default to uppercase
+require(__dirname).test
+ ( { xml :
+ "<span class=\"test\" hello=\"world\"></span>"
+ , expect :
+ [ [ "attribute", { name: "CLASS", value: "test" } ]
+ , [ "attribute", { name: "HELLO", value: "world" } ]
+ , [ "opentag", { name: "SPAN",
+ attributes: { CLASS: "test", HELLO: "world" },
+ isSelfClosing: false } ]
+ , [ "closetag", "SPAN" ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
+
+// lowercase option : lowercase tag/attribute names
+require(__dirname).test
+ ( { xml :
+ "<span class=\"test\" hello=\"world\"></span>"
+ , expect :
+ [ [ "attribute", { name: "class", value: "test" } ]
+ , [ "attribute", { name: "hello", value: "world" } ]
+ , [ "opentag", { name: "span",
+ attributes: { class: "test", hello: "world" },
+ isSelfClosing: false } ]
+ , [ "closetag", "span" ]
+ ]
+ , strict : false
+ , opt : {lowercase:true}
+ }
+ )
+
+// backward compatibility with old lowercasetags opt
+require(__dirname).test
+ ( { xml :
+ "<span class=\"test\" hello=\"world\"></span>"
+ , expect :
+ [ [ "attribute", { name: "class", value: "test" } ]
+ , [ "attribute", { name: "hello", value: "world" } ]
+ , [ "opentag", { name: "span",
+ attributes: { class: "test", hello: "world" },
+ isSelfClosing: false } ]
+ , [ "closetag", "span" ]
+ ]
+ , strict : false
+ , opt : {lowercasetags:true}
+ }
+ )
diff --git a/node_modules/stylus/node_modules/sax/test/cdata-chunked.js b/node_modules/stylus/node_modules/sax/test/cdata-chunked.js
new file mode 100644
index 00000000..e3362bc8
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/cdata-chunked.js
@@ -0,0 +1,11 @@
+
+require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
+ ["opencdata", undefined],
+ ["cdata", " this is character data  "],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+}).write("<r><![CDATA[ this is ").write("character data  ").write("]]></r>").close();
+
diff --git a/node_modules/stylus/node_modules/sax/test/cdata-end-split.js b/node_modules/stylus/node_modules/sax/test/cdata-end-split.js
new file mode 100644
index 00000000..34f34500
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/cdata-end-split.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
+ ["opencdata", undefined],
+ ["cdata", " this is "],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+})
+ .write("<r><![CDATA[ this is ]")
+ .write("]>")
+ .write("</r>")
+ .close();
+
diff --git a/node_modules/stylus/node_modules/sax/test/cdata-fake-end.js b/node_modules/stylus/node_modules/sax/test/cdata-fake-end.js
new file mode 100644
index 00000000..ccafa1b9
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/cdata-fake-end.js
@@ -0,0 +1,28 @@
+
+var p = require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
+ ["opencdata", undefined],
+ ["cdata", "[[[[[[[[]]]]]]]]"],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+})
+var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
+for (var i = 0; i < x.length ; i ++) {
+ p.write(x.charAt(i))
+}
+p.close();
+
+
+var p2 = require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
+ ["opencdata", undefined],
+ ["cdata", "[[[[[[[[]]]]]]]]"],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+})
+var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
+p2.write(x).close();
diff --git a/node_modules/stylus/node_modules/sax/test/cdata-multiple.js b/node_modules/stylus/node_modules/sax/test/cdata-multiple.js
new file mode 100644
index 00000000..8e2f9112
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/cdata-multiple.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
+ ["opencdata", undefined],
+ ["cdata", " this is "],
+ ["closecdata", undefined],
+ ["opencdata", undefined],
+ ["cdata", "character data  "],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+}).write("<r><![CDATA[ this is ]]>").write("<![CDA").write("T").write("A[")
+ .write("character data  ").write("]]></r>").close();
+
diff --git a/node_modules/stylus/node_modules/sax/test/cdata.js b/node_modules/stylus/node_modules/sax/test/cdata.js
new file mode 100644
index 00000000..31a8a304
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/cdata.js
@@ -0,0 +1,10 @@
+require(__dirname).test({
+ xml : "<r><![CDATA[ this is character data  ]]></r>",
+ expect : [
+ ["opentag", {"name": "R","attributes": {}, "isSelfClosing": false}],
+ ["opencdata", undefined],
+ ["cdata", " this is character data  "],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+});
diff --git a/node_modules/stylus/node_modules/sax/test/cyrillic.js b/node_modules/stylus/node_modules/sax/test/cyrillic.js
new file mode 100644
index 00000000..f05dd1b2
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/cyrillic.js
@@ -0,0 +1,8 @@
+require(__dirname).test({
+ xml: '<Р>тест</Р>',
+ expect: [
+ ['opentag', {'name':'Р', attributes:{}, isSelfClosing: false}],
+ ['text', 'тест'],
+ ['closetag', 'Р']
+ ]
+});
diff --git a/node_modules/stylus/node_modules/sax/test/duplicate-attribute.js b/node_modules/stylus/node_modules/sax/test/duplicate-attribute.js
new file mode 100644
index 00000000..a21eb419
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/duplicate-attribute.js
@@ -0,0 +1,13 @@
+require(__dirname).test
+ ( { xml :
+ "<span id=\"hello\" id=\"there\"></span>"
+ , expect :
+ [ [ "attribute", { name: "ID", value: "hello" } ]
+ , [ "opentag", { name: "SPAN",
+ attributes: { ID: "hello" }, isSelfClosing: false } ]
+ , [ "closetag", "SPAN" ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
diff --git a/node_modules/stylus/node_modules/sax/test/end_empty_stream.js b/node_modules/stylus/node_modules/sax/test/end_empty_stream.js
new file mode 100644
index 00000000..f01cc843
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/end_empty_stream.js
@@ -0,0 +1,5 @@
+var assert = require('assert');
+var saxStream = require('../lib/sax').createStream();
+assert.doesNotThrow(function() {
+ saxStream.end();
+});
diff --git a/node_modules/stylus/node_modules/sax/test/entities.js b/node_modules/stylus/node_modules/sax/test/entities.js
new file mode 100644
index 00000000..49016678
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/entities.js
@@ -0,0 +1,10 @@
+require(__dirname).test({
+ xml: '<r>&rfloor; ' +
+ '&spades; &copy; &rarr; &amp; ' +
+ '&lt; < < < < &gt; &real; &weierp; &euro;</r>',
+ expect: [
+ ['opentag', {'name':'R', attributes:{}, isSelfClosing: false}],
+ ['text', '⌋ ♠ © → & < < < < < > ℜ ℘ €'],
+ ['closetag', 'R']
+ ]
+});
diff --git a/node_modules/stylus/node_modules/sax/test/entity-mega.js b/node_modules/stylus/node_modules/sax/test/entity-mega.js
new file mode 100644
index 00000000..4759a022
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/entity-mega.js
@@ -0,0 +1,16 @@
+var sax = require('../');
+var xml = '<r>';
+var text = '';
+for (var i in sax.ENTITIES) {
+ xml += '&' + i + ';'
+ text += sax.ENTITIES[i]
+}
+xml += '</r>'
+require(__dirname).test({
+ xml: xml,
+ expect: [
+ ['opentag', {'name':'R', attributes:{}, isSelfClosing: false}],
+ ['text', text],
+ ['closetag', 'R']
+ ]
+});
diff --git a/node_modules/stylus/node_modules/sax/test/flush.js b/node_modules/stylus/node_modules/sax/test/flush.js
new file mode 100644
index 00000000..20f15e02
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/flush.js
@@ -0,0 +1,13 @@
+var parser = require(__dirname).test({
+ expect: [
+ ['opentag', {'name':'T', attributes:{}, isSelfClosing: false}],
+ ['text', 'flush'],
+ ['text', 'rest'],
+ ['closetag', 'T'],
+ ]
+});
+
+parser.write('<T>flush');
+parser.flush();
+parser.write('rest</T>');
+parser.close();
diff --git a/node_modules/stylus/node_modules/sax/test/index.js b/node_modules/stylus/node_modules/sax/test/index.js
new file mode 100644
index 00000000..d4e1ef4f
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/index.js
@@ -0,0 +1,86 @@
+var globalsBefore = JSON.stringify(Object.keys(global))
+ , util = require("util")
+ , assert = require("assert")
+ , fs = require("fs")
+ , path = require("path")
+ , sax = require("../lib/sax")
+
+exports.sax = sax
+
+// handy way to do simple unit tests
+// if the options contains an xml string, it'll be written and the parser closed.
+// otherwise, it's assumed that the test will write and close.
+exports.test = function test (options) {
+ var xml = options.xml
+ , parser = sax.parser(options.strict, options.opt)
+ , expect = options.expect
+ , e = 0
+ sax.EVENTS.forEach(function (ev) {
+ parser["on" + ev] = function (n) {
+ if (process.env.DEBUG) {
+ console.error({ expect: expect[e]
+ , actual: [ev, n] })
+ }
+ if (e >= expect.length && (ev === "end" || ev === "ready")) return
+ assert.ok( e < expect.length,
+ "expectation #"+e+" "+util.inspect(expect[e])+"\n"+
+ "Unexpected event: "+ev+" "+(n ? util.inspect(n) : ""))
+ var inspected = n instanceof Error ? "\n"+ n.message : util.inspect(n)
+ assert.equal(ev, expect[e][0],
+ "expectation #"+e+"\n"+
+ "Didn't get expected event\n"+
+ "expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
+ "actual: "+ev+" "+inspected+"\n")
+ if (ev === "error") assert.equal(n.message, expect[e][1])
+ else assert.deepEqual(n, expect[e][1],
+ "expectation #"+e+"\n"+
+ "Didn't get expected argument\n"+
+ "expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
+ "actual: "+ev+" "+inspected+"\n")
+ e++
+ if (ev === "error") parser.resume()
+ }
+ })
+ if (xml) parser.write(xml).close()
+ return parser
+}
+
+if (module === require.main) {
+ var running = true
+ , failures = 0
+
+ function fail (file, er) {
+ util.error("Failed: "+file)
+ util.error(er.stack || er.message)
+ failures ++
+ }
+
+ fs.readdir(__dirname, function (error, files) {
+ files = files.filter(function (file) {
+ return (/\.js$/.exec(file) && file !== 'index.js')
+ })
+ var n = files.length
+ , i = 0
+ console.log("0.." + n)
+ files.forEach(function (file) {
+ // run this test.
+ try {
+ require(path.resolve(__dirname, file))
+ var globalsAfter = JSON.stringify(Object.keys(global))
+ if (globalsAfter !== globalsBefore) {
+ var er = new Error("new globals introduced\n"+
+ "expected: "+globalsBefore+"\n"+
+ "actual: "+globalsAfter)
+ globalsBefore = globalsAfter
+ throw er
+ }
+ console.log("ok " + (++i) + " - " + file)
+ } catch (er) {
+ console.log("not ok "+ (++i) + " - " + file)
+ fail(file, er)
+ }
+ })
+ if (!failures) return console.log("#all pass")
+ else return console.error(failures + " failure" + (failures > 1 ? "s" : ""))
+ })
+}
diff --git a/node_modules/stylus/node_modules/sax/test/issue-23.js b/node_modules/stylus/node_modules/sax/test/issue-23.js
new file mode 100644
index 00000000..ccbdc351
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/issue-23.js
@@ -0,0 +1,43 @@
+
+require(__dirname).test
+ ( { xml :
+ "<compileClassesResponse>"+
+ "<result>"+
+ "<bodyCrc>653724009</bodyCrc>"+
+ "<column>-1</column>"+
+ "<id>01pG0000002KoSUIA0</id>"+
+ "<line>-1</line>"+
+ "<name>CalendarController</name>"+
+ "<success>true</success>"+
+ "</result>"+
+ "</compileClassesResponse>"
+
+ , expect :
+ [ [ "opentag", { name: "COMPILECLASSESRESPONSE", attributes: {}, isSelfClosing: false } ]
+ , [ "opentag", { name : "RESULT", attributes: {}, isSelfClosing: false } ]
+ , [ "opentag", { name: "BODYCRC", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "653724009" ]
+ , [ "closetag", "BODYCRC" ]
+ , [ "opentag", { name: "COLUMN", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "-1" ]
+ , [ "closetag", "COLUMN" ]
+ , [ "opentag", { name: "ID", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "01pG0000002KoSUIA0" ]
+ , [ "closetag", "ID" ]
+ , [ "opentag", {name: "LINE", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "-1" ]
+ , [ "closetag", "LINE" ]
+ , [ "opentag", {name: "NAME", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "CalendarController" ]
+ , [ "closetag", "NAME" ]
+ , [ "opentag", {name: "SUCCESS", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "true" ]
+ , [ "closetag", "SUCCESS" ]
+ , [ "closetag", "RESULT" ]
+ , [ "closetag", "COMPILECLASSESRESPONSE" ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/issue-30.js b/node_modules/stylus/node_modules/sax/test/issue-30.js
new file mode 100644
index 00000000..771b14e9
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/issue-30.js
@@ -0,0 +1,24 @@
+// https://github.com/isaacs/sax-js/issues/33
+require(__dirname).test
+ ( { xml : "<xml>\n"+
+ "<!-- \n"+
+ " comment with a single dash- in it\n"+
+ "-->\n"+
+ "<data/>\n"+
+ "</xml>"
+
+ , expect :
+ [ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "\n" ]
+ , [ "comment", " \n comment with a single dash- in it\n" ]
+ , [ "text", "\n" ]
+ , [ "opentag", { name: "data", attributes: {}, isSelfClosing: true } ]
+ , [ "closetag", "data" ]
+ , [ "text", "\n" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : true
+ , opt : {}
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/issue-35.js b/node_modules/stylus/node_modules/sax/test/issue-35.js
new file mode 100644
index 00000000..64d67b3f
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/issue-35.js
@@ -0,0 +1,15 @@
+// https://github.com/isaacs/sax-js/issues/35
+require(__dirname).test
+ ( { xml : "<xml>&#Xd;&#X0d;\n"+
+ "</xml>"
+
+ , expect :
+ [ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "\r\r\n" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : true
+ , opt : {}
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/issue-47.js b/node_modules/stylus/node_modules/sax/test/issue-47.js
new file mode 100644
index 00000000..661584ab
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/issue-47.js
@@ -0,0 +1,12 @@
+// https://github.com/isaacs/sax-js/issues/47
+require(__dirname).test
+ ( { xml : '<a href="query.svc?x=1&y=2&z=3"/>'
+ , expect : [
+ [ "attribute", { name:'HREF', value:"query.svc?x=1&y=2&z=3"} ],
+ [ "opentag", { name: "A", attributes: { HREF:"query.svc?x=1&y=2&z=3"}, isSelfClosing: true } ],
+ [ "closetag", "A" ]
+ ]
+ , opt : {}
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/issue-49.js b/node_modules/stylus/node_modules/sax/test/issue-49.js
new file mode 100644
index 00000000..ff2fbf75
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/issue-49.js
@@ -0,0 +1,31 @@
+// https://github.com/isaacs/sax-js/issues/49
+require(__dirname).test
+ ( { xml : "<xml><script>hello world</script></xml>"
+ , expect :
+ [ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
+ , [ "opentag", { name: "script", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "hello world" ]
+ , [ "closetag", "script" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : false
+ , opt : { lowercasetags: true, noscript: true }
+ }
+ )
+
+require(__dirname).test
+ ( { xml : "<xml><script><![CDATA[hello world]]></script></xml>"
+ , expect :
+ [ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
+ , [ "opentag", { name: "script", attributes: {}, isSelfClosing: false } ]
+ , [ "opencdata", undefined ]
+ , [ "cdata", "hello world" ]
+ , [ "closecdata", undefined ]
+ , [ "closetag", "script" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : false
+ , opt : { lowercasetags: true, noscript: true }
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/issue-84.js b/node_modules/stylus/node_modules/sax/test/issue-84.js
new file mode 100644
index 00000000..0e7ee699
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/issue-84.js
@@ -0,0 +1,13 @@
+// https://github.com/isaacs/sax-js/issues/49
+require(__dirname).test
+ ( { xml : "<?has unbalanced \"quotes?><xml>body</xml>"
+ , expect :
+ [ [ "processinginstruction", { name: "has", body: "unbalanced \"quotes" } ],
+ [ "opentag", { name: "xml", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "body" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : false
+ , opt : { lowercasetags: true, noscript: true }
+ }
+ )
diff --git a/node_modules/stylus/node_modules/sax/test/parser-position.js b/node_modules/stylus/node_modules/sax/test/parser-position.js
new file mode 100644
index 00000000..e4a68b1e
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/parser-position.js
@@ -0,0 +1,28 @@
+var sax = require("../lib/sax"),
+ assert = require("assert")
+
+function testPosition(chunks, expectedEvents) {
+ var parser = sax.parser();
+ expectedEvents.forEach(function(expectation) {
+ parser['on' + expectation[0]] = function() {
+ for (var prop in expectation[1]) {
+ assert.equal(parser[prop], expectation[1][prop]);
+ }
+ }
+ });
+ chunks.forEach(function(chunk) {
+ parser.write(chunk);
+ });
+};
+
+testPosition(['<div>abcdefgh</div>'],
+ [ ['opentag', { position: 5, startTagPosition: 1 }]
+ , ['text', { position: 19, startTagPosition: 14 }]
+ , ['closetag', { position: 19, startTagPosition: 14 }]
+ ]);
+
+testPosition(['<div>abcde','fgh</div>'],
+ [ ['opentag', { position: 5, startTagPosition: 1 }]
+ , ['text', { position: 19, startTagPosition: 14 }]
+ , ['closetag', { position: 19, startTagPosition: 14 }]
+ ]);
diff --git a/node_modules/stylus/node_modules/sax/test/script-close-better.js b/node_modules/stylus/node_modules/sax/test/script-close-better.js
new file mode 100644
index 00000000..f4887b9a
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/script-close-better.js
@@ -0,0 +1,12 @@
+require(__dirname).test({
+ xml : "<html><head><script>'<div>foo</div></'</script></head></html>",
+ expect : [
+ ["opentag", {"name": "HTML","attributes": {}, isSelfClosing: false}],
+ ["opentag", {"name": "HEAD","attributes": {}, isSelfClosing: false}],
+ ["opentag", {"name": "SCRIPT","attributes": {}, isSelfClosing: false}],
+ ["script", "'<div>foo</div></'"],
+ ["closetag", "SCRIPT"],
+ ["closetag", "HEAD"],
+ ["closetag", "HTML"]
+ ]
+});
diff --git a/node_modules/stylus/node_modules/sax/test/script.js b/node_modules/stylus/node_modules/sax/test/script.js
new file mode 100644
index 00000000..fbda1f6c
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/script.js
@@ -0,0 +1,12 @@
+require(__dirname).test({
+ xml : "<html><head><script>if (1 < 0) { console.log('elo there'); }</script></head></html>",
+ expect : [
+ ["opentag", {"name": "HTML","attributes": {}, "isSelfClosing": false}],
+ ["opentag", {"name": "HEAD","attributes": {}, "isSelfClosing": false}],
+ ["opentag", {"name": "SCRIPT","attributes": {}, "isSelfClosing": false}],
+ ["script", "if (1 < 0) { console.log('elo there'); }"],
+ ["closetag", "SCRIPT"],
+ ["closetag", "HEAD"],
+ ["closetag", "HTML"]
+ ]
+});
diff --git a/node_modules/stylus/node_modules/sax/test/self-closing-child-strict.js b/node_modules/stylus/node_modules/sax/test/self-closing-child-strict.js
new file mode 100644
index 00000000..3d6e9852
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/self-closing-child-strict.js
@@ -0,0 +1,44 @@
+
+require(__dirname).test({
+ xml :
+ "<root>"+
+ "<child>" +
+ "<haha />" +
+ "</child>" +
+ "<monkey>" +
+ "=(|)" +
+ "</monkey>" +
+ "</root>",
+ expect : [
+ ["opentag", {
+ "name": "root",
+ "attributes": {},
+ "isSelfClosing": false
+ }],
+ ["opentag", {
+ "name": "child",
+ "attributes": {},
+ "isSelfClosing": false
+ }],
+ ["opentag", {
+ "name": "haha",
+ "attributes": {},
+ "isSelfClosing": true
+ }],
+ ["closetag", "haha"],
+ ["closetag", "child"],
+ ["opentag", {
+ "name": "monkey",
+ "attributes": {},
+ "isSelfClosing": false
+ }],
+ ["text", "=(|)"],
+ ["closetag", "monkey"],
+ ["closetag", "root"],
+ ["end"],
+ ["ready"]
+ ],
+ strict : true,
+ opt : {}
+});
+
diff --git a/node_modules/stylus/node_modules/sax/test/self-closing-child.js b/node_modules/stylus/node_modules/sax/test/self-closing-child.js
new file mode 100644
index 00000000..f31c3664
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/self-closing-child.js
@@ -0,0 +1,44 @@
+
+require(__dirname).test({
+ xml :
+ "<root>"+
+ "<child>" +
+ "<haha />" +
+ "</child>" +
+ "<monkey>" +
+ "=(|)" +
+ "</monkey>" +
+ "</root>",
+ expect : [
+ ["opentag", {
+ "name": "ROOT",
+ "attributes": {},
+ "isSelfClosing": false
+ }],
+ ["opentag", {
+ "name": "CHILD",
+ "attributes": {},
+ "isSelfClosing": false
+ }],
+ ["opentag", {
+ "name": "HAHA",
+ "attributes": {},
+ "isSelfClosing": true
+ }],
+ ["closetag", "HAHA"],
+ ["closetag", "CHILD"],
+ ["opentag", {
+ "name": "MONKEY",
+ "attributes": {},
+ "isSelfClosing": false
+ }],
+ ["text", "=(|)"],
+ ["closetag", "MONKEY"],
+ ["closetag", "ROOT"],
+ ["end"],
+ ["ready"]
+ ],
+ strict : false,
+ opt : {}
+});
+
diff --git a/node_modules/stylus/node_modules/sax/test/self-closing-tag.js b/node_modules/stylus/node_modules/sax/test/self-closing-tag.js
new file mode 100644
index 00000000..d1d8b7c8
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/self-closing-tag.js
@@ -0,0 +1,25 @@
+
+require(__dirname).test({
+ xml :
+ "<root> "+
+ "<haha /> "+
+ "<haha/> "+
+ "<monkey> "+
+ "=(|) "+
+ "</monkey>"+
+ "</root> ",
+ expect : [
+ ["opentag", {name:"ROOT", attributes:{}, isSelfClosing: false}],
+ ["opentag", {name:"HAHA", attributes:{}, isSelfClosing: true}],
+ ["closetag", "HAHA"],
+ ["opentag", {name:"HAHA", attributes:{}, isSelfClosing: true}],
+ ["closetag", "HAHA"],
+ // ["opentag", {name:"HAHA", attributes:{}}],
+ // ["closetag", "HAHA"],
+ ["opentag", {name:"MONKEY", attributes:{}, isSelfClosing: false}],
+ ["text", "=(|)"],
+ ["closetag", "MONKEY"],
+ ["closetag", "ROOT"]
+ ],
+ opt : { trim : true }
+}); \ No newline at end of file
diff --git a/node_modules/stylus/node_modules/sax/test/stray-ending.js b/node_modules/stylus/node_modules/sax/test/stray-ending.js
new file mode 100644
index 00000000..bec467b2
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/stray-ending.js
@@ -0,0 +1,17 @@
+// stray ending tags should just be ignored in non-strict mode.
+// https://github.com/isaacs/sax-js/issues/32
+require(__dirname).test
+ ( { xml :
+ "<a><b></c></b></a>"
+ , expect :
+ [ [ "opentag", { name: "A", attributes: {}, isSelfClosing: false } ]
+ , [ "opentag", { name: "B", attributes: {}, isSelfClosing: false } ]
+ , [ "text", "</c>" ]
+ , [ "closetag", "B" ]
+ , [ "closetag", "A" ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/trailing-attribute-no-value.js b/node_modules/stylus/node_modules/sax/test/trailing-attribute-no-value.js
new file mode 100644
index 00000000..222837f8
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/trailing-attribute-no-value.js
@@ -0,0 +1,10 @@
+
+require(__dirname).test({
+ xml :
+ "<root attrib>",
+ expect : [
+ ["attribute", {name:"ATTRIB", value:"attrib"}],
+ ["opentag", {name:"ROOT", attributes:{"ATTRIB":"attrib"}, isSelfClosing: false}]
+ ],
+ opt : { trim : true }
+});
diff --git a/node_modules/stylus/node_modules/sax/test/trailing-non-whitespace.js b/node_modules/stylus/node_modules/sax/test/trailing-non-whitespace.js
new file mode 100644
index 00000000..619578b1
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/trailing-non-whitespace.js
@@ -0,0 +1,18 @@
+
+require(__dirname).test({
+ xml : "<span>Welcome,</span> to monkey land",
+ expect : [
+ ["opentag", {
+ "name": "SPAN",
+ "attributes": {},
+ isSelfClosing: false
+ }],
+ ["text", "Welcome,"],
+ ["closetag", "SPAN"],
+ ["text", " to monkey land"],
+ ["end"],
+ ["ready"]
+ ],
+ strict : false,
+ opt : {}
+});
diff --git a/node_modules/stylus/node_modules/sax/test/unclosed-root.js b/node_modules/stylus/node_modules/sax/test/unclosed-root.js
new file mode 100644
index 00000000..f4eeac61
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/unclosed-root.js
@@ -0,0 +1,11 @@
+require(__dirname).test
+ ( { xml : "<root>"
+
+ , expect :
+ [ [ "opentag", { name: "root", attributes: {}, isSelfClosing: false } ]
+ , [ "error", "Unclosed root tag\nLine: 0\nColumn: 6\nChar: " ]
+ ]
+ , strict : true
+ , opt : {}
+ }
+ )
diff --git a/node_modules/stylus/node_modules/sax/test/unquoted.js b/node_modules/stylus/node_modules/sax/test/unquoted.js
new file mode 100644
index 00000000..b3a9a812
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/unquoted.js
@@ -0,0 +1,18 @@
+// unquoted attributes should be ok in non-strict mode
+// https://github.com/isaacs/sax-js/issues/31
+require(__dirname).test
+ ( { xml :
+ "<span class=test hello=world></span>"
+ , expect :
+ [ [ "attribute", { name: "CLASS", value: "test" } ]
+ , [ "attribute", { name: "HELLO", value: "world" } ]
+ , [ "opentag", { name: "SPAN",
+ attributes: { CLASS: "test", HELLO: "world" },
+ isSelfClosing: false } ]
+ , [ "closetag", "SPAN" ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/utf8-split.js b/node_modules/stylus/node_modules/sax/test/utf8-split.js
new file mode 100644
index 00000000..e22bc100
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/utf8-split.js
@@ -0,0 +1,32 @@
+var assert = require('assert')
+var saxStream = require('../lib/sax').createStream()
+
+var b = new Buffer('误')
+
+saxStream.on('text', function(text) {
+ assert.equal(text, b.toString())
+})
+
+saxStream.write(new Buffer('<test><a>'))
+saxStream.write(b.slice(0, 1))
+saxStream.write(b.slice(1))
+saxStream.write(new Buffer('</a><b>'))
+saxStream.write(b.slice(0, 2))
+saxStream.write(b.slice(2))
+saxStream.write(new Buffer('</b><c>'))
+saxStream.write(b)
+saxStream.write(new Buffer('</c>'))
+saxStream.write(Buffer.concat([new Buffer('<d>'), b.slice(0, 1)]))
+saxStream.end(Buffer.concat([b.slice(1), new Buffer('</d></test>')]))
+
+var saxStream2 = require('../lib/sax').createStream()
+
+saxStream2.on('text', function(text) {
+ assert.equal(text, '�')
+});
+
+saxStream2.write(new Buffer('<e>'));
+saxStream2.write(new Buffer([0xC0]));
+saxStream2.write(new Buffer('</e>'));
+saxStream2.write(Buffer.concat([new Buffer('<f>'), b.slice(0,1)]));
+saxStream2.end();
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-as-tag-name.js b/node_modules/stylus/node_modules/sax/test/xmlns-as-tag-name.js
new file mode 100644
index 00000000..99142ca6
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-as-tag-name.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test
+ ( { xml :
+ "<xmlns/>"
+ , expect :
+ [ [ "opentag", { name: "xmlns", uri: "", prefix: "", local: "xmlns",
+ attributes: {}, ns: {},
+ isSelfClosing: true}
+ ],
+ ["closetag", "xmlns"]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+ );
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-issue-41.js b/node_modules/stylus/node_modules/sax/test/xmlns-issue-41.js
new file mode 100644
index 00000000..17ab45a0
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-issue-41.js
@@ -0,0 +1,68 @@
+var t = require(__dirname)
+
+ , xmls = // should be the same both ways.
+ [ "<parent xmlns:a='http://ATTRIBUTE' a:attr='value' />"
+ , "<parent a:attr='value' xmlns:a='http://ATTRIBUTE' />" ]
+
+ , ex1 =
+ [ [ "opennamespace"
+ , { prefix: "a"
+ , uri: "http://ATTRIBUTE"
+ }
+ ]
+ , [ "attribute"
+ , { name: "xmlns:a"
+ , value: "http://ATTRIBUTE"
+ , prefix: "xmlns"
+ , local: "a"
+ , uri: "http://www.w3.org/2000/xmlns/"
+ }
+ ]
+ , [ "attribute"
+ , { name: "a:attr"
+ , local: "attr"
+ , prefix: "a"
+ , uri: "http://ATTRIBUTE"
+ , value: "value"
+ }
+ ]
+ , [ "opentag"
+ , { name: "parent"
+ , uri: ""
+ , prefix: ""
+ , local: "parent"
+ , attributes:
+ { "a:attr":
+ { name: "a:attr"
+ , local: "attr"
+ , prefix: "a"
+ , uri: "http://ATTRIBUTE"
+ , value: "value"
+ }
+ , "xmlns:a":
+ { name: "xmlns:a"
+ , local: "a"
+ , prefix: "xmlns"
+ , uri: "http://www.w3.org/2000/xmlns/"
+ , value: "http://ATTRIBUTE"
+ }
+ }
+ , ns: {"a": "http://ATTRIBUTE"}
+ , isSelfClosing: true
+ }
+ ]
+ , ["closetag", "parent"]
+ , ["closenamespace", { prefix: "a", uri: "http://ATTRIBUTE" }]
+ ]
+
+ // swap the order of elements 2 and 1
+ , ex2 = [ex1[0], ex1[2], ex1[1]].concat(ex1.slice(3))
+ , expected = [ex1, ex2]
+
+xmls.forEach(function (x, i) {
+ t.test({ xml: x
+ , expect: expected[i]
+ , strict: true
+ , opt: { xmlns: true }
+ })
+})
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-rebinding.js b/node_modules/stylus/node_modules/sax/test/xmlns-rebinding.js
new file mode 100644
index 00000000..07e04255
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-rebinding.js
@@ -0,0 +1,63 @@
+
+require(__dirname).test
+ ( { xml :
+ "<root xmlns:x='x1' xmlns:y='y1' x:a='x1' y:a='y1'>"+
+ "<rebind xmlns:x='x2'>"+
+ "<check x:a='x2' y:a='y1'/>"+
+ "</rebind>"+
+ "<check x:a='x1' y:a='y1'/>"+
+ "</root>"
+
+ , expect :
+ [ [ "opennamespace", { prefix: "x", uri: "x1" } ]
+ , [ "opennamespace", { prefix: "y", uri: "y1" } ]
+ , [ "attribute", { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
+ , [ "attribute", { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } ]
+ , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
+ , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+ , [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
+ attributes: { "xmlns:x": { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" }
+ , "xmlns:y": { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" }
+ , "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
+ , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+ ns: { x: 'x1', y: 'y1' },
+ isSelfClosing: false } ]
+
+ , [ "opennamespace", { prefix: "x", uri: "x2" } ]
+ , [ "attribute", { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
+ , [ "opentag", { name: "rebind", uri: "", prefix: "", local: "rebind",
+ attributes: { "xmlns:x": { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } },
+ ns: { x: 'x2' },
+ isSelfClosing: false } ]
+
+ , [ "attribute", { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } ]
+ , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+ , [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
+ attributes: { "x:a": { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" }
+ , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+ ns: { x: 'x2' },
+ isSelfClosing: true } ]
+
+ , [ "closetag", "check" ]
+
+ , [ "closetag", "rebind" ]
+ , [ "closenamespace", { prefix: "x", uri: "x2" } ]
+
+ , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
+ , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+ , [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
+ attributes: { "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
+ , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+ ns: { x: 'x1', y: 'y1' },
+ isSelfClosing: true } ]
+ , [ "closetag", "check" ]
+
+ , [ "closetag", "root" ]
+ , [ "closenamespace", { prefix: "x", uri: "x1" } ]
+ , [ "closenamespace", { prefix: "y", uri: "y1" } ]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-strict.js b/node_modules/stylus/node_modules/sax/test/xmlns-strict.js
new file mode 100644
index 00000000..b5e3e518
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-strict.js
@@ -0,0 +1,74 @@
+
+require(__dirname).test
+ ( { xml :
+ "<root>"+
+ "<plain attr='normal'/>"+
+ "<ns1 xmlns='uri:default'>"+
+ "<plain attr='normal'/>"+
+ "</ns1>"+
+ "<ns2 xmlns:a='uri:nsa'>"+
+ "<plain attr='normal'/>"+
+ "<a:ns a:attr='namespaced'/>"+
+ "</ns2>"+
+ "</root>"
+
+ , expect :
+ [ [ "opentag", { name: "root", prefix: "", local: "root", uri: "",
+ attributes: {}, ns: {}, isSelfClosing: false } ]
+
+ , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
+ , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
+ attributes: { "attr": { name: "attr", value: "normal", uri: "", prefix: "", local: "attr", uri: "" } },
+ ns: {}, isSelfClosing: true } ]
+ , [ "closetag", "plain" ]
+
+ , [ "opennamespace", { prefix: "", uri: "uri:default" } ]
+
+ , [ "attribute", { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } ]
+ , [ "opentag", { name: "ns1", prefix: "", local: "ns1", uri: "uri:default",
+ attributes: { "xmlns": { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } },
+ ns: { "": "uri:default" }, isSelfClosing: false } ]
+
+ , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
+ , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "uri:default", ns: { '': 'uri:default' },
+ attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } },
+ isSelfClosing: true } ]
+ , [ "closetag", "plain" ]
+
+ , [ "closetag", "ns1" ]
+
+ , [ "closenamespace", { prefix: "", uri: "uri:default" } ]
+
+ , [ "opennamespace", { prefix: "a", uri: "uri:nsa" } ]
+
+ , [ "attribute", { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } ]
+
+ , [ "opentag", { name: "ns2", prefix: "", local: "ns2", uri: "",
+ attributes: { "xmlns:a": { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } },
+ ns: { a: "uri:nsa" }, isSelfClosing: false } ]
+
+ , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
+ , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
+ attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } },
+ ns: { a: 'uri:nsa' },
+ isSelfClosing: true } ]
+ , [ "closetag", "plain" ]
+
+ , [ "attribute", { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } ]
+ , [ "opentag", { name: "a:ns", prefix: "a", local: "ns", uri: "uri:nsa",
+ attributes: { "a:attr": { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } },
+ ns: { a: 'uri:nsa' },
+ isSelfClosing: true } ]
+ , [ "closetag", "a:ns" ]
+
+ , [ "closetag", "ns2" ]
+
+ , [ "closenamespace", { prefix: "a", uri: "uri:nsa" } ]
+
+ , [ "closetag", "root" ]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+ )
+
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-unbound-element.js b/node_modules/stylus/node_modules/sax/test/xmlns-unbound-element.js
new file mode 100644
index 00000000..9d031a2b
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-unbound-element.js
@@ -0,0 +1,33 @@
+require(__dirname).test(
+ { strict : true
+ , opt : { xmlns: true }
+ , expect :
+ [ [ "error", "Unbound namespace prefix: \"unbound:root\"\nLine: 0\nColumn: 15\nChar: >"]
+ , [ "opentag", { name: "unbound:root", uri: "unbound", prefix: "unbound", local: "root"
+ , attributes: {}, ns: {}, isSelfClosing: true } ]
+ , [ "closetag", "unbound:root" ]
+ ]
+ }
+).write("<unbound:root/>");
+
+require(__dirname).test(
+ { strict : true
+ , opt : { xmlns: true }
+ , expect :
+ [ [ "opennamespace", { prefix: "unbound", uri: "someuri" } ]
+ , [ "attribute", { name: 'xmlns:unbound', value: 'someuri'
+ , prefix: 'xmlns', local: 'unbound'
+ , uri: 'http://www.w3.org/2000/xmlns/' } ]
+ , [ "opentag", { name: "unbound:root", uri: "someuri", prefix: "unbound", local: "root"
+ , attributes: { 'xmlns:unbound': {
+ name: 'xmlns:unbound'
+ , value: 'someuri'
+ , prefix: 'xmlns'
+ , local: 'unbound'
+ , uri: 'http://www.w3.org/2000/xmlns/' } }
+ , ns: { "unbound": "someuri" }, isSelfClosing: true } ]
+ , [ "closetag", "unbound:root" ]
+ , [ "closenamespace", { prefix: 'unbound', uri: 'someuri' }]
+ ]
+ }
+).write("<unbound:root xmlns:unbound=\"someuri\"/>");
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-unbound.js b/node_modules/stylus/node_modules/sax/test/xmlns-unbound.js
new file mode 100644
index 00000000..b740e261
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-unbound.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test(
+ { strict : true
+ , opt : { xmlns: true }
+ , expect :
+ [ ["error", "Unbound namespace prefix: \"unbound\"\nLine: 0\nColumn: 28\nChar: >"]
+
+ , [ "attribute", { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } ]
+ , [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
+ attributes: { "unbound:attr": { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } },
+ ns: {}, isSelfClosing: true } ]
+ , [ "closetag", "root" ]
+ ]
+ }
+).write("<root unbound:attr='value'/>")
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-ns.js b/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-ns.js
new file mode 100644
index 00000000..b1984d25
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-ns.js
@@ -0,0 +1,31 @@
+var xmlns_attr =
+{
+ name: "xmlns", value: "http://foo", prefix: "xmlns",
+ local: "", uri : "http://www.w3.org/2000/xmlns/"
+};
+
+var attr_attr =
+{
+ name: "attr", value: "bar", prefix: "",
+ local : "attr", uri : ""
+};
+
+
+require(__dirname).test
+ ( { xml :
+ "<elm xmlns='http://foo' attr='bar'/>"
+ , expect :
+ [ [ "opennamespace", { prefix: "", uri: "http://foo" } ]
+ , [ "attribute", xmlns_attr ]
+ , [ "attribute", attr_attr ]
+ , [ "opentag", { name: "elm", prefix: "", local: "elm", uri : "http://foo",
+ ns : { "" : "http://foo" },
+ attributes: { xmlns: xmlns_attr, attr: attr_attr },
+ isSelfClosing: true } ]
+ , [ "closetag", "elm" ]
+ , [ "closenamespace", { prefix: "", uri: "http://foo"} ]
+ ]
+ , strict : true
+ , opt : {xmlns: true}
+ }
+ )
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js b/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
new file mode 100644
index 00000000..e41f2187
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
@@ -0,0 +1,36 @@
+require(__dirname).test(
+ { xml : "<root xml:lang='en'/>"
+ , expect :
+ [ [ "attribute"
+ , { name: "xml:lang"
+ , local: "lang"
+ , prefix: "xml"
+ , uri: "http://www.w3.org/XML/1998/namespace"
+ , value: "en"
+ }
+ ]
+ , [ "opentag"
+ , { name: "root"
+ , uri: ""
+ , prefix: ""
+ , local: "root"
+ , attributes:
+ { "xml:lang":
+ { name: "xml:lang"
+ , local: "lang"
+ , prefix: "xml"
+ , uri: "http://www.w3.org/XML/1998/namespace"
+ , value: "en"
+ }
+ }
+ , ns: {}
+ , isSelfClosing: true
+ }
+ ]
+ , ["closetag", "root"]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+)
+
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-prefix.js b/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-prefix.js
new file mode 100644
index 00000000..a85b4787
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-prefix.js
@@ -0,0 +1,21 @@
+require(__dirname).test(
+ { xml : "<xml:root/>"
+ , expect :
+ [
+ [ "opentag"
+ , { name: "xml:root"
+ , uri: "http://www.w3.org/XML/1998/namespace"
+ , prefix: "xml"
+ , local: "root"
+ , attributes: {}
+ , ns: {}
+ , isSelfClosing: true
+ }
+ ]
+ , ["closetag", "xml:root"]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+)
+
diff --git a/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-redefine.js b/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-redefine.js
new file mode 100644
index 00000000..d35d5a0c
--- /dev/null
+++ b/node_modules/stylus/node_modules/sax/test/xmlns-xml-default-redefine.js
@@ -0,0 +1,41 @@
+require(__dirname).test(
+ { xml : "<xml:root xmlns:xml='ERROR'/>"
+ , expect :
+ [ ["error"
+ , "xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n"
+ + "Actual: ERROR\n"
+ + "Line: 0\nColumn: 27\nChar: '"
+ ]
+ , [ "attribute"
+ , { name: "xmlns:xml"
+ , local: "xml"
+ , prefix: "xmlns"
+ , uri: "http://www.w3.org/2000/xmlns/"
+ , value: "ERROR"
+ }
+ ]
+ , [ "opentag"
+ , { name: "xml:root"
+ , uri: "http://www.w3.org/XML/1998/namespace"
+ , prefix: "xml"
+ , local: "root"
+ , attributes:
+ { "xmlns:xml":
+ { name: "xmlns:xml"
+ , local: "xml"
+ , prefix: "xmlns"
+ , uri: "http://www.w3.org/2000/xmlns/"
+ , value: "ERROR"
+ }
+ }
+ , ns: {}
+ , isSelfClosing: true
+ }
+ ]
+ , ["closetag", "xml:root"]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+)
+
diff --git a/node_modules/stylus/node_modules/source-map/.npmignore b/node_modules/stylus/node_modules/source-map/.npmignore
new file mode 100644
index 00000000..3dddf3f6
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/.npmignore
@@ -0,0 +1,2 @@
+dist/*
+node_modules/*
diff --git a/node_modules/stylus/node_modules/source-map/.travis.yml b/node_modules/stylus/node_modules/source-map/.travis.yml
new file mode 100644
index 00000000..ddc9c4f9
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.8
+ - "0.10" \ No newline at end of file
diff --git a/node_modules/stylus/node_modules/source-map/CHANGELOG.md b/node_modules/stylus/node_modules/source-map/CHANGELOG.md
new file mode 100644
index 00000000..2e7ca5d2
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/CHANGELOG.md
@@ -0,0 +1,194 @@
+# Change Log
+
+## 0.1.43
+
+* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue
+ #148 for some discussion and issues #150, #151, and #152 for implementations.
+
+## 0.1.42
+
+* Fix an issue where `SourceNode`s from different versions of the source-map
+ library couldn't be used in conjunction with each other. See issue #142.
+
+## 0.1.41
+
+* Fix a bug with getting the source content of relative sources with a "./"
+ prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768).
+
+* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the
+ column span of each mapping.
+
+* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find
+ all generated positions associated with a given original source and line.
+
+## 0.1.40
+
+* Performance improvements for parsing source maps in SourceMapConsumer.
+
+## 0.1.39
+
+* Fix a bug where setting a source's contents to null before any source content
+ had been set before threw a TypeError. See issue #131.
+
+## 0.1.38
+
+* Fix a bug where finding relative paths from an empty path were creating
+ absolute paths. See issue #129.
+
+## 0.1.37
+
+* Fix a bug where if the source root was an empty string, relative source paths
+ would turn into absolute source paths. Issue #124.
+
+## 0.1.36
+
+* Allow the `names` mapping property to be an empty string. Issue #121.
+
+## 0.1.35
+
+* A third optional parameter was added to `SourceNode.fromStringWithSourceMap`
+ to specify a path that relative sources in the second parameter should be
+ relative to. Issue #105.
+
+* If no file property is given to a `SourceMapGenerator`, then the resulting
+ source map will no longer have a `null` file property. The property will
+ simply not exist. Issue #104.
+
+* Fixed a bug where consecutive newlines were ignored in `SourceNode`s.
+ Issue #116.
+
+## 0.1.34
+
+* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103.
+
+* Fix bug involving source contents and the
+ `SourceMapGenerator.prototype.applySourceMap`. Issue #100.
+
+## 0.1.33
+
+* Fix some edge cases surrounding path joining and URL resolution.
+
+* Add a third parameter for relative path to
+ `SourceMapGenerator.prototype.applySourceMap`.
+
+* Fix issues with mappings and EOLs.
+
+## 0.1.32
+
+* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns
+ (issue 92).
+
+* Fixed test runner to actually report number of failed tests as its process
+ exit code.
+
+* Fixed a typo when reporting bad mappings (issue 87).
+
+## 0.1.31
+
+* Delay parsing the mappings in SourceMapConsumer until queried for a source
+ location.
+
+* Support Sass source maps (which at the time of writing deviate from the spec
+ in small ways) in SourceMapConsumer.
+
+## 0.1.30
+
+* Do not join source root with a source, when the source is a data URI.
+
+* Extend the test runner to allow running single specific test files at a time.
+
+* Performance improvements in `SourceNode.prototype.walk` and
+ `SourceMapConsumer.prototype.eachMapping`.
+
+* Source map browser builds will now work inside Workers.
+
+* Better error messages when attempting to add an invalid mapping to a
+ `SourceMapGenerator`.
+
+## 0.1.29
+
+* Allow duplicate entries in the `names` and `sources` arrays of source maps
+ (usually from TypeScript) we are parsing. Fixes github issue 72.
+
+## 0.1.28
+
+* Skip duplicate mappings when creating source maps from SourceNode; github
+ issue 75.
+
+## 0.1.27
+
+* Don't throw an error when the `file` property is missing in SourceMapConsumer,
+ we don't use it anyway.
+
+## 0.1.26
+
+* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70.
+
+## 0.1.25
+
+* Make compatible with browserify
+
+## 0.1.24
+
+* Fix issue with absolute paths and `file://` URIs. See
+ https://bugzilla.mozilla.org/show_bug.cgi?id=885597
+
+## 0.1.23
+
+* Fix issue with absolute paths and sourcesContent, github issue 64.
+
+## 0.1.22
+
+* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21.
+
+## 0.1.21
+
+* Fixed handling of sources that start with a slash so that they are relative to
+ the source root's host.
+
+## 0.1.20
+
+* Fixed github issue #43: absolute URLs aren't joined with the source root
+ anymore.
+
+## 0.1.19
+
+* Using Travis CI to run tests.
+
+## 0.1.18
+
+* Fixed a bug in the handling of sourceRoot.
+
+## 0.1.17
+
+* Added SourceNode.fromStringWithSourceMap.
+
+## 0.1.16
+
+* Added missing documentation.
+
+* Fixed the generating of empty mappings in SourceNode.
+
+## 0.1.15
+
+* Added SourceMapGenerator.applySourceMap.
+
+## 0.1.14
+
+* The sourceRoot is now handled consistently.
+
+## 0.1.13
+
+* Added SourceMapGenerator.fromSourceMap.
+
+## 0.1.12
+
+* SourceNode now generates empty mappings too.
+
+## 0.1.11
+
+* Added name support to SourceNode.
+
+## 0.1.10
+
+* Added sourcesContent support to the customer and generator.
diff --git a/node_modules/stylus/node_modules/source-map/LICENSE b/node_modules/stylus/node_modules/source-map/LICENSE
new file mode 100644
index 00000000..ed1b7cf2
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/LICENSE
@@ -0,0 +1,28 @@
+
+Copyright (c) 2009-2011, Mozilla Foundation and contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the names of the Mozilla Foundation nor the names of project
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/stylus/node_modules/source-map/Makefile.dryice.js b/node_modules/stylus/node_modules/source-map/Makefile.dryice.js
new file mode 100644
index 00000000..d6fc26a7
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/Makefile.dryice.js
@@ -0,0 +1,166 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+var path = require('path');
+var fs = require('fs');
+var copy = require('dryice').copy;
+
+function removeAmdefine(src) {
+ src = String(src).replace(
+ /if\s*\(typeof\s*define\s*!==\s*'function'\)\s*{\s*var\s*define\s*=\s*require\('amdefine'\)\(module,\s*require\);\s*}\s*/g,
+ '');
+ src = src.replace(
+ /\b(define\(.*)('amdefine',?)/gm,
+ '$1');
+ return src;
+}
+removeAmdefine.onRead = true;
+
+function makeNonRelative(src) {
+ return src
+ .replace(/require\('.\//g, 'require(\'source-map/')
+ .replace(/\.\.\/\.\.\/lib\//g, '');
+}
+makeNonRelative.onRead = true;
+
+function buildBrowser() {
+ console.log('\nCreating dist/source-map.js');
+
+ var project = copy.createCommonJsProject({
+ roots: [ path.join(__dirname, 'lib') ]
+ });
+
+ copy({
+ source: [
+ 'build/mini-require.js',
+ {
+ project: project,
+ require: [ 'source-map/source-map-generator',
+ 'source-map/source-map-consumer',
+ 'source-map/source-node']
+ },
+ 'build/suffix-browser.js'
+ ],
+ filter: [
+ copy.filter.moduleDefines,
+ removeAmdefine
+ ],
+ dest: 'dist/source-map.js'
+ });
+}
+
+function buildBrowserMin() {
+ console.log('\nCreating dist/source-map.min.js');
+
+ copy({
+ source: 'dist/source-map.js',
+ filter: copy.filter.uglifyjs,
+ dest: 'dist/source-map.min.js'
+ });
+}
+
+function buildFirefox() {
+ console.log('\nCreating dist/SourceMap.jsm');
+
+ var project = copy.createCommonJsProject({
+ roots: [ path.join(__dirname, 'lib') ]
+ });
+
+ copy({
+ source: [
+ 'build/prefix-source-map.jsm',
+ {
+ project: project,
+ require: [ 'source-map/source-map-consumer',
+ 'source-map/source-map-generator',
+ 'source-map/source-node' ]
+ },
+ 'build/suffix-source-map.jsm'
+ ],
+ filter: [
+ copy.filter.moduleDefines,
+ removeAmdefine,
+ makeNonRelative
+ ],
+ dest: 'dist/SourceMap.jsm'
+ });
+
+ // Create dist/test/Utils.jsm
+ console.log('\nCreating dist/test/Utils.jsm');
+
+ project = copy.createCommonJsProject({
+ roots: [ __dirname, path.join(__dirname, 'lib') ]
+ });
+
+ copy({
+ source: [
+ 'build/prefix-utils.jsm',
+ 'build/assert-shim.js',
+ {
+ project: project,
+ require: [ 'test/source-map/util' ]
+ },
+ 'build/suffix-utils.jsm'
+ ],
+ filter: [
+ copy.filter.moduleDefines,
+ removeAmdefine,
+ makeNonRelative
+ ],
+ dest: 'dist/test/Utils.jsm'
+ });
+
+ function isTestFile(f) {
+ return /^test\-.*?\.js/.test(f);
+ }
+
+ var testFiles = fs.readdirSync(path.join(__dirname, 'test', 'source-map')).filter(isTestFile);
+
+ testFiles.forEach(function (testFile) {
+ console.log('\nCreating', path.join('dist', 'test', testFile.replace(/\-/g, '_')));
+
+ copy({
+ source: [
+ 'build/test-prefix.js',
+ path.join('test', 'source-map', testFile),
+ 'build/test-suffix.js'
+ ],
+ filter: [
+ removeAmdefine,
+ makeNonRelative,
+ function (input, source) {
+ return input.replace('define(',
+ 'define("'
+ + path.join('test', 'source-map', testFile.replace(/\.js$/, ''))
+ + '", ["require", "exports", "module"], ');
+ },
+ function (input, source) {
+ return input.replace('{THIS_MODULE}', function () {
+ return "test/source-map/" + testFile.replace(/\.js$/, '');
+ });
+ }
+ ],
+ dest: path.join('dist', 'test', testFile.replace(/\-/g, '_'))
+ });
+ });
+}
+
+function ensureDir(name) {
+ var dirExists = false;
+ try {
+ dirExists = fs.statSync(name).isDirectory();
+ } catch (err) {}
+
+ if (!dirExists) {
+ fs.mkdirSync(name, 0777);
+ }
+}
+
+ensureDir("dist");
+ensureDir("dist/test");
+buildFirefox();
+buildBrowser();
+buildBrowserMin();
diff --git a/node_modules/stylus/node_modules/source-map/README.md b/node_modules/stylus/node_modules/source-map/README.md
new file mode 100644
index 00000000..59767aa3
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/README.md
@@ -0,0 +1,475 @@
+# Source Map
+
+This is a library to generate and consume the source map format
+[described here][format].
+
+This library is written in the Asynchronous Module Definition format, and works
+in the following environments:
+
+* Modern Browsers supporting ECMAScript 5 (either after the build, or with an
+ AMD loader such as RequireJS)
+
+* Inside Firefox (as a JSM file, after the build)
+
+* With NodeJS versions 0.8.X and higher
+
+## Node
+
+ $ npm install source-map
+
+## Building from Source (for everywhere else)
+
+Install Node and then run
+
+ $ git clone https://fitzgen@github.com/mozilla/source-map.git
+ $ cd source-map
+ $ npm link .
+
+Next, run
+
+ $ node Makefile.dryice.js
+
+This should spew a bunch of stuff to stdout, and create the following files:
+
+* `dist/source-map.js` - The unminified browser version.
+
+* `dist/source-map.min.js` - The minified browser version.
+
+* `dist/SourceMap.jsm` - The JavaScript Module for inclusion in Firefox source.
+
+## Examples
+
+### Consuming a source map
+
+ var rawSourceMap = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['one.js', 'two.js'],
+ sourceRoot: 'http://example.com/www/js/',
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+ };
+
+ var smc = new SourceMapConsumer(rawSourceMap);
+
+ console.log(smc.sources);
+ // [ 'http://example.com/www/js/one.js',
+ // 'http://example.com/www/js/two.js' ]
+
+ console.log(smc.originalPositionFor({
+ line: 2,
+ column: 28
+ }));
+ // { source: 'http://example.com/www/js/two.js',
+ // line: 2,
+ // column: 10,
+ // name: 'n' }
+
+ console.log(smc.generatedPositionFor({
+ source: 'http://example.com/www/js/two.js',
+ line: 2,
+ column: 10
+ }));
+ // { line: 2, column: 28 }
+
+ smc.eachMapping(function (m) {
+ // ...
+ });
+
+### Generating a source map
+
+In depth guide:
+[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)
+
+#### With SourceNode (high level API)
+
+ function compile(ast) {
+ switch (ast.type) {
+ case 'BinaryExpression':
+ return new SourceNode(
+ ast.location.line,
+ ast.location.column,
+ ast.location.source,
+ [compile(ast.left), " + ", compile(ast.right)]
+ );
+ case 'Literal':
+ return new SourceNode(
+ ast.location.line,
+ ast.location.column,
+ ast.location.source,
+ String(ast.value)
+ );
+ // ...
+ default:
+ throw new Error("Bad AST");
+ }
+ }
+
+ var ast = parse("40 + 2", "add.js");
+ console.log(compile(ast).toStringWithSourceMap({
+ file: 'add.js'
+ }));
+ // { code: '40 + 2',
+ // map: [object SourceMapGenerator] }
+
+#### With SourceMapGenerator (low level API)
+
+ var map = new SourceMapGenerator({
+ file: "source-mapped.js"
+ });
+
+ map.addMapping({
+ generated: {
+ line: 10,
+ column: 35
+ },
+ source: "foo.js",
+ original: {
+ line: 33,
+ column: 2
+ },
+ name: "christopher"
+ });
+
+ console.log(map.toString());
+ // '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}'
+
+## API
+
+Get a reference to the module:
+
+ // NodeJS
+ var sourceMap = require('source-map');
+
+ // Browser builds
+ var sourceMap = window.sourceMap;
+
+ // Inside Firefox
+ let sourceMap = {};
+ Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap);
+
+### SourceMapConsumer
+
+A SourceMapConsumer instance represents a parsed source map which we can query
+for information about the original file positions by giving it a file position
+in the generated source.
+
+#### new SourceMapConsumer(rawSourceMap)
+
+The only parameter is the raw source map (either as a string which can be
+`JSON.parse`'d, or an object). According to the spec, source maps have the
+following attributes:
+
+* `version`: Which version of the source map spec this map is following.
+
+* `sources`: An array of URLs to the original source files.
+
+* `names`: An array of identifiers which can be referrenced by individual
+ mappings.
+
+* `sourceRoot`: Optional. The URL root from which all sources are relative.
+
+* `sourcesContent`: Optional. An array of contents of the original source files.
+
+* `mappings`: A string of base64 VLQs which contain the actual mappings.
+
+* `file`: Optional. The generated filename this source map is associated with.
+
+#### SourceMapConsumer.prototype.computeColumnSpans()
+
+Compute the last column for each generated mapping. The last column is
+inclusive.
+
+#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
+
+Returns the original source, line, and column information for the generated
+source's line and column positions provided. The only argument is an object with
+the following properties:
+
+* `line`: The line number in the generated source.
+
+* `column`: The column number in the generated source.
+
+and an object is returned with the following properties:
+
+* `source`: The original source file, or null if this information is not
+ available.
+
+* `line`: The line number in the original source, or null if this information is
+ not available.
+
+* `column`: The column number in the original source, or null or null if this
+ information is not available.
+
+* `name`: The original identifier, or null if this information is not available.
+
+#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)
+
+Returns the generated line and column information for the original source,
+line, and column positions provided. The only argument is an object with
+the following properties:
+
+* `source`: The filename of the original source.
+
+* `line`: The line number in the original source.
+
+* `column`: The column number in the original source.
+
+and an object is returned with the following properties:
+
+* `line`: The line number in the generated source, or null.
+
+* `column`: The column number in the generated source, or null.
+
+#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)
+
+Returns all generated line and column information for the original source
+and line provided. The only argument is an object with the following
+properties:
+
+* `source`: The filename of the original source.
+
+* `line`: The line number in the original source.
+
+and an array of objects is returned, each with the following properties:
+
+* `line`: The line number in the generated source, or null.
+
+* `column`: The column number in the generated source, or null.
+
+#### SourceMapConsumer.prototype.sourceContentFor(source)
+
+Returns the original source content for the source provided. The only
+argument is the URL of the original source file.
+
+#### SourceMapConsumer.prototype.eachMapping(callback, context, order)
+
+Iterate over each mapping between an original source/line/column and a
+generated line/column in this source map.
+
+* `callback`: The function that is called with each mapping. Mappings have the
+ form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,
+ name }`
+
+* `context`: Optional. If specified, this object will be the value of `this`
+ every time that `callback` is called.
+
+* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or
+ `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over
+ the mappings sorted by the generated file's line/column order or the
+ original's source/line/column order, respectively. Defaults to
+ `SourceMapConsumer.GENERATED_ORDER`.
+
+### SourceMapGenerator
+
+An instance of the SourceMapGenerator represents a source map which is being
+built incrementally.
+
+#### new SourceMapGenerator([startOfSourceMap])
+
+You may pass an object with the following properties:
+
+* `file`: The filename of the generated source that this source map is
+ associated with.
+
+* `sourceRoot`: A root for all relative URLs in this source map.
+
+* `skipValidation`: Optional. When `true`, disables validation of mappings as
+ they are added. This can improve performance but should be used with
+ discretion, as a last resort. Even then, one should avoid using this flag when
+ running tests, if possible.
+
+#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)
+
+Creates a new SourceMapGenerator based on a SourceMapConsumer
+
+* `sourceMapConsumer` The SourceMap.
+
+#### SourceMapGenerator.prototype.addMapping(mapping)
+
+Add a single mapping from original source line and column to the generated
+source's line and column for this source map being created. The mapping object
+should have the following properties:
+
+* `generated`: An object with the generated line and column positions.
+
+* `original`: An object with the original line and column positions.
+
+* `source`: The original source file (relative to the sourceRoot).
+
+* `name`: An optional original token name for this mapping.
+
+#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)
+
+Set the source content for an original source file.
+
+* `sourceFile` the URL of the original source file.
+
+* `sourceContent` the content of the source file.
+
+#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])
+
+Applies a SourceMap for a source file to the SourceMap.
+Each mapping to the supplied source file is rewritten using the
+supplied SourceMap. Note: The resolution for the resulting mappings
+is the minimium of this map and the supplied map.
+
+* `sourceMapConsumer`: The SourceMap to be applied.
+
+* `sourceFile`: Optional. The filename of the source file.
+ If omitted, sourceMapConsumer.file will be used, if it exists.
+ Otherwise an error will be thrown.
+
+* `sourceMapPath`: Optional. The dirname of the path to the SourceMap
+ to be applied. If relative, it is relative to the SourceMap.
+
+ This parameter is needed when the two SourceMaps aren't in the same
+ directory, and the SourceMap to be applied contains relative source
+ paths. If so, those relative source paths need to be rewritten
+ relative to the SourceMap.
+
+ If omitted, it is assumed that both SourceMaps are in the same directory,
+ thus not needing any rewriting. (Supplying `'.'` has the same effect.)
+
+#### SourceMapGenerator.prototype.toString()
+
+Renders the source map being generated to a string.
+
+### SourceNode
+
+SourceNodes provide a way to abstract over interpolating and/or concatenating
+snippets of generated JavaScript source code, while maintaining the line and
+column information associated between those snippets and the original source
+code. This is useful as the final intermediate representation a compiler might
+use before outputting the generated JS and source map.
+
+#### new SourceNode([line, column, source[, chunk[, name]]])
+
+* `line`: The original line number associated with this source node, or null if
+ it isn't associated with an original line.
+
+* `column`: The original column number associated with this source node, or null
+ if it isn't associated with an original column.
+
+* `source`: The original source's filename; null if no filename is provided.
+
+* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see
+ below.
+
+* `name`: Optional. The original identifier.
+
+#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])
+
+Creates a SourceNode from generated code and a SourceMapConsumer.
+
+* `code`: The generated code
+
+* `sourceMapConsumer` The SourceMap for the generated code
+
+* `relativePath` The optional path that relative sources in `sourceMapConsumer`
+ should be relative to.
+
+#### SourceNode.prototype.add(chunk)
+
+Add a chunk of generated JS to this source node.
+
+* `chunk`: A string snippet of generated JS code, another instance of
+ `SourceNode`, or an array where each member is one of those things.
+
+#### SourceNode.prototype.prepend(chunk)
+
+Prepend a chunk of generated JS to this source node.
+
+* `chunk`: A string snippet of generated JS code, another instance of
+ `SourceNode`, or an array where each member is one of those things.
+
+#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)
+
+Set the source content for a source file. This will be added to the
+`SourceMap` in the `sourcesContent` field.
+
+* `sourceFile`: The filename of the source file
+
+* `sourceContent`: The content of the source file
+
+#### SourceNode.prototype.walk(fn)
+
+Walk over the tree of JS snippets in this node and its children. The walking
+function is called once for each snippet of JS and is passed that snippet and
+the its original associated source's line/column location.
+
+* `fn`: The traversal function.
+
+#### SourceNode.prototype.walkSourceContents(fn)
+
+Walk over the tree of SourceNodes. The walking function is called for each
+source file content and is passed the filename and source content.
+
+* `fn`: The traversal function.
+
+#### SourceNode.prototype.join(sep)
+
+Like `Array.prototype.join` except for SourceNodes. Inserts the separator
+between each of this source node's children.
+
+* `sep`: The separator.
+
+#### SourceNode.prototype.replaceRight(pattern, replacement)
+
+Call `String.prototype.replace` on the very right-most source snippet. Useful
+for trimming whitespace from the end of a source node, etc.
+
+* `pattern`: The pattern to replace.
+
+* `replacement`: The thing to replace the pattern with.
+
+#### SourceNode.prototype.toString()
+
+Return the string representation of this source node. Walks over the tree and
+concatenates all the various snippets together to one string.
+
+#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])
+
+Returns the string representation of this tree of source nodes, plus a
+SourceMapGenerator which contains all the mappings between the generated and
+original sources.
+
+The arguments are the same as those to `new SourceMapGenerator`.
+
+## Tests
+
+[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map)
+
+Install NodeJS version 0.8.0 or greater, then run `node test/run-tests.js`.
+
+To add new tests, create a new file named `test/test-<your new test name>.js`
+and export your test functions with names that start with "test", for example
+
+ exports["test doing the foo bar"] = function (assert, util) {
+ ...
+ };
+
+The new test will be located automatically when you run the suite.
+
+The `util` argument is the test utility module located at `test/source-map/util`.
+
+The `assert` argument is a cut down version of node's assert module. You have
+access to the following assertion functions:
+
+* `doesNotThrow`
+
+* `equal`
+
+* `ok`
+
+* `strictEqual`
+
+* `throws`
+
+(The reason for the restricted set of test functions is because we need the
+tests to run inside Firefox's test suite as well and so the assert module is
+shimmed in that environment. See `build/assert-shim.js`.)
+
+[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
+[feature]: https://wiki.mozilla.org/DevTools/Features/SourceMap
+[Dryice]: https://github.com/mozilla/dryice
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map.js b/node_modules/stylus/node_modules/source-map/lib/source-map.js
new file mode 100644
index 00000000..121ad241
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map.js
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+exports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator;
+exports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer;
+exports.SourceNode = require('./source-map/source-node').SourceNode;
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/array-set.js b/node_modules/stylus/node_modules/source-map/lib/source-map/array-set.js
new file mode 100644
index 00000000..40f9a18b
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/array-set.js
@@ -0,0 +1,97 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var util = require('./util');
+
+ /**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+ function ArraySet() {
+ this._array = [];
+ this._set = {};
+ }
+
+ /**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+ };
+
+ /**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var isDuplicate = this.has(aStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ this._set[util.toSetString(aStr)] = idx;
+ }
+ };
+
+ /**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.has = function ArraySet_has(aStr) {
+ return Object.prototype.hasOwnProperty.call(this._set,
+ util.toSetString(aStr));
+ };
+
+ /**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (this.has(aStr)) {
+ return this._set[util.toSetString(aStr)];
+ }
+ throw new Error('"' + aStr + '" is not in the set.');
+ };
+
+ /**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ ArraySet.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+ };
+
+ /**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ ArraySet.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+ };
+
+ exports.ArraySet = ArraySet;
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/base64-vlq.js b/node_modules/stylus/node_modules/source-map/lib/source-map/base64-vlq.js
new file mode 100644
index 00000000..e22dcaee
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/base64-vlq.js
@@ -0,0 +1,142 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var base64 = require('./base64');
+
+ // A single base 64 digit can contain 6 bits of data. For the base 64 variable
+ // length quantities we use in the source map spec, the first bit is the sign,
+ // the next four bits are the actual value, and the 6th bit is the
+ // continuation bit. The continuation bit tells us whether there are more
+ // digits in this value following this digit.
+ //
+ // Continuation
+ // | Sign
+ // | |
+ // V V
+ // 101011
+
+ var VLQ_BASE_SHIFT = 5;
+
+ // binary: 100000
+ var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+ // binary: 011111
+ var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+ // binary: 100000
+ var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+ /**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+ function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+ }
+
+ /**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+ function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+ }
+
+ /**
+ * Returns the base 64 VLQ encoded value.
+ */
+ exports.encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+ };
+
+ /**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+ exports.decode = function base64VLQ_decode(aStr, aOutParam) {
+ var i = 0;
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (i >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+ digit = base64.decode(aStr.charAt(i++));
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aStr.slice(i);
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/base64.js b/node_modules/stylus/node_modules/source-map/lib/source-map/base64.js
new file mode 100644
index 00000000..863cc465
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/base64.js
@@ -0,0 +1,42 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var charToIntMap = {};
+ var intToCharMap = {};
+
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+ .split('')
+ .forEach(function (ch, index) {
+ charToIntMap[ch] = index;
+ intToCharMap[index] = ch;
+ });
+
+ /**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+ exports.encode = function base64_encode(aNumber) {
+ if (aNumber in intToCharMap) {
+ return intToCharMap[aNumber];
+ }
+ throw new TypeError("Must be between 0 and 63: " + aNumber);
+ };
+
+ /**
+ * Decode a single base 64 digit to an integer.
+ */
+ exports.decode = function base64_decode(aChar) {
+ if (aChar in charToIntMap) {
+ return charToIntMap[aChar];
+ }
+ throw new TypeError("Not a valid base 64 digit: " + aChar);
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/binary-search.js b/node_modules/stylus/node_modules/source-map/lib/source-map/binary-search.js
new file mode 100644
index 00000000..e085f810
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/binary-search.js
@@ -0,0 +1,80 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ /**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ */
+ function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next closest element that is less than that element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element which is less than the one we are searching for, so we
+ // return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ }
+ else if (cmp > 0) {
+ // aHaystack[mid] is greater than our needle.
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare);
+ }
+ // We did not find an exact match, return the next closest one
+ // (termination case 2).
+ return mid;
+ }
+ else {
+ // aHaystack[mid] is less than our needle.
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare);
+ }
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (2) or (3) and return the appropriate thing.
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+
+ /**
+ * This is an implementation of binary search which will always try and return
+ * the index of next lowest value checked if there is no exact hit. This is
+ * because mappings between original and generated line/col pairs are single
+ * points, and there is an implicit region between each of them, so a miss
+ * just means that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ */
+ exports.search = function search(aNeedle, aHaystack, aCompare) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+ return recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare)
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/mapping-list.js b/node_modules/stylus/node_modules/source-map/lib/source-map/mapping-list.js
new file mode 100644
index 00000000..2a4eb618
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/mapping-list.js
@@ -0,0 +1,86 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var util = require('./util');
+
+ /**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+ function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositions(mappingA, mappingB) <= 0;
+ }
+
+ /**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+ function MappingList() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+ }
+
+ /**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+ MappingList.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+ /**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+ MappingList.prototype.add = function MappingList_add(aMapping) {
+ var mapping;
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+ };
+
+ /**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+ MappingList.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositions);
+ this._sorted = true;
+ }
+ return this._array;
+ };
+
+ exports.MappingList = MappingList;
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/source-map-consumer.js b/node_modules/stylus/node_modules/source-map/lib/source-map/source-map-consumer.js
new file mode 100644
index 00000000..cfaa299a
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/source-map-consumer.js
@@ -0,0 +1,575 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var util = require('./util');
+ var binarySearch = require('./binary-search');
+ var ArraySet = require('./array-set').ArraySet;
+ var base64VLQ = require('./base64-vlq');
+
+ /**
+ * A SourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The only parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+ function SourceMapConsumer(aSourceMap) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sources = util.getArg(sourceMap, 'sources');
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, 'names', []);
+ var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+ var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+ var mappings = util.getArg(sourceMap, 'mappings');
+ var file = util.getArg(sourceMap, 'file', null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ sources = sources.map(util.normalize);
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names, true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this.file = file;
+ }
+
+ /**
+ * Create a SourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @returns SourceMapConsumer
+ */
+ SourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap) {
+ var smc = Object.create(SourceMapConsumer.prototype);
+
+ smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+ smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
+ smc.sourceRoot);
+ smc.file = aSourceMap._file;
+
+ smc.__generatedMappings = aSourceMap._mappings.toArray().slice();
+ smc.__originalMappings = aSourceMap._mappings.toArray().slice()
+ .sort(util.compareByOriginalPositions);
+
+ return smc;
+ };
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ SourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(SourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ return this._sources.toArray().map(function (s) {
+ return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;
+ }, this);
+ }
+ });
+
+ // `__generatedMappings` and `__originalMappings` are arrays that hold the
+ // parsed mapping coordinates from the source map's "mappings" attribute. They
+ // are lazily instantiated, accessed via the `_generatedMappings` and
+ // `_originalMappings` getters respectively, and we only parse the mappings
+ // and create these arrays once queried for a source location. We jump through
+ // these hoops because there can be many thousands of mappings, and parsing
+ // them is expensive, so we only want to do it if we must.
+ //
+ // Each object in the arrays is of the form:
+ //
+ // {
+ // generatedLine: The line number in the generated code,
+ // generatedColumn: The column number in the generated code,
+ // source: The path to the original source file that generated this
+ // chunk of code,
+ // originalLine: The line number in the original source that
+ // corresponds to this chunk of generated code,
+ // originalColumn: The column number in the original source that
+ // corresponds to this chunk of generated code,
+ // name: The name of the original symbol which generated this chunk of
+ // code.
+ // }
+ //
+ // All properties except for `generatedLine` and `generatedColumn` can be
+ // `null`.
+ //
+ // `_generatedMappings` is ordered by the generated positions.
+ //
+ // `_originalMappings` is ordered by the original positions.
+
+ SourceMapConsumer.prototype.__generatedMappings = null;
+ Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
+ get: function () {
+ if (!this.__generatedMappings) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+ });
+
+ SourceMapConsumer.prototype.__originalMappings = null;
+ Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
+ get: function () {
+ if (!this.__originalMappings) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+ });
+
+ SourceMapConsumer.prototype._nextCharIsMappingSeparator =
+ function SourceMapConsumer_nextCharIsMappingSeparator(aStr) {
+ var c = aStr.charAt(0);
+ return c === ";" || c === ",";
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ SourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var str = aStr;
+ var temp = {};
+ var mapping;
+
+ while (str.length > 0) {
+ if (str.charAt(0) === ';') {
+ generatedLine++;
+ str = str.slice(1);
+ previousGeneratedColumn = 0;
+ }
+ else if (str.charAt(0) === ',') {
+ str = str.slice(1);
+ }
+ else {
+ mapping = {};
+ mapping.generatedLine = generatedLine;
+
+ // Generated column.
+ base64VLQ.decode(str, temp);
+ mapping.generatedColumn = previousGeneratedColumn + temp.value;
+ previousGeneratedColumn = mapping.generatedColumn;
+ str = temp.rest;
+
+ if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) {
+ // Original source.
+ base64VLQ.decode(str, temp);
+ mapping.source = this._sources.at(previousSource + temp.value);
+ previousSource += temp.value;
+ str = temp.rest;
+ if (str.length === 0 || this._nextCharIsMappingSeparator(str)) {
+ throw new Error('Found a source, but no line and column');
+ }
+
+ // Original line.
+ base64VLQ.decode(str, temp);
+ mapping.originalLine = previousOriginalLine + temp.value;
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+ str = temp.rest;
+ if (str.length === 0 || this._nextCharIsMappingSeparator(str)) {
+ throw new Error('Found a source and line, but no column');
+ }
+
+ // Original column.
+ base64VLQ.decode(str, temp);
+ mapping.originalColumn = previousOriginalColumn + temp.value;
+ previousOriginalColumn = mapping.originalColumn;
+ str = temp.rest;
+
+ if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) {
+ // Original name.
+ base64VLQ.decode(str, temp);
+ mapping.name = this._names.at(previousName + temp.value);
+ previousName += temp.value;
+ str = temp.rest;
+ }
+ }
+
+ this.__generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === 'number') {
+ this.__originalMappings.push(mapping);
+ }
+ }
+ }
+
+ this.__generatedMappings.sort(util.compareByGeneratedPositions);
+ this.__originalMappings.sort(util.compareByOriginalPositions);
+ };
+
+ /**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+ SourceMapConsumer.prototype._findMapping =
+ function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError('Line must be greater than or equal to 1, got '
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError('Column must be greater than or equal to 0, got '
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator);
+ };
+
+ /**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+ SourceMapConsumer.prototype.computeColumnSpans =
+ function SourceMapConsumer_computeColumnSpans() {
+ for (var index = 0; index < this._generatedMappings.length; ++index) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source.
+ * - column: The column number in the generated source.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null.
+ * - column: The column number in the original source, or null.
+ * - name: The original identifier, or null.
+ */
+ SourceMapConsumer.prototype.originalPositionFor =
+ function SourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositions);
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, 'source', null);
+ if (source != null && this.sourceRoot != null) {
+ source = util.join(this.sourceRoot, source);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, 'originalLine', null),
+ column: util.getArg(mapping, 'originalColumn', null),
+ name: util.getArg(mapping, 'name', null)
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * availible.
+ */
+ SourceMapConsumer.prototype.sourceContentFor =
+ function SourceMapConsumer_sourceContentFor(aSource) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ if (this.sourceRoot != null) {
+ aSource = util.relative(this.sourceRoot, aSource);
+ }
+
+ if (this._sources.has(aSource)) {
+ return this.sourcesContent[this._sources.indexOf(aSource)];
+ }
+
+ var url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = aSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + aSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + aSource)];
+ }
+ }
+
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source.
+ * - column: The column number in the original source.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null.
+ * - column: The column number in the generated source, or null.
+ */
+ SourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: util.getArg(aArgs, 'column')
+ };
+
+ if (this.sourceRoot != null) {
+ needle.source = util.relative(this.sourceRoot, needle.source);
+ }
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions);
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ return {
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ };
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+ /**
+ * Returns all generated line and column information for the original source
+ * and line provided. The only argument is an object with the following
+ * properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null.
+ * - column: The column number in the generated source, or null.
+ */
+ SourceMapConsumer.prototype.allGeneratedPositionsFor =
+ function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
+ // When there is no exact match, SourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to Infinity, we thus find the last
+ // mapping for the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: Infinity
+ };
+
+ if (this.sourceRoot != null) {
+ needle.source = util.relative(this.sourceRoot, needle.source);
+ }
+
+ var mappings = [];
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions);
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ while (mapping && mapping.originalLine === needle.originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[--index];
+ }
+ }
+
+ return mappings.reverse();
+ };
+
+ SourceMapConsumer.GENERATED_ORDER = 1;
+ SourceMapConsumer.ORIGINAL_ORDER = 2;
+
+ /**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+ SourceMapConsumer.prototype.eachMapping =
+ function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ mappings.map(function (mapping) {
+ var source = mapping.source;
+ if (source != null && sourceRoot != null) {
+ source = util.join(sourceRoot, source);
+ }
+ return {
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name
+ };
+ }).forEach(aCallback, context);
+ };
+
+ exports.SourceMapConsumer = SourceMapConsumer;
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/source-map-generator.js b/node_modules/stylus/node_modules/source-map/lib/source-map/source-map-generator.js
new file mode 100644
index 00000000..1ab7a47d
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/source-map-generator.js
@@ -0,0 +1,400 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var base64VLQ = require('./base64-vlq');
+ var util = require('./util');
+ var ArraySet = require('./array-set').ArraySet;
+ var MappingList = require('./mapping-list').MappingList;
+
+ /**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+ function SourceMapGenerator(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+ }
+
+ SourceMapGenerator.prototype._version = 3;
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+ SourceMapGenerator.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ SourceMapGenerator.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null && !this._sources.has(source)) {
+ this._sources.add(source);
+ }
+
+ if (name != null && !this._names.has(name)) {
+ this._names.add(name);
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+ /**
+ * Set the source content for a source file.
+ */
+ SourceMapGenerator.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = {};
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ SourceMapGenerator.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet();
+ var newNames = new ArraySet();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source)
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+ /**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+ SourceMapGenerator.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+ /**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+ SourceMapGenerator.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var mapping;
+
+ var mappings = this._mappings.toArray();
+
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ result += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositions(mapping, mappings[i - 1])) {
+ continue;
+ }
+ result += ',';
+ }
+ }
+
+ result += base64VLQ.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ result += base64VLQ.encode(this._sources.indexOf(mapping.source)
+ - previousSource);
+ previousSource = this._sources.indexOf(mapping.source);
+
+ // lines are stored 0-based in SourceMap spec version 3
+ result += base64VLQ.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ result += base64VLQ.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ result += base64VLQ.encode(this._names.indexOf(mapping.name)
+ - previousName);
+ previousName = this._names.indexOf(mapping.name);
+ }
+ }
+ }
+
+ return result;
+ };
+
+ SourceMapGenerator.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents,
+ key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+ /**
+ * Externalize the source map.
+ */
+ SourceMapGenerator.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+ /**
+ * Render the source map being generated to a string.
+ */
+ SourceMapGenerator.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this);
+ };
+
+ exports.SourceMapGenerator = SourceMapGenerator;
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/source-node.js b/node_modules/stylus/node_modules/source-map/lib/source-map/source-node.js
new file mode 100644
index 00000000..9ee90bd5
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/source-node.js
@@ -0,0 +1,414 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
+ var util = require('./util');
+
+ // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+ // operating systems these days (capturing the result).
+ var REGEX_NEWLINE = /(\r?\n)/;
+
+ // Newline character code for charCodeAt() comparisons
+ var NEWLINE_CODE = 10;
+
+ // Private symbol for identifying `SourceNode`s when multiple versions of
+ // the source-map library are loaded. This MUST NOT CHANGE across
+ // versions!
+ var isSourceNode = "$$$isSourceNode$$$";
+
+ /**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+ function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+ }
+
+ /**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+ SourceNode.fromStringWithSourceMap =
+ function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are removed from this array, by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var shiftNextLine = function() {
+ var lineContents = remainingLines.shift();
+ // The last line of a file might not have a newline.
+ var newLine = remainingLines.shift() || "";
+ return lineContents + newLine;
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ var code = "";
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[0];
+ var code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[0] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[0];
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[0] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLines.length > 0) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ };
+
+ /**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function (chunk) {
+ this.add(chunk);
+ }, this);
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length-1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ }
+ else {
+ if (chunk !== '') {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+ };
+
+ /**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+ SourceNode.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len-1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+ };
+
+ /**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+ SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ }
+ else if (typeof lastChild === 'string') {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ }
+ else {
+ this.children.push(''.replace(aPattern, aReplacement));
+ }
+ return this;
+ };
+
+ /**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+ SourceNode.prototype.setSourceContent =
+ function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ };
+
+ /**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode.prototype.walkSourceContents =
+ function SourceNode_walkSourceContents(aFn) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ };
+
+ /**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+ SourceNode.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function (chunk) {
+ str += chunk;
+ });
+ return str;
+ };
+
+ /**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+ SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function (chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if(lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (var idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function (sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+ };
+
+ exports.SourceNode = SourceNode;
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/lib/source-map/util.js b/node_modules/stylus/node_modules/source-map/lib/source-map/util.js
new file mode 100644
index 00000000..976f6cab
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/lib/source-map/util.js
@@ -0,0 +1,319 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ /**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+ function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+ }
+ exports.getArg = getArg;
+
+ var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/;
+ var dataUrlRegexp = /^data:.+\,.+$/;
+
+ function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+ }
+ exports.urlParse = urlParse;
+
+ function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+ }
+ exports.urlGenerate = urlGenerate;
+
+ /**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consequtive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '<dir>/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+ function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = (path.charAt(0) === '/');
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+ }
+ exports.normalize = normalize;
+
+ /**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+ function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+ }
+ exports.join = join;
+
+ /**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+ function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // XXX: It is possible to remove this block, and the tests still pass!
+ var url = urlParse(aRoot);
+ if (aPath.charAt(0) == "/" && url && url.path == "/") {
+ return aPath.slice(1);
+ }
+
+ return aPath.indexOf(aRoot + '/') === 0
+ ? aPath.substr(aRoot.length + 1)
+ : aPath;
+ }
+ exports.relative = relative;
+
+ /**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+ function toSetString(aStr) {
+ return '$' + aStr;
+ }
+ exports.toSetString = toSetString;
+
+ function fromSetString(aStr) {
+ return aStr.substr(1);
+ }
+ exports.fromSetString = fromSetString;
+
+ function strcmp(aStr1, aStr2) {
+ var s1 = aStr1 || "";
+ var s2 = aStr2 || "";
+ return (s1 > s2) - (s1 < s2);
+ }
+
+ /**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+ function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp;
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.name, mappingB.name);
+ if (cmp) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return mappingA.generatedColumn - mappingB.generatedColumn;
+ };
+ exports.compareByOriginalPositions = compareByOriginalPositions;
+
+ /**
+ * Comparator between two mappings where the generated positions are
+ * compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+ function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp;
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ };
+ exports.compareByGeneratedPositions = compareByGeneratedPositions;
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/package.json b/node_modules/stylus/node_modules/source-map/package.json
new file mode 100644
index 00000000..ba5665b5
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/package.json
@@ -0,0 +1,65 @@
+{
+ "name": "source-map",
+ "description": "Generates and consumes source maps",
+ "version": "0.1.43",
+ "homepage": "https://github.com/mozilla/source-map",
+ "author": "Nick Fitzgerald <nfitzgerald@mozilla.com>",
+ "contributors": [
+ "Tobias Koppers <tobias.koppers@googlemail.com>",
+ "Duncan Beevers <duncan@dweebd.com>",
+ "Stephen Crane <scrane@mozilla.com>",
+ "Ryan Seddon <seddon.ryan@gmail.com>",
+ "Miles Elam <miles.elam@deem.com>",
+ "Mihai Bazon <mihai.bazon@gmail.com>",
+ "Michael Ficarra <github.public.email@michael.ficarra.me>",
+ "Todd Wolfson <todd@twolfson.com>",
+ "Alexander Solovyov <alexander@solovyov.net>",
+ "Felix Gnass <fgnass@gmail.com>",
+ "Conrad Irwin <conrad.irwin@gmail.com>",
+ "usrbincc <usrbincc@yahoo.com>",
+ "David Glasser <glasser@davidglasser.net>",
+ "Chase Douglas <chase@newrelic.com>",
+ "Evan Wallace <evan.exe@gmail.com>",
+ "Heather Arthur <fayearthur@gmail.com>",
+ "Hugh Kennedy <hughskennedy@gmail.com>",
+ "David Glasser <glasser@davidglasser.net>",
+ "Simon Lydell <simon.lydell@gmail.com>",
+ "Jmeas Smith <jellyes2@gmail.com>",
+ "Michael Z Goddard <mzgoddard@gmail.com>",
+ "azu <azu@users.noreply.github.com>",
+ "John Gozde <john@gozde.ca>",
+ "Adam Kirkton <akirkton@truefitinnovation.com>",
+ "Chris Montgomery <christopher.montgomery@dowjones.com>",
+ "J. Ryan Stinnett <jryans@gmail.com>",
+ "Jack Herrington <jherrington@walmartlabs.com>",
+ "Chris Truter <jeffpalentine@gmail.com>",
+ "Daniel Espeset <daniel@danielespeset.com>"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/mozilla/source-map.git"
+ },
+ "directories": {
+ "lib": "./lib"
+ },
+ "main": "./lib/source-map.js",
+ "engines": {
+ "node": ">=0.8.0"
+ },
+ "licenses": [
+ {
+ "type": "BSD",
+ "url": "http://opensource.org/licenses/BSD-3-Clause"
+ }
+ ],
+ "dependencies": {
+ "amdefine": ">=0.0.4"
+ },
+ "devDependencies": {
+ "dryice": ">=0.4.8"
+ },
+ "scripts": {
+ "test": "node test/run-tests.js",
+ "build": "node Makefile.dryice.js"
+ }
+}
diff --git a/node_modules/stylus/node_modules/source-map/test/run-tests.js b/node_modules/stylus/node_modules/source-map/test/run-tests.js
new file mode 100755
index 00000000..64a7c3a3
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/run-tests.js
@@ -0,0 +1,62 @@
+#!/usr/bin/env node
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+var assert = require('assert');
+var fs = require('fs');
+var path = require('path');
+var util = require('./source-map/util');
+
+function run(tests) {
+ var total = 0;
+ var passed = 0;
+
+ for (var i = 0; i < tests.length; i++) {
+ for (var k in tests[i].testCase) {
+ if (/^test/.test(k)) {
+ total++;
+ try {
+ tests[i].testCase[k](assert, util);
+ passed++;
+ }
+ catch (e) {
+ console.log('FAILED ' + tests[i].name + ': ' + k + '!');
+ console.log(e.stack);
+ }
+ }
+ }
+ }
+
+ console.log('');
+ console.log(passed + ' / ' + total + ' tests passed.');
+ console.log('');
+
+ return total - passed;
+}
+
+function isTestFile(f) {
+ var testToRun = process.argv[2];
+ return testToRun
+ ? path.basename(testToRun) === f
+ : /^test\-.*?\.js/.test(f);
+}
+
+function toModule(f) {
+ return './source-map/' + f.replace(/\.js$/, '');
+}
+
+var requires = fs.readdirSync(path.join(__dirname, 'source-map'))
+ .filter(isTestFile)
+ .map(toModule);
+
+var code = run(requires.map(require).map(function (mod, i) {
+ return {
+ name: requires[i],
+ testCase: mod
+ };
+}));
+
+process.exit(code);
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-api.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-api.js
new file mode 100644
index 00000000..3801233c
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-api.js
@@ -0,0 +1,26 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2012 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var sourceMap;
+ try {
+ sourceMap = require('../../lib/source-map');
+ } catch (e) {
+ sourceMap = {};
+ Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap);
+ }
+
+ exports['test that the api is properly exposed in the top level'] = function (assert, util) {
+ assert.equal(typeof sourceMap.SourceMapGenerator, "function");
+ assert.equal(typeof sourceMap.SourceMapConsumer, "function");
+ assert.equal(typeof sourceMap.SourceNode, "function");
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-array-set.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-array-set.js
new file mode 100644
index 00000000..b5797edd
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-array-set.js
@@ -0,0 +1,104 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var ArraySet = require('../../lib/source-map/array-set').ArraySet;
+
+ function makeTestSet() {
+ var set = new ArraySet();
+ for (var i = 0; i < 100; i++) {
+ set.add(String(i));
+ }
+ return set;
+ }
+
+ exports['test .has() membership'] = function (assert, util) {
+ var set = makeTestSet();
+ for (var i = 0; i < 100; i++) {
+ assert.ok(set.has(String(i)));
+ }
+ };
+
+ exports['test .indexOf() elements'] = function (assert, util) {
+ var set = makeTestSet();
+ for (var i = 0; i < 100; i++) {
+ assert.strictEqual(set.indexOf(String(i)), i);
+ }
+ };
+
+ exports['test .at() indexing'] = function (assert, util) {
+ var set = makeTestSet();
+ for (var i = 0; i < 100; i++) {
+ assert.strictEqual(set.at(i), String(i));
+ }
+ };
+
+ exports['test creating from an array'] = function (assert, util) {
+ var set = ArraySet.fromArray(['foo', 'bar', 'baz', 'quux', 'hasOwnProperty']);
+
+ assert.ok(set.has('foo'));
+ assert.ok(set.has('bar'));
+ assert.ok(set.has('baz'));
+ assert.ok(set.has('quux'));
+ assert.ok(set.has('hasOwnProperty'));
+
+ assert.strictEqual(set.indexOf('foo'), 0);
+ assert.strictEqual(set.indexOf('bar'), 1);
+ assert.strictEqual(set.indexOf('baz'), 2);
+ assert.strictEqual(set.indexOf('quux'), 3);
+
+ assert.strictEqual(set.at(0), 'foo');
+ assert.strictEqual(set.at(1), 'bar');
+ assert.strictEqual(set.at(2), 'baz');
+ assert.strictEqual(set.at(3), 'quux');
+ };
+
+ exports['test that you can add __proto__; see github issue #30'] = function (assert, util) {
+ var set = new ArraySet();
+ set.add('__proto__');
+ assert.ok(set.has('__proto__'));
+ assert.strictEqual(set.at(0), '__proto__');
+ assert.strictEqual(set.indexOf('__proto__'), 0);
+ };
+
+ exports['test .fromArray() with duplicates'] = function (assert, util) {
+ var set = ArraySet.fromArray(['foo', 'foo']);
+ assert.ok(set.has('foo'));
+ assert.strictEqual(set.at(0), 'foo');
+ assert.strictEqual(set.indexOf('foo'), 0);
+ assert.strictEqual(set.toArray().length, 1);
+
+ set = ArraySet.fromArray(['foo', 'foo'], true);
+ assert.ok(set.has('foo'));
+ assert.strictEqual(set.at(0), 'foo');
+ assert.strictEqual(set.at(1), 'foo');
+ assert.strictEqual(set.indexOf('foo'), 0);
+ assert.strictEqual(set.toArray().length, 2);
+ };
+
+ exports['test .add() with duplicates'] = function (assert, util) {
+ var set = new ArraySet();
+ set.add('foo');
+
+ set.add('foo');
+ assert.ok(set.has('foo'));
+ assert.strictEqual(set.at(0), 'foo');
+ assert.strictEqual(set.indexOf('foo'), 0);
+ assert.strictEqual(set.toArray().length, 1);
+
+ set.add('foo', true);
+ assert.ok(set.has('foo'));
+ assert.strictEqual(set.at(0), 'foo');
+ assert.strictEqual(set.at(1), 'foo');
+ assert.strictEqual(set.indexOf('foo'), 0);
+ assert.strictEqual(set.toArray().length, 2);
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-base64-vlq.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-base64-vlq.js
new file mode 100644
index 00000000..6fd0d99f
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-base64-vlq.js
@@ -0,0 +1,23 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var base64VLQ = require('../../lib/source-map/base64-vlq');
+
+ exports['test normal encoding and decoding'] = function (assert, util) {
+ var result = {};
+ for (var i = -255; i < 256; i++) {
+ base64VLQ.decode(base64VLQ.encode(i), result);
+ assert.equal(result.value, i);
+ assert.equal(result.rest, "");
+ }
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-base64.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-base64.js
new file mode 100644
index 00000000..ff3a2445
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-base64.js
@@ -0,0 +1,35 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var base64 = require('../../lib/source-map/base64');
+
+ exports['test out of range encoding'] = function (assert, util) {
+ assert.throws(function () {
+ base64.encode(-1);
+ });
+ assert.throws(function () {
+ base64.encode(64);
+ });
+ };
+
+ exports['test out of range decoding'] = function (assert, util) {
+ assert.throws(function () {
+ base64.decode('=');
+ });
+ };
+
+ exports['test normal encoding and decoding'] = function (assert, util) {
+ for (var i = 0; i < 64; i++) {
+ assert.equal(base64.decode(base64.encode(i)), i);
+ }
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-binary-search.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-binary-search.js
new file mode 100644
index 00000000..f1c9e0fc
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-binary-search.js
@@ -0,0 +1,54 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var binarySearch = require('../../lib/source-map/binary-search');
+
+ function numberCompare(a, b) {
+ return a - b;
+ }
+
+ exports['test too high'] = function (assert, util) {
+ var needle = 30;
+ var haystack = [2,4,6,8,10,12,14,16,18,20];
+
+ assert.doesNotThrow(function () {
+ binarySearch.search(needle, haystack, numberCompare);
+ });
+
+ assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 20);
+ };
+
+ exports['test too low'] = function (assert, util) {
+ var needle = 1;
+ var haystack = [2,4,6,8,10,12,14,16,18,20];
+
+ assert.doesNotThrow(function () {
+ binarySearch.search(needle, haystack, numberCompare);
+ });
+
+ assert.equal(binarySearch.search(needle, haystack, numberCompare), -1);
+ };
+
+ exports['test exact search'] = function (assert, util) {
+ var needle = 4;
+ var haystack = [2,4,6,8,10,12,14,16,18,20];
+
+ assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 4);
+ };
+
+ exports['test fuzzy search'] = function (assert, util) {
+ var needle = 19;
+ var haystack = [2,4,6,8,10,12,14,16,18,20];
+
+ assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 18);
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-dog-fooding.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-dog-fooding.js
new file mode 100644
index 00000000..26757b2d
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-dog-fooding.js
@@ -0,0 +1,84 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer;
+ var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator;
+
+ exports['test eating our own dog food'] = function (assert, util) {
+ var smg = new SourceMapGenerator({
+ file: 'testing.js',
+ sourceRoot: '/wu/tang'
+ });
+
+ smg.addMapping({
+ source: 'gza.coffee',
+ original: { line: 1, column: 0 },
+ generated: { line: 2, column: 2 }
+ });
+
+ smg.addMapping({
+ source: 'gza.coffee',
+ original: { line: 2, column: 0 },
+ generated: { line: 3, column: 2 }
+ });
+
+ smg.addMapping({
+ source: 'gza.coffee',
+ original: { line: 3, column: 0 },
+ generated: { line: 4, column: 2 }
+ });
+
+ smg.addMapping({
+ source: 'gza.coffee',
+ original: { line: 4, column: 0 },
+ generated: { line: 5, column: 2 }
+ });
+
+ smg.addMapping({
+ source: 'gza.coffee',
+ original: { line: 5, column: 10 },
+ generated: { line: 6, column: 12 }
+ });
+
+ var smc = new SourceMapConsumer(smg.toString());
+
+ // Exact
+ util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 0, null, smc, assert);
+ util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 0, null, smc, assert);
+ util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 0, null, smc, assert);
+ util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 0, null, smc, assert);
+ util.assertMapping(6, 12, '/wu/tang/gza.coffee', 5, 10, null, smc, assert);
+
+ // Fuzzy
+
+ // Generated to original
+ util.assertMapping(2, 0, null, null, null, null, smc, assert, true);
+ util.assertMapping(2, 9, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true);
+ util.assertMapping(3, 0, null, null, null, null, smc, assert, true);
+ util.assertMapping(3, 9, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true);
+ util.assertMapping(4, 0, null, null, null, null, smc, assert, true);
+ util.assertMapping(4, 9, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true);
+ util.assertMapping(5, 0, null, null, null, null, smc, assert, true);
+ util.assertMapping(5, 9, '/wu/tang/gza.coffee', 4, 0, null, smc, assert, true);
+ util.assertMapping(6, 0, null, null, null, null, smc, assert, true);
+ util.assertMapping(6, 9, null, null, null, null, smc, assert, true);
+ util.assertMapping(6, 13, '/wu/tang/gza.coffee', 5, 10, null, smc, assert, true);
+
+ // Original to generated
+ util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 1, null, smc, assert, null, true);
+ util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 3, null, smc, assert, null, true);
+ util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 6, null, smc, assert, null, true);
+ util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 9, null, smc, assert, null, true);
+ util.assertMapping(5, 2, '/wu/tang/gza.coffee', 5, 9, null, smc, assert, null, true);
+ util.assertMapping(6, 12, '/wu/tang/gza.coffee', 6, 19, null, smc, assert, null, true);
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-source-map-consumer.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-source-map-consumer.js
new file mode 100644
index 00000000..c7149434
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-source-map-consumer.js
@@ -0,0 +1,702 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer;
+ var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator;
+
+ exports['test that we can instantiate with a string or an object'] = function (assert, util) {
+ assert.doesNotThrow(function () {
+ var map = new SourceMapConsumer(util.testMap);
+ });
+ assert.doesNotThrow(function () {
+ var map = new SourceMapConsumer(JSON.stringify(util.testMap));
+ });
+ };
+
+ exports['test that the `sources` field has the original sources'] = function (assert, util) {
+ var map;
+ var sources;
+
+ map = new SourceMapConsumer(util.testMap);
+ sources = map.sources;
+ assert.equal(sources[0], '/the/root/one.js');
+ assert.equal(sources[1], '/the/root/two.js');
+ assert.equal(sources.length, 2);
+
+ map = new SourceMapConsumer(util.testMapNoSourceRoot);
+ sources = map.sources;
+ assert.equal(sources[0], 'one.js');
+ assert.equal(sources[1], 'two.js');
+ assert.equal(sources.length, 2);
+
+ map = new SourceMapConsumer(util.testMapEmptySourceRoot);
+ sources = map.sources;
+ assert.equal(sources[0], 'one.js');
+ assert.equal(sources[1], 'two.js');
+ assert.equal(sources.length, 2);
+ };
+
+ exports['test that the source root is reflected in a mapping\'s source field'] = function (assert, util) {
+ var map;
+ var mapping;
+
+ map = new SourceMapConsumer(util.testMap);
+
+ mapping = map.originalPositionFor({
+ line: 2,
+ column: 1
+ });
+ assert.equal(mapping.source, '/the/root/two.js');
+
+ mapping = map.originalPositionFor({
+ line: 1,
+ column: 1
+ });
+ assert.equal(mapping.source, '/the/root/one.js');
+
+
+ map = new SourceMapConsumer(util.testMapNoSourceRoot);
+
+ mapping = map.originalPositionFor({
+ line: 2,
+ column: 1
+ });
+ assert.equal(mapping.source, 'two.js');
+
+ mapping = map.originalPositionFor({
+ line: 1,
+ column: 1
+ });
+ assert.equal(mapping.source, 'one.js');
+
+
+ map = new SourceMapConsumer(util.testMapEmptySourceRoot);
+
+ mapping = map.originalPositionFor({
+ line: 2,
+ column: 1
+ });
+ assert.equal(mapping.source, 'two.js');
+
+ mapping = map.originalPositionFor({
+ line: 1,
+ column: 1
+ });
+ assert.equal(mapping.source, 'one.js');
+ };
+
+ exports['test mapping tokens back exactly'] = function (assert, util) {
+ var map = new SourceMapConsumer(util.testMap);
+
+ util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, map, assert);
+ util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, map, assert);
+ util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, map, assert);
+ util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', map, assert);
+ util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, map, assert);
+ util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', map, assert);
+ util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', map, assert);
+
+ util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, map, assert);
+ util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, map, assert);
+ util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, map, assert);
+ util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', map, assert);
+ util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, map, assert);
+ util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', map, assert);
+ };
+
+ exports['test mapping tokens fuzzy'] = function (assert, util) {
+ var map = new SourceMapConsumer(util.testMap);
+
+ // Finding original positions
+ util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', map, assert, true);
+ util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', map, assert, true);
+ util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, map, assert, true);
+
+ // Finding generated positions
+ util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', map, assert, null, true);
+ util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', map, assert, null, true);
+ util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, map, assert, null, true);
+ };
+
+ exports['test mappings and end of lines'] = function (assert, util) {
+ var smg = new SourceMapGenerator({
+ file: 'foo.js'
+ });
+ smg.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 1, column: 1 },
+ source: 'bar.js'
+ });
+ smg.addMapping({
+ original: { line: 2, column: 2 },
+ generated: { line: 2, column: 2 },
+ source: 'bar.js'
+ });
+
+ var map = SourceMapConsumer.fromSourceMap(smg);
+
+ // When finding original positions, mappings end at the end of the line.
+ util.assertMapping(2, 1, null, null, null, null, map, assert, true)
+
+ // When finding generated positions, mappings do not end at the end of the line.
+ util.assertMapping(1, 1, 'bar.js', 2, 1, null, map, assert, null, true);
+ };
+
+ exports['test creating source map consumers with )]}\' prefix'] = function (assert, util) {
+ assert.doesNotThrow(function () {
+ var map = new SourceMapConsumer(")]}'" + JSON.stringify(util.testMap));
+ });
+ };
+
+ exports['test eachMapping'] = function (assert, util) {
+ var map;
+
+ map = new SourceMapConsumer(util.testMap);
+ var previousLine = -Infinity;
+ var previousColumn = -Infinity;
+ map.eachMapping(function (mapping) {
+ assert.ok(mapping.generatedLine >= previousLine);
+
+ assert.ok(mapping.source === '/the/root/one.js' || mapping.source === '/the/root/two.js');
+
+ if (mapping.generatedLine === previousLine) {
+ assert.ok(mapping.generatedColumn >= previousColumn);
+ previousColumn = mapping.generatedColumn;
+ }
+ else {
+ previousLine = mapping.generatedLine;
+ previousColumn = -Infinity;
+ }
+ });
+
+ map = new SourceMapConsumer(util.testMapNoSourceRoot);
+ map.eachMapping(function (mapping) {
+ assert.ok(mapping.source === 'one.js' || mapping.source === 'two.js');
+ });
+
+ map = new SourceMapConsumer(util.testMapEmptySourceRoot);
+ map.eachMapping(function (mapping) {
+ assert.ok(mapping.source === 'one.js' || mapping.source === 'two.js');
+ });
+ };
+
+ exports['test iterating over mappings in a different order'] = function (assert, util) {
+ var map = new SourceMapConsumer(util.testMap);
+ var previousLine = -Infinity;
+ var previousColumn = -Infinity;
+ var previousSource = "";
+ map.eachMapping(function (mapping) {
+ assert.ok(mapping.source >= previousSource);
+
+ if (mapping.source === previousSource) {
+ assert.ok(mapping.originalLine >= previousLine);
+
+ if (mapping.originalLine === previousLine) {
+ assert.ok(mapping.originalColumn >= previousColumn);
+ previousColumn = mapping.originalColumn;
+ }
+ else {
+ previousLine = mapping.originalLine;
+ previousColumn = -Infinity;
+ }
+ }
+ else {
+ previousSource = mapping.source;
+ previousLine = -Infinity;
+ previousColumn = -Infinity;
+ }
+ }, null, SourceMapConsumer.ORIGINAL_ORDER);
+ };
+
+ exports['test that we can set the context for `this` in eachMapping'] = function (assert, util) {
+ var map = new SourceMapConsumer(util.testMap);
+ var context = {};
+ map.eachMapping(function () {
+ assert.equal(this, context);
+ }, context);
+ };
+
+ exports['test that the `sourcesContent` field has the original sources'] = function (assert, util) {
+ var map = new SourceMapConsumer(util.testMapWithSourcesContent);
+ var sourcesContent = map.sourcesContent;
+
+ assert.equal(sourcesContent[0], ' ONE.foo = function (bar) {\n return baz(bar);\n };');
+ assert.equal(sourcesContent[1], ' TWO.inc = function (n) {\n return n + 1;\n };');
+ assert.equal(sourcesContent.length, 2);
+ };
+
+ exports['test that we can get the original sources for the sources'] = function (assert, util) {
+ var map = new SourceMapConsumer(util.testMapWithSourcesContent);
+ var sources = map.sources;
+
+ assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };');
+ assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };');
+ assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };');
+ assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };');
+ assert.throws(function () {
+ map.sourceContentFor("");
+ }, Error);
+ assert.throws(function () {
+ map.sourceContentFor("/the/root/three.js");
+ }, Error);
+ assert.throws(function () {
+ map.sourceContentFor("three.js");
+ }, Error);
+ };
+
+ exports['test that we can get the original source content with relative source paths'] = function (assert, util) {
+ var map = new SourceMapConsumer(util.testMapRelativeSources);
+ var sources = map.sources;
+
+ assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };');
+ assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };');
+ assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };');
+ assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };');
+ assert.throws(function () {
+ map.sourceContentFor("");
+ }, Error);
+ assert.throws(function () {
+ map.sourceContentFor("/the/root/three.js");
+ }, Error);
+ assert.throws(function () {
+ map.sourceContentFor("three.js");
+ }, Error);
+ };
+
+ exports['test sourceRoot + generatedPositionFor'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ sourceRoot: 'foo/bar',
+ file: 'baz.js'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'bang.coffee'
+ });
+ map.addMapping({
+ original: { line: 5, column: 5 },
+ generated: { line: 6, column: 6 },
+ source: 'bang.coffee'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ // Should handle without sourceRoot.
+ var pos = map.generatedPositionFor({
+ line: 1,
+ column: 1,
+ source: 'bang.coffee'
+ });
+
+ assert.equal(pos.line, 2);
+ assert.equal(pos.column, 2);
+
+ // Should handle with sourceRoot.
+ var pos = map.generatedPositionFor({
+ line: 1,
+ column: 1,
+ source: 'foo/bar/bang.coffee'
+ });
+
+ assert.equal(pos.line, 2);
+ assert.equal(pos.column, 2);
+ };
+
+ exports['test allGeneratedPositionsFor'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated.js'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'foo.coffee'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'bar.coffee'
+ });
+ map.addMapping({
+ original: { line: 2, column: 1 },
+ generated: { line: 3, column: 2 },
+ source: 'bar.coffee'
+ });
+ map.addMapping({
+ original: { line: 2, column: 2 },
+ generated: { line: 3, column: 3 },
+ source: 'bar.coffee'
+ });
+ map.addMapping({
+ original: { line: 3, column: 1 },
+ generated: { line: 4, column: 2 },
+ source: 'bar.coffee'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ var mappings = map.allGeneratedPositionsFor({
+ line: 2,
+ source: 'bar.coffee'
+ });
+
+ assert.equal(mappings.length, 2);
+ assert.equal(mappings[0].line, 3);
+ assert.equal(mappings[0].column, 2);
+ assert.equal(mappings[1].line, 3);
+ assert.equal(mappings[1].column, 3);
+ };
+
+ exports['test allGeneratedPositionsFor for line with no mappings'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated.js'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'foo.coffee'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'bar.coffee'
+ });
+ map.addMapping({
+ original: { line: 3, column: 1 },
+ generated: { line: 4, column: 2 },
+ source: 'bar.coffee'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ var mappings = map.allGeneratedPositionsFor({
+ line: 2,
+ source: 'bar.coffee'
+ });
+
+ assert.equal(mappings.length, 0);
+ };
+
+ exports['test allGeneratedPositionsFor source map with no mappings'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated.js'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ var mappings = map.allGeneratedPositionsFor({
+ line: 2,
+ source: 'bar.coffee'
+ });
+
+ assert.equal(mappings.length, 0);
+ };
+
+ exports['test computeColumnSpans'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated.js'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 1, column: 1 },
+ source: 'foo.coffee'
+ });
+ map.addMapping({
+ original: { line: 2, column: 1 },
+ generated: { line: 2, column: 1 },
+ source: 'foo.coffee'
+ });
+ map.addMapping({
+ original: { line: 2, column: 2 },
+ generated: { line: 2, column: 10 },
+ source: 'foo.coffee'
+ });
+ map.addMapping({
+ original: { line: 2, column: 3 },
+ generated: { line: 2, column: 20 },
+ source: 'foo.coffee'
+ });
+ map.addMapping({
+ original: { line: 3, column: 1 },
+ generated: { line: 3, column: 1 },
+ source: 'foo.coffee'
+ });
+ map.addMapping({
+ original: { line: 3, column: 2 },
+ generated: { line: 3, column: 2 },
+ source: 'foo.coffee'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ map.computeColumnSpans();
+
+ var mappings = map.allGeneratedPositionsFor({
+ line: 1,
+ source: 'foo.coffee'
+ });
+
+ assert.equal(mappings.length, 1);
+ assert.equal(mappings[0].lastColumn, Infinity);
+
+ var mappings = map.allGeneratedPositionsFor({
+ line: 2,
+ source: 'foo.coffee'
+ });
+
+ assert.equal(mappings.length, 3);
+ assert.equal(mappings[0].lastColumn, 9);
+ assert.equal(mappings[1].lastColumn, 19);
+ assert.equal(mappings[2].lastColumn, Infinity);
+
+ var mappings = map.allGeneratedPositionsFor({
+ line: 3,
+ source: 'foo.coffee'
+ });
+
+ assert.equal(mappings.length, 2);
+ assert.equal(mappings[0].lastColumn, 1);
+ assert.equal(mappings[1].lastColumn, Infinity);
+ };
+
+ exports['test sourceRoot + originalPositionFor'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ sourceRoot: 'foo/bar',
+ file: 'baz.js'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'bang.coffee'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ var pos = map.originalPositionFor({
+ line: 2,
+ column: 2,
+ });
+
+ // Should always have the prepended source root
+ assert.equal(pos.source, 'foo/bar/bang.coffee');
+ assert.equal(pos.line, 1);
+ assert.equal(pos.column, 1);
+ };
+
+ exports['test github issue #56'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ sourceRoot: 'http://',
+ file: 'www.example.com/foo.js'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'www.example.com/original.js'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ var sources = map.sources;
+ assert.equal(sources.length, 1);
+ assert.equal(sources[0], 'http://www.example.com/original.js');
+ };
+
+ exports['test github issue #43'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ sourceRoot: 'http://example.com',
+ file: 'foo.js'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'http://cdn.example.com/original.js'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ var sources = map.sources;
+ assert.equal(sources.length, 1,
+ 'Should only be one source.');
+ assert.equal(sources[0], 'http://cdn.example.com/original.js',
+ 'Should not be joined with the sourceRoot.');
+ };
+
+ exports['test absolute path, but same host sources'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ sourceRoot: 'http://example.com/foo/bar',
+ file: 'foo.js'
+ });
+ map.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: '/original.js'
+ });
+ map = new SourceMapConsumer(map.toString());
+
+ var sources = map.sources;
+ assert.equal(sources.length, 1,
+ 'Should only be one source.');
+ assert.equal(sources[0], 'http://example.com/original.js',
+ 'Source should be relative the host of the source root.');
+ };
+
+ exports['test github issue #64'] = function (assert, util) {
+ var map = new SourceMapConsumer({
+ "version": 3,
+ "file": "foo.js",
+ "sourceRoot": "http://example.com/",
+ "sources": ["/a"],
+ "names": [],
+ "mappings": "AACA",
+ "sourcesContent": ["foo"]
+ });
+
+ assert.equal(map.sourceContentFor("a"), "foo");
+ assert.equal(map.sourceContentFor("/a"), "foo");
+ };
+
+ exports['test bug 885597'] = function (assert, util) {
+ var map = new SourceMapConsumer({
+ "version": 3,
+ "file": "foo.js",
+ "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/",
+ "sources": ["/a"],
+ "names": [],
+ "mappings": "AACA",
+ "sourcesContent": ["foo"]
+ });
+
+ var s = map.sources[0];
+ assert.equal(map.sourceContentFor(s), "foo");
+ };
+
+ exports['test github issue #72, duplicate sources'] = function (assert, util) {
+ var map = new SourceMapConsumer({
+ "version": 3,
+ "file": "foo.js",
+ "sources": ["source1.js", "source1.js", "source3.js"],
+ "names": [],
+ "mappings": ";EAAC;;IAEE;;MEEE",
+ "sourceRoot": "http://example.com"
+ });
+
+ var pos = map.originalPositionFor({
+ line: 2,
+ column: 2
+ });
+ assert.equal(pos.source, 'http://example.com/source1.js');
+ assert.equal(pos.line, 1);
+ assert.equal(pos.column, 1);
+
+ var pos = map.originalPositionFor({
+ line: 4,
+ column: 4
+ });
+ assert.equal(pos.source, 'http://example.com/source1.js');
+ assert.equal(pos.line, 3);
+ assert.equal(pos.column, 3);
+
+ var pos = map.originalPositionFor({
+ line: 6,
+ column: 6
+ });
+ assert.equal(pos.source, 'http://example.com/source3.js');
+ assert.equal(pos.line, 5);
+ assert.equal(pos.column, 5);
+ };
+
+ exports['test github issue #72, duplicate names'] = function (assert, util) {
+ var map = new SourceMapConsumer({
+ "version": 3,
+ "file": "foo.js",
+ "sources": ["source.js"],
+ "names": ["name1", "name1", "name3"],
+ "mappings": ";EAACA;;IAEEA;;MAEEE",
+ "sourceRoot": "http://example.com"
+ });
+
+ var pos = map.originalPositionFor({
+ line: 2,
+ column: 2
+ });
+ assert.equal(pos.name, 'name1');
+ assert.equal(pos.line, 1);
+ assert.equal(pos.column, 1);
+
+ var pos = map.originalPositionFor({
+ line: 4,
+ column: 4
+ });
+ assert.equal(pos.name, 'name1');
+ assert.equal(pos.line, 3);
+ assert.equal(pos.column, 3);
+
+ var pos = map.originalPositionFor({
+ line: 6,
+ column: 6
+ });
+ assert.equal(pos.name, 'name3');
+ assert.equal(pos.line, 5);
+ assert.equal(pos.column, 5);
+ };
+
+ exports['test SourceMapConsumer.fromSourceMap'] = function (assert, util) {
+ var smg = new SourceMapGenerator({
+ sourceRoot: 'http://example.com/',
+ file: 'foo.js'
+ });
+ smg.addMapping({
+ original: { line: 1, column: 1 },
+ generated: { line: 2, column: 2 },
+ source: 'bar.js'
+ });
+ smg.addMapping({
+ original: { line: 2, column: 2 },
+ generated: { line: 4, column: 4 },
+ source: 'baz.js',
+ name: 'dirtMcGirt'
+ });
+ smg.setSourceContent('baz.js', 'baz.js content');
+
+ var smc = SourceMapConsumer.fromSourceMap(smg);
+ assert.equal(smc.file, 'foo.js');
+ assert.equal(smc.sourceRoot, 'http://example.com/');
+ assert.equal(smc.sources.length, 2);
+ assert.equal(smc.sources[0], 'http://example.com/bar.js');
+ assert.equal(smc.sources[1], 'http://example.com/baz.js');
+ assert.equal(smc.sourceContentFor('baz.js'), 'baz.js content');
+
+ var pos = smc.originalPositionFor({
+ line: 2,
+ column: 2
+ });
+ assert.equal(pos.line, 1);
+ assert.equal(pos.column, 1);
+ assert.equal(pos.source, 'http://example.com/bar.js');
+ assert.equal(pos.name, null);
+
+ pos = smc.generatedPositionFor({
+ line: 1,
+ column: 1,
+ source: 'http://example.com/bar.js'
+ });
+ assert.equal(pos.line, 2);
+ assert.equal(pos.column, 2);
+
+ pos = smc.originalPositionFor({
+ line: 4,
+ column: 4
+ });
+ assert.equal(pos.line, 2);
+ assert.equal(pos.column, 2);
+ assert.equal(pos.source, 'http://example.com/baz.js');
+ assert.equal(pos.name, 'dirtMcGirt');
+
+ pos = smc.generatedPositionFor({
+ line: 2,
+ column: 2,
+ source: 'http://example.com/baz.js'
+ });
+ assert.equal(pos.line, 4);
+ assert.equal(pos.column, 4);
+ };
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-source-map-generator.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-source-map-generator.js
new file mode 100644
index 00000000..d748bb18
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-source-map-generator.js
@@ -0,0 +1,679 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator;
+ var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer;
+ var SourceNode = require('../../lib/source-map/source-node').SourceNode;
+ var util = require('./util');
+
+ exports['test some simple stuff'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'foo.js',
+ sourceRoot: '.'
+ });
+ assert.ok(true);
+
+ var map = new SourceMapGenerator().toJSON();
+ assert.ok(!('file' in map));
+ assert.ok(!('sourceRoot' in map));
+ };
+
+ exports['test JSON serialization'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'foo.js',
+ sourceRoot: '.'
+ });
+ assert.equal(map.toString(), JSON.stringify(map));
+ };
+
+ exports['test adding mappings (case 1)'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated-foo.js',
+ sourceRoot: '.'
+ });
+
+ assert.doesNotThrow(function () {
+ map.addMapping({
+ generated: { line: 1, column: 1 }
+ });
+ });
+ };
+
+ exports['test adding mappings (case 2)'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated-foo.js',
+ sourceRoot: '.'
+ });
+
+ assert.doesNotThrow(function () {
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ source: 'bar.js',
+ original: { line: 1, column: 1 }
+ });
+ });
+ };
+
+ exports['test adding mappings (case 3)'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated-foo.js',
+ sourceRoot: '.'
+ });
+
+ assert.doesNotThrow(function () {
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ source: 'bar.js',
+ original: { line: 1, column: 1 },
+ name: 'someToken'
+ });
+ });
+ };
+
+ exports['test adding mappings (invalid)'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated-foo.js',
+ sourceRoot: '.'
+ });
+
+ // Not enough info.
+ assert.throws(function () {
+ map.addMapping({});
+ });
+
+ // Original file position, but no source.
+ assert.throws(function () {
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ original: { line: 1, column: 1 }
+ });
+ });
+ };
+
+ exports['test adding mappings with skipValidation'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated-foo.js',
+ sourceRoot: '.',
+ skipValidation: true
+ });
+
+ // Not enough info, caught by `util.getArgs`
+ assert.throws(function () {
+ map.addMapping({});
+ });
+
+ // Original file position, but no source. Not checked.
+ assert.doesNotThrow(function () {
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ original: { line: 1, column: 1 }
+ });
+ });
+ };
+
+ exports['test that the correct mappings are being generated'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'min.js',
+ sourceRoot: '/the/root'
+ });
+
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ original: { line: 1, column: 1 },
+ source: 'one.js'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 5 },
+ original: { line: 1, column: 5 },
+ source: 'one.js'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 9 },
+ original: { line: 1, column: 11 },
+ source: 'one.js'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 18 },
+ original: { line: 1, column: 21 },
+ source: 'one.js',
+ name: 'bar'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 21 },
+ original: { line: 2, column: 3 },
+ source: 'one.js'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 28 },
+ original: { line: 2, column: 10 },
+ source: 'one.js',
+ name: 'baz'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 32 },
+ original: { line: 2, column: 14 },
+ source: 'one.js',
+ name: 'bar'
+ });
+
+ map.addMapping({
+ generated: { line: 2, column: 1 },
+ original: { line: 1, column: 1 },
+ source: 'two.js'
+ });
+ map.addMapping({
+ generated: { line: 2, column: 5 },
+ original: { line: 1, column: 5 },
+ source: 'two.js'
+ });
+ map.addMapping({
+ generated: { line: 2, column: 9 },
+ original: { line: 1, column: 11 },
+ source: 'two.js'
+ });
+ map.addMapping({
+ generated: { line: 2, column: 18 },
+ original: { line: 1, column: 21 },
+ source: 'two.js',
+ name: 'n'
+ });
+ map.addMapping({
+ generated: { line: 2, column: 21 },
+ original: { line: 2, column: 3 },
+ source: 'two.js'
+ });
+ map.addMapping({
+ generated: { line: 2, column: 28 },
+ original: { line: 2, column: 10 },
+ source: 'two.js',
+ name: 'n'
+ });
+
+ map = JSON.parse(map.toString());
+
+ util.assertEqualMaps(assert, map, util.testMap);
+ };
+
+ exports['test that adding a mapping with an empty string name does not break generation'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'generated-foo.js',
+ sourceRoot: '.'
+ });
+
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ source: 'bar.js',
+ original: { line: 1, column: 1 },
+ name: ''
+ });
+
+ assert.doesNotThrow(function () {
+ JSON.parse(map.toString());
+ });
+ };
+
+ exports['test that source content can be set'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'min.js',
+ sourceRoot: '/the/root'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ original: { line: 1, column: 1 },
+ source: 'one.js'
+ });
+ map.addMapping({
+ generated: { line: 2, column: 1 },
+ original: { line: 1, column: 1 },
+ source: 'two.js'
+ });
+ map.setSourceContent('one.js', 'one file content');
+
+ map = JSON.parse(map.toString());
+ assert.equal(map.sources[0], 'one.js');
+ assert.equal(map.sources[1], 'two.js');
+ assert.equal(map.sourcesContent[0], 'one file content');
+ assert.equal(map.sourcesContent[1], null);
+ };
+
+ exports['test .fromSourceMap'] = function (assert, util) {
+ var map = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(util.testMap));
+ util.assertEqualMaps(assert, map.toJSON(), util.testMap);
+ };
+
+ exports['test .fromSourceMap with sourcesContent'] = function (assert, util) {
+ var map = SourceMapGenerator.fromSourceMap(
+ new SourceMapConsumer(util.testMapWithSourcesContent));
+ util.assertEqualMaps(assert, map.toJSON(), util.testMapWithSourcesContent);
+ };
+
+ exports['test applySourceMap'] = function (assert, util) {
+ var node = new SourceNode(null, null, null, [
+ new SourceNode(2, 0, 'fileX', 'lineX2\n'),
+ 'genA1\n',
+ new SourceNode(2, 0, 'fileY', 'lineY2\n'),
+ 'genA2\n',
+ new SourceNode(1, 0, 'fileX', 'lineX1\n'),
+ 'genA3\n',
+ new SourceNode(1, 0, 'fileY', 'lineY1\n')
+ ]);
+ var mapStep1 = node.toStringWithSourceMap({
+ file: 'fileA'
+ }).map;
+ mapStep1.setSourceContent('fileX', 'lineX1\nlineX2\n');
+ mapStep1 = mapStep1.toJSON();
+
+ node = new SourceNode(null, null, null, [
+ 'gen1\n',
+ new SourceNode(1, 0, 'fileA', 'lineA1\n'),
+ new SourceNode(2, 0, 'fileA', 'lineA2\n'),
+ new SourceNode(3, 0, 'fileA', 'lineA3\n'),
+ new SourceNode(4, 0, 'fileA', 'lineA4\n'),
+ new SourceNode(1, 0, 'fileB', 'lineB1\n'),
+ new SourceNode(2, 0, 'fileB', 'lineB2\n'),
+ 'gen2\n'
+ ]);
+ var mapStep2 = node.toStringWithSourceMap({
+ file: 'fileGen'
+ }).map;
+ mapStep2.setSourceContent('fileB', 'lineB1\nlineB2\n');
+ mapStep2 = mapStep2.toJSON();
+
+ node = new SourceNode(null, null, null, [
+ 'gen1\n',
+ new SourceNode(2, 0, 'fileX', 'lineA1\n'),
+ new SourceNode(2, 0, 'fileA', 'lineA2\n'),
+ new SourceNode(2, 0, 'fileY', 'lineA3\n'),
+ new SourceNode(4, 0, 'fileA', 'lineA4\n'),
+ new SourceNode(1, 0, 'fileB', 'lineB1\n'),
+ new SourceNode(2, 0, 'fileB', 'lineB2\n'),
+ 'gen2\n'
+ ]);
+ var expectedMap = node.toStringWithSourceMap({
+ file: 'fileGen'
+ }).map;
+ expectedMap.setSourceContent('fileX', 'lineX1\nlineX2\n');
+ expectedMap.setSourceContent('fileB', 'lineB1\nlineB2\n');
+ expectedMap = expectedMap.toJSON();
+
+ // apply source map "mapStep1" to "mapStep2"
+ var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(mapStep2));
+ generator.applySourceMap(new SourceMapConsumer(mapStep1));
+ var actualMap = generator.toJSON();
+
+ util.assertEqualMaps(assert, actualMap, expectedMap);
+ };
+
+ exports['test applySourceMap throws when file is missing'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'test.js'
+ });
+ var map2 = new SourceMapGenerator();
+ assert.throws(function() {
+ map.applySourceMap(new SourceMapConsumer(map2.toJSON()));
+ });
+ };
+
+ exports['test the two additional parameters of applySourceMap'] = function (assert, util) {
+ // Assume the following directory structure:
+ //
+ // http://foo.org/
+ // bar.coffee
+ // app/
+ // coffee/
+ // foo.coffee
+ // temp/
+ // bundle.js
+ // temp_maps/
+ // bundle.js.map
+ // public/
+ // bundle.min.js
+ // bundle.min.js.map
+ //
+ // http://www.example.com/
+ // baz.coffee
+
+ var bundleMap = new SourceMapGenerator({
+ file: 'bundle.js'
+ });
+ bundleMap.addMapping({
+ generated: { line: 3, column: 3 },
+ original: { line: 2, column: 2 },
+ source: '../../coffee/foo.coffee'
+ });
+ bundleMap.setSourceContent('../../coffee/foo.coffee', 'foo coffee');
+ bundleMap.addMapping({
+ generated: { line: 13, column: 13 },
+ original: { line: 12, column: 12 },
+ source: '/bar.coffee'
+ });
+ bundleMap.setSourceContent('/bar.coffee', 'bar coffee');
+ bundleMap.addMapping({
+ generated: { line: 23, column: 23 },
+ original: { line: 22, column: 22 },
+ source: 'http://www.example.com/baz.coffee'
+ });
+ bundleMap.setSourceContent(
+ 'http://www.example.com/baz.coffee',
+ 'baz coffee'
+ );
+ bundleMap = new SourceMapConsumer(bundleMap.toJSON());
+
+ var minifiedMap = new SourceMapGenerator({
+ file: 'bundle.min.js',
+ sourceRoot: '..'
+ });
+ minifiedMap.addMapping({
+ generated: { line: 1, column: 1 },
+ original: { line: 3, column: 3 },
+ source: 'temp/bundle.js'
+ });
+ minifiedMap.addMapping({
+ generated: { line: 11, column: 11 },
+ original: { line: 13, column: 13 },
+ source: 'temp/bundle.js'
+ });
+ minifiedMap.addMapping({
+ generated: { line: 21, column: 21 },
+ original: { line: 23, column: 23 },
+ source: 'temp/bundle.js'
+ });
+ minifiedMap = new SourceMapConsumer(minifiedMap.toJSON());
+
+ var expectedMap = function (sources) {
+ var map = new SourceMapGenerator({
+ file: 'bundle.min.js',
+ sourceRoot: '..'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ original: { line: 2, column: 2 },
+ source: sources[0]
+ });
+ map.setSourceContent(sources[0], 'foo coffee');
+ map.addMapping({
+ generated: { line: 11, column: 11 },
+ original: { line: 12, column: 12 },
+ source: sources[1]
+ });
+ map.setSourceContent(sources[1], 'bar coffee');
+ map.addMapping({
+ generated: { line: 21, column: 21 },
+ original: { line: 22, column: 22 },
+ source: sources[2]
+ });
+ map.setSourceContent(sources[2], 'baz coffee');
+ return map.toJSON();
+ }
+
+ var actualMap = function (aSourceMapPath) {
+ var map = SourceMapGenerator.fromSourceMap(minifiedMap);
+ // Note that relying on `bundleMap.file` (which is simply 'bundle.js')
+ // instead of supplying the second parameter wouldn't work here.
+ map.applySourceMap(bundleMap, '../temp/bundle.js', aSourceMapPath);
+ return map.toJSON();
+ }
+
+ util.assertEqualMaps(assert, actualMap('../temp/temp_maps'), expectedMap([
+ 'coffee/foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee'
+ ]));
+
+ util.assertEqualMaps(assert, actualMap('/app/temp/temp_maps'), expectedMap([
+ '/app/coffee/foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee'
+ ]));
+
+ util.assertEqualMaps(assert, actualMap('http://foo.org/app/temp/temp_maps'), expectedMap([
+ 'http://foo.org/app/coffee/foo.coffee',
+ 'http://foo.org/bar.coffee',
+ 'http://www.example.com/baz.coffee'
+ ]));
+
+ // If the third parameter is omitted or set to the current working
+ // directory we get incorrect source paths:
+
+ util.assertEqualMaps(assert, actualMap(), expectedMap([
+ '../coffee/foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee'
+ ]));
+
+ util.assertEqualMaps(assert, actualMap(''), expectedMap([
+ '../coffee/foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee'
+ ]));
+
+ util.assertEqualMaps(assert, actualMap('.'), expectedMap([
+ '../coffee/foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee'
+ ]));
+
+ util.assertEqualMaps(assert, actualMap('./'), expectedMap([
+ '../coffee/foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee'
+ ]));
+ };
+
+ exports['test applySourceMap name handling'] = function (assert, util) {
+ // Imagine some CoffeeScript code being compiled into JavaScript and then
+ // minified.
+
+ var assertName = function(coffeeName, jsName, expectedName) {
+ var minifiedMap = new SourceMapGenerator({
+ file: 'test.js.min'
+ });
+ minifiedMap.addMapping({
+ generated: { line: 1, column: 4 },
+ original: { line: 1, column: 4 },
+ source: 'test.js',
+ name: jsName
+ });
+
+ var coffeeMap = new SourceMapGenerator({
+ file: 'test.js'
+ });
+ coffeeMap.addMapping({
+ generated: { line: 1, column: 4 },
+ original: { line: 1, column: 0 },
+ source: 'test.coffee',
+ name: coffeeName
+ });
+
+ minifiedMap.applySourceMap(new SourceMapConsumer(coffeeMap.toJSON()));
+
+ new SourceMapConsumer(minifiedMap.toJSON()).eachMapping(function(mapping) {
+ assert.equal(mapping.name, expectedName);
+ });
+ };
+
+ // `foo = 1` -> `var foo = 1;` -> `var a=1`
+ // CoffeeScript doesn’t rename variables, so there’s no need for it to
+ // provide names in its source maps. Minifiers do rename variables and
+ // therefore do provide names in their source maps. So that name should be
+ // retained if the original map lacks names.
+ assertName(null, 'foo', 'foo');
+
+ // `foo = 1` -> `var coffee$foo = 1;` -> `var a=1`
+ // Imagine that CoffeeScript prefixed all variables with `coffee$`. Even
+ // though the minifier then also provides a name, the original name is
+ // what corresponds to the source.
+ assertName('foo', 'coffee$foo', 'foo');
+
+ // `foo = 1` -> `var coffee$foo = 1;` -> `var coffee$foo=1`
+ // Minifiers can turn off variable mangling. Then there’s no need to
+ // provide names in the source map, but the names from the original map are
+ // still needed.
+ assertName('foo', null, 'foo');
+
+ // `foo = 1` -> `var foo = 1;` -> `var foo=1`
+ // No renaming at all.
+ assertName(null, null, null);
+ };
+
+ exports['test sorting with duplicate generated mappings'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'test.js'
+ });
+ map.addMapping({
+ generated: { line: 3, column: 0 },
+ original: { line: 2, column: 0 },
+ source: 'a.js'
+ });
+ map.addMapping({
+ generated: { line: 2, column: 0 }
+ });
+ map.addMapping({
+ generated: { line: 2, column: 0 }
+ });
+ map.addMapping({
+ generated: { line: 1, column: 0 },
+ original: { line: 1, column: 0 },
+ source: 'a.js'
+ });
+
+ util.assertEqualMaps(assert, map.toJSON(), {
+ version: 3,
+ file: 'test.js',
+ sources: ['a.js'],
+ names: [],
+ mappings: 'AAAA;A;AACA'
+ });
+ };
+
+ exports['test ignore duplicate mappings.'] = function (assert, util) {
+ var init = { file: 'min.js', sourceRoot: '/the/root' };
+ var map1, map2;
+
+ // null original source location
+ var nullMapping1 = {
+ generated: { line: 1, column: 0 }
+ };
+ var nullMapping2 = {
+ generated: { line: 2, column: 2 }
+ };
+
+ map1 = new SourceMapGenerator(init);
+ map2 = new SourceMapGenerator(init);
+
+ map1.addMapping(nullMapping1);
+ map1.addMapping(nullMapping1);
+
+ map2.addMapping(nullMapping1);
+
+ util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
+
+ map1.addMapping(nullMapping2);
+ map1.addMapping(nullMapping1);
+
+ map2.addMapping(nullMapping2);
+
+ util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
+
+ // original source location
+ var srcMapping1 = {
+ generated: { line: 1, column: 0 },
+ original: { line: 11, column: 0 },
+ source: 'srcMapping1.js'
+ };
+ var srcMapping2 = {
+ generated: { line: 2, column: 2 },
+ original: { line: 11, column: 0 },
+ source: 'srcMapping2.js'
+ };
+
+ map1 = new SourceMapGenerator(init);
+ map2 = new SourceMapGenerator(init);
+
+ map1.addMapping(srcMapping1);
+ map1.addMapping(srcMapping1);
+
+ map2.addMapping(srcMapping1);
+
+ util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
+
+ map1.addMapping(srcMapping2);
+ map1.addMapping(srcMapping1);
+
+ map2.addMapping(srcMapping2);
+
+ util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
+
+ // full original source and name information
+ var fullMapping1 = {
+ generated: { line: 1, column: 0 },
+ original: { line: 11, column: 0 },
+ source: 'fullMapping1.js',
+ name: 'fullMapping1'
+ };
+ var fullMapping2 = {
+ generated: { line: 2, column: 2 },
+ original: { line: 11, column: 0 },
+ source: 'fullMapping2.js',
+ name: 'fullMapping2'
+ };
+
+ map1 = new SourceMapGenerator(init);
+ map2 = new SourceMapGenerator(init);
+
+ map1.addMapping(fullMapping1);
+ map1.addMapping(fullMapping1);
+
+ map2.addMapping(fullMapping1);
+
+ util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
+
+ map1.addMapping(fullMapping2);
+ map1.addMapping(fullMapping1);
+
+ map2.addMapping(fullMapping2);
+
+ util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
+ };
+
+ exports['test github issue #72, check for duplicate names or sources'] = function (assert, util) {
+ var map = new SourceMapGenerator({
+ file: 'test.js'
+ });
+ map.addMapping({
+ generated: { line: 1, column: 1 },
+ original: { line: 2, column: 2 },
+ source: 'a.js',
+ name: 'foo'
+ });
+ map.addMapping({
+ generated: { line: 3, column: 3 },
+ original: { line: 4, column: 4 },
+ source: 'a.js',
+ name: 'foo'
+ });
+ util.assertEqualMaps(assert, map.toJSON(), {
+ version: 3,
+ file: 'test.js',
+ sources: ['a.js'],
+ names: ['foo'],
+ mappings: 'CACEA;;GAEEA'
+ });
+ };
+
+ exports['test setting sourcesContent to null when already null'] = function (assert, util) {
+ var smg = new SourceMapGenerator({ file: "foo.js" });
+ assert.doesNotThrow(function() {
+ smg.setSourceContent("bar.js", null);
+ });
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-source-node.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-source-node.js
new file mode 100644
index 00000000..139af4e4
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-source-node.js
@@ -0,0 +1,612 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator;
+ var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer;
+ var SourceNode = require('../../lib/source-map/source-node').SourceNode;
+
+ function forEachNewline(fn) {
+ return function (assert, util) {
+ ['\n', '\r\n'].forEach(fn.bind(null, assert, util));
+ }
+ }
+
+ exports['test .add()'] = function (assert, util) {
+ var node = new SourceNode(null, null, null);
+
+ // Adding a string works.
+ node.add('function noop() {}');
+
+ // Adding another source node works.
+ node.add(new SourceNode(null, null, null));
+
+ // Adding an array works.
+ node.add(['function foo() {',
+ new SourceNode(null, null, null,
+ 'return 10;'),
+ '}']);
+
+ // Adding other stuff doesn't.
+ assert.throws(function () {
+ node.add({});
+ });
+ assert.throws(function () {
+ node.add(function () {});
+ });
+ };
+
+ exports['test .prepend()'] = function (assert, util) {
+ var node = new SourceNode(null, null, null);
+
+ // Prepending a string works.
+ node.prepend('function noop() {}');
+ assert.equal(node.children[0], 'function noop() {}');
+ assert.equal(node.children.length, 1);
+
+ // Prepending another source node works.
+ node.prepend(new SourceNode(null, null, null));
+ assert.equal(node.children[0], '');
+ assert.equal(node.children[1], 'function noop() {}');
+ assert.equal(node.children.length, 2);
+
+ // Prepending an array works.
+ node.prepend(['function foo() {',
+ new SourceNode(null, null, null,
+ 'return 10;'),
+ '}']);
+ assert.equal(node.children[0], 'function foo() {');
+ assert.equal(node.children[1], 'return 10;');
+ assert.equal(node.children[2], '}');
+ assert.equal(node.children[3], '');
+ assert.equal(node.children[4], 'function noop() {}');
+ assert.equal(node.children.length, 5);
+
+ // Prepending other stuff doesn't.
+ assert.throws(function () {
+ node.prepend({});
+ });
+ assert.throws(function () {
+ node.prepend(function () {});
+ });
+ };
+
+ exports['test .toString()'] = function (assert, util) {
+ assert.equal((new SourceNode(null, null, null,
+ ['function foo() {',
+ new SourceNode(null, null, null, 'return 10;'),
+ '}'])).toString(),
+ 'function foo() {return 10;}');
+ };
+
+ exports['test .join()'] = function (assert, util) {
+ assert.equal((new SourceNode(null, null, null,
+ ['a', 'b', 'c', 'd'])).join(', ').toString(),
+ 'a, b, c, d');
+ };
+
+ exports['test .walk()'] = function (assert, util) {
+ var node = new SourceNode(null, null, null,
+ ['(function () {\n',
+ ' ', new SourceNode(1, 0, 'a.js', ['someCall()']), ';\n',
+ ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n',
+ '}());']);
+ var expected = [
+ { str: '(function () {\n', source: null, line: null, column: null },
+ { str: ' ', source: null, line: null, column: null },
+ { str: 'someCall()', source: 'a.js', line: 1, column: 0 },
+ { str: ';\n', source: null, line: null, column: null },
+ { str: ' ', source: null, line: null, column: null },
+ { str: 'if (foo) bar()', source: 'b.js', line: 2, column: 0 },
+ { str: ';\n', source: null, line: null, column: null },
+ { str: '}());', source: null, line: null, column: null },
+ ];
+ var i = 0;
+ node.walk(function (chunk, loc) {
+ assert.equal(expected[i].str, chunk);
+ assert.equal(expected[i].source, loc.source);
+ assert.equal(expected[i].line, loc.line);
+ assert.equal(expected[i].column, loc.column);
+ i++;
+ });
+ };
+
+ exports['test .replaceRight'] = function (assert, util) {
+ var node;
+
+ // Not nested
+ node = new SourceNode(null, null, null, 'hello world');
+ node.replaceRight(/world/, 'universe');
+ assert.equal(node.toString(), 'hello universe');
+
+ // Nested
+ node = new SourceNode(null, null, null,
+ [new SourceNode(null, null, null, 'hey sexy mama, '),
+ new SourceNode(null, null, null, 'want to kill all humans?')]);
+ node.replaceRight(/kill all humans/, 'watch Futurama');
+ assert.equal(node.toString(), 'hey sexy mama, want to watch Futurama?');
+ };
+
+ exports['test .toStringWithSourceMap()'] = forEachNewline(function (assert, util, nl) {
+ var node = new SourceNode(null, null, null,
+ ['(function () {' + nl,
+ ' ',
+ new SourceNode(1, 0, 'a.js', 'someCall', 'originalCall'),
+ new SourceNode(1, 8, 'a.js', '()'),
+ ';' + nl,
+ ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';' + nl,
+ '}());']);
+ var result = node.toStringWithSourceMap({
+ file: 'foo.js'
+ });
+
+ assert.equal(result.code, [
+ '(function () {',
+ ' someCall();',
+ ' if (foo) bar();',
+ '}());'
+ ].join(nl));
+
+ var map = result.map;
+ var mapWithoutOptions = node.toStringWithSourceMap().map;
+
+ assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
+ assert.ok(mapWithoutOptions instanceof SourceMapGenerator, 'mapWithoutOptions instanceof SourceMapGenerator');
+ assert.ok(!('file' in mapWithoutOptions));
+ mapWithoutOptions._file = 'foo.js';
+ util.assertEqualMaps(assert, map.toJSON(), mapWithoutOptions.toJSON());
+
+ map = new SourceMapConsumer(map.toString());
+
+ var actual;
+
+ actual = map.originalPositionFor({
+ line: 1,
+ column: 4
+ });
+ assert.equal(actual.source, null);
+ assert.equal(actual.line, null);
+ assert.equal(actual.column, null);
+
+ actual = map.originalPositionFor({
+ line: 2,
+ column: 2
+ });
+ assert.equal(actual.source, 'a.js');
+ assert.equal(actual.line, 1);
+ assert.equal(actual.column, 0);
+ assert.equal(actual.name, 'originalCall');
+
+ actual = map.originalPositionFor({
+ line: 3,
+ column: 2
+ });
+ assert.equal(actual.source, 'b.js');
+ assert.equal(actual.line, 2);
+ assert.equal(actual.column, 0);
+
+ actual = map.originalPositionFor({
+ line: 3,
+ column: 16
+ });
+ assert.equal(actual.source, null);
+ assert.equal(actual.line, null);
+ assert.equal(actual.column, null);
+
+ actual = map.originalPositionFor({
+ line: 4,
+ column: 2
+ });
+ assert.equal(actual.source, null);
+ assert.equal(actual.line, null);
+ assert.equal(actual.column, null);
+ });
+
+ exports['test .fromStringWithSourceMap()'] = forEachNewline(function (assert, util, nl) {
+ var testCode = util.testGeneratedCode.replace(/\n/g, nl);
+ var node = SourceNode.fromStringWithSourceMap(
+ testCode,
+ new SourceMapConsumer(util.testMap));
+
+ var result = node.toStringWithSourceMap({
+ file: 'min.js'
+ });
+ var map = result.map;
+ var code = result.code;
+
+ assert.equal(code, testCode);
+ assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
+ map = map.toJSON();
+ assert.equal(map.version, util.testMap.version);
+ assert.equal(map.file, util.testMap.file);
+ assert.equal(map.mappings, util.testMap.mappings);
+ });
+
+ exports['test .fromStringWithSourceMap() empty map'] = forEachNewline(function (assert, util, nl) {
+ var node = SourceNode.fromStringWithSourceMap(
+ util.testGeneratedCode.replace(/\n/g, nl),
+ new SourceMapConsumer(util.emptyMap));
+ var result = node.toStringWithSourceMap({
+ file: 'min.js'
+ });
+ var map = result.map;
+ var code = result.code;
+
+ assert.equal(code, util.testGeneratedCode.replace(/\n/g, nl));
+ assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
+ map = map.toJSON();
+ assert.equal(map.version, util.emptyMap.version);
+ assert.equal(map.file, util.emptyMap.file);
+ assert.equal(map.mappings.length, util.emptyMap.mappings.length);
+ assert.equal(map.mappings, util.emptyMap.mappings);
+ });
+
+ exports['test .fromStringWithSourceMap() complex version'] = forEachNewline(function (assert, util, nl) {
+ var input = new SourceNode(null, null, null, [
+ "(function() {" + nl,
+ " var Test = {};" + nl,
+ " ", new SourceNode(1, 0, "a.js", "Test.A = { value: 1234 };" + nl),
+ " ", new SourceNode(2, 0, "a.js", "Test.A.x = 'xyz';"), nl,
+ "}());" + nl,
+ "/* Generated Source */"]);
+ input = input.toStringWithSourceMap({
+ file: 'foo.js'
+ });
+
+ var node = SourceNode.fromStringWithSourceMap(
+ input.code,
+ new SourceMapConsumer(input.map.toString()));
+
+ var result = node.toStringWithSourceMap({
+ file: 'foo.js'
+ });
+ var map = result.map;
+ var code = result.code;
+
+ assert.equal(code, input.code);
+ assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
+ map = map.toJSON();
+ var inputMap = input.map.toJSON();
+ util.assertEqualMaps(assert, map, inputMap);
+ });
+
+ exports['test .fromStringWithSourceMap() third argument'] = function (assert, util) {
+ // Assume the following directory structure:
+ //
+ // http://foo.org/
+ // bar.coffee
+ // app/
+ // coffee/
+ // foo.coffee
+ // coffeeBundle.js # Made from {foo,bar,baz}.coffee
+ // maps/
+ // coffeeBundle.js.map
+ // js/
+ // foo.js
+ // public/
+ // app.js # Made from {foo,coffeeBundle}.js
+ // app.js.map
+ //
+ // http://www.example.com/
+ // baz.coffee
+
+ var coffeeBundle = new SourceNode(1, 0, 'foo.coffee', 'foo(coffee);\n');
+ coffeeBundle.setSourceContent('foo.coffee', 'foo coffee');
+ coffeeBundle.add(new SourceNode(2, 0, '/bar.coffee', 'bar(coffee);\n'));
+ coffeeBundle.add(new SourceNode(3, 0, 'http://www.example.com/baz.coffee', 'baz(coffee);'));
+ coffeeBundle = coffeeBundle.toStringWithSourceMap({
+ file: 'foo.js',
+ sourceRoot: '..'
+ });
+
+ var foo = new SourceNode(1, 0, 'foo.js', 'foo(js);');
+
+ var test = function(relativePath, expectedSources) {
+ var app = new SourceNode();
+ app.add(SourceNode.fromStringWithSourceMap(
+ coffeeBundle.code,
+ new SourceMapConsumer(coffeeBundle.map.toString()),
+ relativePath));
+ app.add(foo);
+ var i = 0;
+ app.walk(function (chunk, loc) {
+ assert.equal(loc.source, expectedSources[i]);
+ i++;
+ });
+ app.walkSourceContents(function (sourceFile, sourceContent) {
+ assert.equal(sourceFile, expectedSources[0]);
+ assert.equal(sourceContent, 'foo coffee');
+ })
+ };
+
+ test('../coffee/maps', [
+ '../coffee/foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee',
+ 'foo.js'
+ ]);
+
+ // If the third parameter is omitted or set to the current working
+ // directory we get incorrect source paths:
+
+ test(undefined, [
+ '../foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee',
+ 'foo.js'
+ ]);
+
+ test('', [
+ '../foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee',
+ 'foo.js'
+ ]);
+
+ test('.', [
+ '../foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee',
+ 'foo.js'
+ ]);
+
+ test('./', [
+ '../foo.coffee',
+ '/bar.coffee',
+ 'http://www.example.com/baz.coffee',
+ 'foo.js'
+ ]);
+ };
+
+ exports['test .toStringWithSourceMap() merging duplicate mappings'] = forEachNewline(function (assert, util, nl) {
+ var input = new SourceNode(null, null, null, [
+ new SourceNode(1, 0, "a.js", "(function"),
+ new SourceNode(1, 0, "a.js", "() {" + nl),
+ " ",
+ new SourceNode(1, 0, "a.js", "var Test = "),
+ new SourceNode(1, 0, "b.js", "{};" + nl),
+ new SourceNode(2, 0, "b.js", "Test"),
+ new SourceNode(2, 0, "b.js", ".A", "A"),
+ new SourceNode(2, 20, "b.js", " = { value: ", "A"),
+ "1234",
+ new SourceNode(2, 40, "b.js", " };" + nl, "A"),
+ "}());" + nl,
+ "/* Generated Source */"
+ ]);
+ input = input.toStringWithSourceMap({
+ file: 'foo.js'
+ });
+
+ assert.equal(input.code, [
+ "(function() {",
+ " var Test = {};",
+ "Test.A = { value: 1234 };",
+ "}());",
+ "/* Generated Source */"
+ ].join(nl))
+
+ var correctMap = new SourceMapGenerator({
+ file: 'foo.js'
+ });
+ correctMap.addMapping({
+ generated: { line: 1, column: 0 },
+ source: 'a.js',
+ original: { line: 1, column: 0 }
+ });
+ // Here is no need for a empty mapping,
+ // because mappings ends at eol
+ correctMap.addMapping({
+ generated: { line: 2, column: 2 },
+ source: 'a.js',
+ original: { line: 1, column: 0 }
+ });
+ correctMap.addMapping({
+ generated: { line: 2, column: 13 },
+ source: 'b.js',
+ original: { line: 1, column: 0 }
+ });
+ correctMap.addMapping({
+ generated: { line: 3, column: 0 },
+ source: 'b.js',
+ original: { line: 2, column: 0 }
+ });
+ correctMap.addMapping({
+ generated: { line: 3, column: 4 },
+ source: 'b.js',
+ name: 'A',
+ original: { line: 2, column: 0 }
+ });
+ correctMap.addMapping({
+ generated: { line: 3, column: 6 },
+ source: 'b.js',
+ name: 'A',
+ original: { line: 2, column: 20 }
+ });
+ // This empty mapping is required,
+ // because there is a hole in the middle of the line
+ correctMap.addMapping({
+ generated: { line: 3, column: 18 }
+ });
+ correctMap.addMapping({
+ generated: { line: 3, column: 22 },
+ source: 'b.js',
+ name: 'A',
+ original: { line: 2, column: 40 }
+ });
+ // Here is no need for a empty mapping,
+ // because mappings ends at eol
+
+ var inputMap = input.map.toJSON();
+ correctMap = correctMap.toJSON();
+ util.assertEqualMaps(assert, inputMap, correctMap);
+ });
+
+ exports['test .toStringWithSourceMap() multi-line SourceNodes'] = forEachNewline(function (assert, util, nl) {
+ var input = new SourceNode(null, null, null, [
+ new SourceNode(1, 0, "a.js", "(function() {" + nl + "var nextLine = 1;" + nl + "anotherLine();" + nl),
+ new SourceNode(2, 2, "b.js", "Test.call(this, 123);" + nl),
+ new SourceNode(2, 2, "b.js", "this['stuff'] = 'v';" + nl),
+ new SourceNode(2, 2, "b.js", "anotherLine();" + nl),
+ "/*" + nl + "Generated" + nl + "Source" + nl + "*/" + nl,
+ new SourceNode(3, 4, "c.js", "anotherLine();" + nl),
+ "/*" + nl + "Generated" + nl + "Source" + nl + "*/"
+ ]);
+ input = input.toStringWithSourceMap({
+ file: 'foo.js'
+ });
+
+ assert.equal(input.code, [
+ "(function() {",
+ "var nextLine = 1;",
+ "anotherLine();",
+ "Test.call(this, 123);",
+ "this['stuff'] = 'v';",
+ "anotherLine();",
+ "/*",
+ "Generated",
+ "Source",
+ "*/",
+ "anotherLine();",
+ "/*",
+ "Generated",
+ "Source",
+ "*/"
+ ].join(nl));
+
+ var correctMap = new SourceMapGenerator({
+ file: 'foo.js'
+ });
+ correctMap.addMapping({
+ generated: { line: 1, column: 0 },
+ source: 'a.js',
+ original: { line: 1, column: 0 }
+ });
+ correctMap.addMapping({
+ generated: { line: 2, column: 0 },
+ source: 'a.js',
+ original: { line: 1, column: 0 }
+ });
+ correctMap.addMapping({
+ generated: { line: 3, column: 0 },
+ source: 'a.js',
+ original: { line: 1, column: 0 }
+ });
+ correctMap.addMapping({
+ generated: { line: 4, column: 0 },
+ source: 'b.js',
+ original: { line: 2, column: 2 }
+ });
+ correctMap.addMapping({
+ generated: { line: 5, column: 0 },
+ source: 'b.js',
+ original: { line: 2, column: 2 }
+ });
+ correctMap.addMapping({
+ generated: { line: 6, column: 0 },
+ source: 'b.js',
+ original: { line: 2, column: 2 }
+ });
+ correctMap.addMapping({
+ generated: { line: 11, column: 0 },
+ source: 'c.js',
+ original: { line: 3, column: 4 }
+ });
+
+ var inputMap = input.map.toJSON();
+ correctMap = correctMap.toJSON();
+ util.assertEqualMaps(assert, inputMap, correctMap);
+ });
+
+ exports['test .toStringWithSourceMap() with empty string'] = function (assert, util) {
+ var node = new SourceNode(1, 0, 'empty.js', '');
+ var result = node.toStringWithSourceMap();
+ assert.equal(result.code, '');
+ };
+
+ exports['test .toStringWithSourceMap() with consecutive newlines'] = forEachNewline(function (assert, util, nl) {
+ var input = new SourceNode(null, null, null, [
+ "/***/" + nl + nl,
+ new SourceNode(1, 0, "a.js", "'use strict';" + nl),
+ new SourceNode(2, 0, "a.js", "a();"),
+ ]);
+ input = input.toStringWithSourceMap({
+ file: 'foo.js'
+ });
+
+ assert.equal(input.code, [
+ "/***/",
+ "",
+ "'use strict';",
+ "a();",
+ ].join(nl));
+
+ var correctMap = new SourceMapGenerator({
+ file: 'foo.js'
+ });
+ correctMap.addMapping({
+ generated: { line: 3, column: 0 },
+ source: 'a.js',
+ original: { line: 1, column: 0 }
+ });
+ correctMap.addMapping({
+ generated: { line: 4, column: 0 },
+ source: 'a.js',
+ original: { line: 2, column: 0 }
+ });
+
+ var inputMap = input.map.toJSON();
+ correctMap = correctMap.toJSON();
+ util.assertEqualMaps(assert, inputMap, correctMap);
+ });
+
+ exports['test setSourceContent with toStringWithSourceMap'] = function (assert, util) {
+ var aNode = new SourceNode(1, 1, 'a.js', 'a');
+ aNode.setSourceContent('a.js', 'someContent');
+ var node = new SourceNode(null, null, null,
+ ['(function () {\n',
+ ' ', aNode,
+ ' ', new SourceNode(1, 1, 'b.js', 'b'),
+ '}());']);
+ node.setSourceContent('b.js', 'otherContent');
+ var map = node.toStringWithSourceMap({
+ file: 'foo.js'
+ }).map;
+
+ assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
+ map = new SourceMapConsumer(map.toString());
+
+ assert.equal(map.sources.length, 2);
+ assert.equal(map.sources[0], 'a.js');
+ assert.equal(map.sources[1], 'b.js');
+ assert.equal(map.sourcesContent.length, 2);
+ assert.equal(map.sourcesContent[0], 'someContent');
+ assert.equal(map.sourcesContent[1], 'otherContent');
+ };
+
+ exports['test walkSourceContents'] = function (assert, util) {
+ var aNode = new SourceNode(1, 1, 'a.js', 'a');
+ aNode.setSourceContent('a.js', 'someContent');
+ var node = new SourceNode(null, null, null,
+ ['(function () {\n',
+ ' ', aNode,
+ ' ', new SourceNode(1, 1, 'b.js', 'b'),
+ '}());']);
+ node.setSourceContent('b.js', 'otherContent');
+ var results = [];
+ node.walkSourceContents(function (sourceFile, sourceContent) {
+ results.push([sourceFile, sourceContent]);
+ });
+ assert.equal(results.length, 2);
+ assert.equal(results[0][0], 'a.js');
+ assert.equal(results[0][1], 'someContent');
+ assert.equal(results[1][0], 'b.js');
+ assert.equal(results[1][1], 'otherContent');
+ };
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/test-util.js b/node_modules/stylus/node_modules/source-map/test/source-map/test-util.js
new file mode 100644
index 00000000..997d1a26
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/test-util.js
@@ -0,0 +1,216 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var libUtil = require('../../lib/source-map/util');
+
+ exports['test urls'] = function (assert, util) {
+ var assertUrl = function (url) {
+ assert.equal(url, libUtil.urlGenerate(libUtil.urlParse(url)));
+ };
+ assertUrl('http://');
+ assertUrl('http://www.example.com');
+ assertUrl('http://user:pass@www.example.com');
+ assertUrl('http://www.example.com:80');
+ assertUrl('http://www.example.com/');
+ assertUrl('http://www.example.com/foo/bar');
+ assertUrl('http://www.example.com/foo/bar/');
+ assertUrl('http://user:pass@www.example.com:80/foo/bar/');
+
+ assertUrl('//');
+ assertUrl('//www.example.com');
+ assertUrl('file:///www.example.com');
+
+ assert.equal(libUtil.urlParse(''), null);
+ assert.equal(libUtil.urlParse('.'), null);
+ assert.equal(libUtil.urlParse('..'), null);
+ assert.equal(libUtil.urlParse('a'), null);
+ assert.equal(libUtil.urlParse('a/b'), null);
+ assert.equal(libUtil.urlParse('a//b'), null);
+ assert.equal(libUtil.urlParse('/a'), null);
+ assert.equal(libUtil.urlParse('data:foo,bar'), null);
+ };
+
+ exports['test normalize()'] = function (assert, util) {
+ assert.equal(libUtil.normalize('/..'), '/');
+ assert.equal(libUtil.normalize('/../'), '/');
+ assert.equal(libUtil.normalize('/../../../..'), '/');
+ assert.equal(libUtil.normalize('/../../../../a/b/c'), '/a/b/c');
+ assert.equal(libUtil.normalize('/a/b/c/../../../d/../../e'), '/e');
+
+ assert.equal(libUtil.normalize('..'), '..');
+ assert.equal(libUtil.normalize('../'), '../');
+ assert.equal(libUtil.normalize('../../a/'), '../../a/');
+ assert.equal(libUtil.normalize('a/..'), '.');
+ assert.equal(libUtil.normalize('a/../../..'), '../..');
+
+ assert.equal(libUtil.normalize('/.'), '/');
+ assert.equal(libUtil.normalize('/./'), '/');
+ assert.equal(libUtil.normalize('/./././.'), '/');
+ assert.equal(libUtil.normalize('/././././a/b/c'), '/a/b/c');
+ assert.equal(libUtil.normalize('/a/b/c/./././d/././e'), '/a/b/c/d/e');
+
+ assert.equal(libUtil.normalize(''), '.');
+ assert.equal(libUtil.normalize('.'), '.');
+ assert.equal(libUtil.normalize('./'), '.');
+ assert.equal(libUtil.normalize('././a'), 'a');
+ assert.equal(libUtil.normalize('a/./'), 'a/');
+ assert.equal(libUtil.normalize('a/././.'), 'a');
+
+ assert.equal(libUtil.normalize('/a/b//c////d/////'), '/a/b/c/d/');
+ assert.equal(libUtil.normalize('///a/b//c////d/////'), '///a/b/c/d/');
+ assert.equal(libUtil.normalize('a/b//c////d'), 'a/b/c/d');
+
+ assert.equal(libUtil.normalize('.///.././../a/b//./..'), '../../a')
+
+ assert.equal(libUtil.normalize('http://www.example.com'), 'http://www.example.com');
+ assert.equal(libUtil.normalize('http://www.example.com/'), 'http://www.example.com/');
+ assert.equal(libUtil.normalize('http://www.example.com/./..//a/b/c/.././d//'), 'http://www.example.com/a/b/d/');
+ };
+
+ exports['test join()'] = function (assert, util) {
+ assert.equal(libUtil.join('a', 'b'), 'a/b');
+ assert.equal(libUtil.join('a/', 'b'), 'a/b');
+ assert.equal(libUtil.join('a//', 'b'), 'a/b');
+ assert.equal(libUtil.join('a', 'b/'), 'a/b/');
+ assert.equal(libUtil.join('a', 'b//'), 'a/b/');
+ assert.equal(libUtil.join('a/', '/b'), '/b');
+ assert.equal(libUtil.join('a//', '//b'), '//b');
+
+ assert.equal(libUtil.join('a', '..'), '.');
+ assert.equal(libUtil.join('a', '../b'), 'b');
+ assert.equal(libUtil.join('a/b', '../c'), 'a/c');
+
+ assert.equal(libUtil.join('a', '.'), 'a');
+ assert.equal(libUtil.join('a', './b'), 'a/b');
+ assert.equal(libUtil.join('a/b', './c'), 'a/b/c');
+
+ assert.equal(libUtil.join('a', 'http://www.example.com'), 'http://www.example.com');
+ assert.equal(libUtil.join('a', 'data:foo,bar'), 'data:foo,bar');
+
+
+ assert.equal(libUtil.join('', 'b'), 'b');
+ assert.equal(libUtil.join('.', 'b'), 'b');
+ assert.equal(libUtil.join('', 'b/'), 'b/');
+ assert.equal(libUtil.join('.', 'b/'), 'b/');
+ assert.equal(libUtil.join('', 'b//'), 'b/');
+ assert.equal(libUtil.join('.', 'b//'), 'b/');
+
+ assert.equal(libUtil.join('', '..'), '..');
+ assert.equal(libUtil.join('.', '..'), '..');
+ assert.equal(libUtil.join('', '../b'), '../b');
+ assert.equal(libUtil.join('.', '../b'), '../b');
+
+ assert.equal(libUtil.join('', '.'), '.');
+ assert.equal(libUtil.join('.', '.'), '.');
+ assert.equal(libUtil.join('', './b'), 'b');
+ assert.equal(libUtil.join('.', './b'), 'b');
+
+ assert.equal(libUtil.join('', 'http://www.example.com'), 'http://www.example.com');
+ assert.equal(libUtil.join('.', 'http://www.example.com'), 'http://www.example.com');
+ assert.equal(libUtil.join('', 'data:foo,bar'), 'data:foo,bar');
+ assert.equal(libUtil.join('.', 'data:foo,bar'), 'data:foo,bar');
+
+
+ assert.equal(libUtil.join('..', 'b'), '../b');
+ assert.equal(libUtil.join('..', 'b/'), '../b/');
+ assert.equal(libUtil.join('..', 'b//'), '../b/');
+
+ assert.equal(libUtil.join('..', '..'), '../..');
+ assert.equal(libUtil.join('..', '../b'), '../../b');
+
+ assert.equal(libUtil.join('..', '.'), '..');
+ assert.equal(libUtil.join('..', './b'), '../b');
+
+ assert.equal(libUtil.join('..', 'http://www.example.com'), 'http://www.example.com');
+ assert.equal(libUtil.join('..', 'data:foo,bar'), 'data:foo,bar');
+
+
+ assert.equal(libUtil.join('a', ''), 'a');
+ assert.equal(libUtil.join('a', '.'), 'a');
+ assert.equal(libUtil.join('a/', ''), 'a');
+ assert.equal(libUtil.join('a/', '.'), 'a');
+ assert.equal(libUtil.join('a//', ''), 'a');
+ assert.equal(libUtil.join('a//', '.'), 'a');
+ assert.equal(libUtil.join('/a', ''), '/a');
+ assert.equal(libUtil.join('/a', '.'), '/a');
+ assert.equal(libUtil.join('', ''), '.');
+ assert.equal(libUtil.join('.', ''), '.');
+ assert.equal(libUtil.join('.', ''), '.');
+ assert.equal(libUtil.join('.', '.'), '.');
+ assert.equal(libUtil.join('..', ''), '..');
+ assert.equal(libUtil.join('..', '.'), '..');
+ assert.equal(libUtil.join('http://foo.org/a', ''), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org/a', '.'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org/a/', ''), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org/a/', '.'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org/a//', ''), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org/a//', '.'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org', ''), 'http://foo.org/');
+ assert.equal(libUtil.join('http://foo.org', '.'), 'http://foo.org/');
+ assert.equal(libUtil.join('http://foo.org/', ''), 'http://foo.org/');
+ assert.equal(libUtil.join('http://foo.org/', '.'), 'http://foo.org/');
+ assert.equal(libUtil.join('http://foo.org//', ''), 'http://foo.org/');
+ assert.equal(libUtil.join('http://foo.org//', '.'), 'http://foo.org/');
+ assert.equal(libUtil.join('//www.example.com', ''), '//www.example.com/');
+ assert.equal(libUtil.join('//www.example.com', '.'), '//www.example.com/');
+
+
+ assert.equal(libUtil.join('http://foo.org/a', 'b'), 'http://foo.org/a/b');
+ assert.equal(libUtil.join('http://foo.org/a/', 'b'), 'http://foo.org/a/b');
+ assert.equal(libUtil.join('http://foo.org/a//', 'b'), 'http://foo.org/a/b');
+ assert.equal(libUtil.join('http://foo.org/a', 'b/'), 'http://foo.org/a/b/');
+ assert.equal(libUtil.join('http://foo.org/a', 'b//'), 'http://foo.org/a/b/');
+ assert.equal(libUtil.join('http://foo.org/a/', '/b'), 'http://foo.org/b');
+ assert.equal(libUtil.join('http://foo.org/a//', '//b'), 'http://b');
+
+ assert.equal(libUtil.join('http://foo.org/a', '..'), 'http://foo.org/');
+ assert.equal(libUtil.join('http://foo.org/a', '../b'), 'http://foo.org/b');
+ assert.equal(libUtil.join('http://foo.org/a/b', '../c'), 'http://foo.org/a/c');
+
+ assert.equal(libUtil.join('http://foo.org/a', '.'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org/a', './b'), 'http://foo.org/a/b');
+ assert.equal(libUtil.join('http://foo.org/a/b', './c'), 'http://foo.org/a/b/c');
+
+ assert.equal(libUtil.join('http://foo.org/a', 'http://www.example.com'), 'http://www.example.com');
+ assert.equal(libUtil.join('http://foo.org/a', 'data:foo,bar'), 'data:foo,bar');
+
+
+ assert.equal(libUtil.join('http://foo.org', 'a'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org/', 'a'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org//', 'a'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org', '/a'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org/', '/a'), 'http://foo.org/a');
+ assert.equal(libUtil.join('http://foo.org//', '/a'), 'http://foo.org/a');
+
+
+ assert.equal(libUtil.join('http://', 'www.example.com'), 'http://www.example.com');
+ assert.equal(libUtil.join('file:///', 'www.example.com'), 'file:///www.example.com');
+ assert.equal(libUtil.join('http://', 'ftp://example.com'), 'ftp://example.com');
+
+ assert.equal(libUtil.join('http://www.example.com', '//foo.org/bar'), 'http://foo.org/bar');
+ assert.equal(libUtil.join('//www.example.com', '//foo.org/bar'), '//foo.org/bar');
+ };
+
+ // TODO Issue #128: Define and test this function properly.
+ exports['test relative()'] = function (assert, util) {
+ assert.equal(libUtil.relative('/the/root', '/the/root/one.js'), 'one.js');
+ assert.equal(libUtil.relative('/the/root', '/the/rootone.js'), '/the/rootone.js');
+
+ assert.equal(libUtil.relative('', '/the/root/one.js'), '/the/root/one.js');
+ assert.equal(libUtil.relative('.', '/the/root/one.js'), '/the/root/one.js');
+ assert.equal(libUtil.relative('', 'the/root/one.js'), 'the/root/one.js');
+ assert.equal(libUtil.relative('.', 'the/root/one.js'), 'the/root/one.js');
+
+ assert.equal(libUtil.relative('/', '/the/root/one.js'), 'the/root/one.js');
+ assert.equal(libUtil.relative('/', 'the/root/one.js'), 'the/root/one.js');
+ };
+
+});
diff --git a/node_modules/stylus/node_modules/source-map/test/source-map/util.js b/node_modules/stylus/node_modules/source-map/test/source-map/util.js
new file mode 100644
index 00000000..56bbe2c3
--- /dev/null
+++ b/node_modules/stylus/node_modules/source-map/test/source-map/util.js
@@ -0,0 +1,192 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+if (typeof define !== 'function') {
+ var define = require('amdefine')(module, require);
+}
+define(function (require, exports, module) {
+
+ var util = require('../../lib/source-map/util');
+
+ // This is a test mapping which maps functions from two different files
+ // (one.js and two.js) to a minified generated source.
+ //
+ // Here is one.js:
+ //
+ // ONE.foo = function (bar) {
+ // return baz(bar);
+ // };
+ //
+ // Here is two.js:
+ //
+ // TWO.inc = function (n) {
+ // return n + 1;
+ // };
+ //
+ // And here is the generated code (min.js):
+ //
+ // ONE.foo=function(a){return baz(a);};
+ // TWO.inc=function(a){return a+1;};
+ exports.testGeneratedCode = " ONE.foo=function(a){return baz(a);};\n"+
+ " TWO.inc=function(a){return a+1;};";
+ exports.testMap = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['one.js', 'two.js'],
+ sourceRoot: '/the/root',
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+ };
+ exports.testMapNoSourceRoot = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['one.js', 'two.js'],
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+ };
+ exports.testMapEmptySourceRoot = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['one.js', 'two.js'],
+ sourceRoot: '',
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+ };
+ exports.testMapWithSourcesContent = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['one.js', 'two.js'],
+ sourcesContent: [
+ ' ONE.foo = function (bar) {\n' +
+ ' return baz(bar);\n' +
+ ' };',
+ ' TWO.inc = function (n) {\n' +
+ ' return n + 1;\n' +
+ ' };'
+ ],
+ sourceRoot: '/the/root',
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+ };
+ exports.testMapRelativeSources = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['./one.js', './two.js'],
+ sourcesContent: [
+ ' ONE.foo = function (bar) {\n' +
+ ' return baz(bar);\n' +
+ ' };',
+ ' TWO.inc = function (n) {\n' +
+ ' return n + 1;\n' +
+ ' };'
+ ],
+ sourceRoot: '/the/root',
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+ };
+ exports.emptyMap = {
+ version: 3,
+ file: 'min.js',
+ names: [],
+ sources: [],
+ mappings: ''
+ };
+
+
+ function assertMapping(generatedLine, generatedColumn, originalSource,
+ originalLine, originalColumn, name, map, assert,
+ dontTestGenerated, dontTestOriginal) {
+ if (!dontTestOriginal) {
+ var origMapping = map.originalPositionFor({
+ line: generatedLine,
+ column: generatedColumn
+ });
+ assert.equal(origMapping.name, name,
+ 'Incorrect name, expected ' + JSON.stringify(name)
+ + ', got ' + JSON.stringify(origMapping.name));
+ assert.equal(origMapping.line, originalLine,
+ 'Incorrect line, expected ' + JSON.stringify(originalLine)
+ + ', got ' + JSON.stringify(origMapping.line));
+ assert.equal(origMapping.column, originalColumn,
+ 'Incorrect column, expected ' + JSON.stringify(originalColumn)
+ + ', got ' + JSON.stringify(origMapping.column));
+
+ var expectedSource;
+
+ if (originalSource && map.sourceRoot && originalSource.indexOf(map.sourceRoot) === 0) {
+ expectedSource = originalSource;
+ } else if (originalSource) {
+ expectedSource = map.sourceRoot
+ ? util.join(map.sourceRoot, originalSource)
+ : originalSource;
+ } else {
+ expectedSource = null;
+ }
+
+ assert.equal(origMapping.source, expectedSource,
+ 'Incorrect source, expected ' + JSON.stringify(expectedSource)
+ + ', got ' + JSON.stringify(origMapping.source));
+ }
+
+ if (!dontTestGenerated) {
+ var genMapping = map.generatedPositionFor({
+ source: originalSource,
+ line: originalLine,
+ column: originalColumn
+ });
+ assert.equal(genMapping.line, generatedLine,
+ 'Incorrect line, expected ' + JSON.stringify(generatedLine)
+ + ', got ' + JSON.stringify(genMapping.line));
+ assert.equal(genMapping.column, generatedColumn,
+ 'Incorrect column, expected ' + JSON.stringify(generatedColumn)
+ + ', got ' + JSON.stringify(genMapping.column));
+ }
+ }
+ exports.assertMapping = assertMapping;
+
+ function assertEqualMaps(assert, actualMap, expectedMap) {
+ assert.equal(actualMap.version, expectedMap.version, "version mismatch");
+ assert.equal(actualMap.file, expectedMap.file, "file mismatch");
+ assert.equal(actualMap.names.length,
+ expectedMap.names.length,
+ "names length mismatch: " +
+ actualMap.names.join(", ") + " != " + expectedMap.names.join(", "));
+ for (var i = 0; i < actualMap.names.length; i++) {
+ assert.equal(actualMap.names[i],
+ expectedMap.names[i],
+ "names[" + i + "] mismatch: " +
+ actualMap.names.join(", ") + " != " + expectedMap.names.join(", "));
+ }
+ assert.equal(actualMap.sources.length,
+ expectedMap.sources.length,
+ "sources length mismatch: " +
+ actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", "));
+ for (var i = 0; i < actualMap.sources.length; i++) {
+ assert.equal(actualMap.sources[i],
+ expectedMap.sources[i],
+ "sources[" + i + "] length mismatch: " +
+ actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", "));
+ }
+ assert.equal(actualMap.sourceRoot,
+ expectedMap.sourceRoot,
+ "sourceRoot mismatch: " +
+ actualMap.sourceRoot + " != " + expectedMap.sourceRoot);
+ assert.equal(actualMap.mappings, expectedMap.mappings,
+ "mappings mismatch:\nActual: " + actualMap.mappings + "\nExpected: " + expectedMap.mappings);
+ if (actualMap.sourcesContent) {
+ assert.equal(actualMap.sourcesContent.length,
+ expectedMap.sourcesContent.length,
+ "sourcesContent length mismatch");
+ for (var i = 0; i < actualMap.sourcesContent.length; i++) {
+ assert.equal(actualMap.sourcesContent[i],
+ expectedMap.sourcesContent[i],
+ "sourcesContent[" + i + "] mismatch");
+ }
+ }
+ }
+ exports.assertEqualMaps = assertEqualMaps;
+
+});
diff --git a/node_modules/stylus/package.json b/node_modules/stylus/package.json
new file mode 100644
index 00000000..fe29e9b2
--- /dev/null
+++ b/node_modules/stylus/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "stylus",
+ "description": "Robust, expressive, and feature-rich CSS superset",
+ "version": "0.54.5",
+ "author": "TJ Holowaychuk <tj@vision-media.ca>",
+ "keywords": [
+ "css",
+ "parser",
+ "style",
+ "stylesheets",
+ "jade",
+ "language"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/stylus/stylus"
+ },
+ "main": "./index.js",
+ "browserify": "./lib/browserify.js",
+ "engines": {
+ "node": "*"
+ },
+ "bin": {
+ "stylus": "./bin/stylus"
+ },
+ "scripts": {
+ "prepublish": "npm prune",
+ "test": "mocha test/ test/middleware/ --require should --bail --check-leaks --reporter dot",
+ "test-cov": "mocha test/ test/middleware/ --require should --bail --reporter html-cov > coverage.html"
+ },
+ "dependencies": {
+ "css-parse": "1.7.x",
+ "mkdirp": "0.5.x",
+ "debug": "*",
+ "sax": "0.5.x",
+ "glob": "7.0.x",
+ "source-map": "0.1.x"
+ },
+ "devDependencies": {
+ "should": "8.x",
+ "mocha": "*",
+ "jscoverage": "0.3.8"
+ },
+ "bugs": {
+ "url": "https://github.com/stylus/stylus/issues"
+ },
+ "homepage": "https://github.com/stylus/stylus",
+ "directories": {
+ "doc": "docs",
+ "example": "examples",
+ "test": "test"
+ },
+ "license": "MIT"
+}